设置vite.config.ts 需要安装postcss-px-to-viewport 插件
然后在根目录下创建style-px-to-vw.js或者ts文件
style-px-to-vw.js代码如下
let defaultsProp = {
unitToConvert: "px",
viewportWidth: 3840,
unitPrecision: 5,
viewportUnit: "vw",
fontViewportUnit: "vw",
minPixelValue: 1,
};
function toFixed(number, precision) {
var multiplier = Math.pow(10, precision + 1),
wholeNumber = Math.floor(number * multiplier);
return (Math.round(wholeNumber / 10) * 10) / multiplier;
}
function createPxReplace(
viewportSize,
minPixelValue,
unitPrecision,
viewportUnit
) {
return function ($0, $1) {
if (!$1) return;
var pixels = parseFloat($1);
if (pixels <= minPixelValue) return;
return toFixed((pixels / viewportSize) * 100, unitPrecision) + viewportUnit;
};
}
const templateReg = /<template>([\s\S]+)<\/template>/gi;
const pxGlobalReg = /(\d+)px/gi;
const pluginGenerator = (customOptions = defaultsProp) => {
return {
name: "postcss-px-to-viewport",
async transform(code, id) {
let _source = "";
if (/.vue$/.test(id)) {
let _source = "";
if (templateReg.test(code)) {
_source = code.match(templateReg)[0];
}
if (pxGlobalReg.test(_source)) {
let $_source = _source.replace(
pxGlobalReg,
createPxReplace(
customOptions.viewportWidth,
customOptions.minPixelValue,
customOptions.unitPrecision,
customOptions.viewportUnit
)
);
code = code.replace(_source, $_source);
}
}
return { code };
},
};
};
export default pluginGenerator;
vite.config.ts中的设置
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import { resolve, join } from 'path';
export default defineConfig({
base: './',
plugins: [vue()],
resolve: {
alias: {
'@': resolve(join(__dirname, 'src'))
}
}
});