@varlinor/builder-vue2
Version:
This package provides a set of Rollup and Vite configurations and utility functions tailored for Vue.js development environments, focusing on simplifying the build process for front-end development. It includes modules for configuring Rollup and Vite for
277 lines (270 loc) • 8.54 kB
JavaScript
'use strict';
const path = require('path');
const json = require('@rollup/plugin-json');
const rollupCommonjs = require('@rollup/plugin-commonjs');
const pluginNodeResolve = require('@rollup/plugin-node-resolve');
const alias = require('@rollup/plugin-alias');
const vuePlugin = require('rollup-plugin-vue');
const rollupUrl = require('@rollup/plugin-url');
const replacePlugin = require('@rollup/plugin-replace');
const pluginBabel = require('@rollup/plugin-babel');
const postcss = require('rollup-plugin-postcss');
const postcssUrl = require('postcss-url');
const autoprefixer = require('autoprefixer');
const cssnano = require('cssnano');
const lodashEs = require('lodash-es');
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e.default : e; }
const path__default = /*#__PURE__*/_interopDefaultCompat(path);
const json__default = /*#__PURE__*/_interopDefaultCompat(json);
const rollupCommonjs__default = /*#__PURE__*/_interopDefaultCompat(rollupCommonjs);
const alias__default = /*#__PURE__*/_interopDefaultCompat(alias);
const vuePlugin__default = /*#__PURE__*/_interopDefaultCompat(vuePlugin);
const rollupUrl__default = /*#__PURE__*/_interopDefaultCompat(rollupUrl);
const replacePlugin__default = /*#__PURE__*/_interopDefaultCompat(replacePlugin);
const postcss__default = /*#__PURE__*/_interopDefaultCompat(postcss);
const postcssUrl__default = /*#__PURE__*/_interopDefaultCompat(postcssUrl);
const autoprefixer__default = /*#__PURE__*/_interopDefaultCompat(autoprefixer);
const cssnano__default = /*#__PURE__*/_interopDefaultCompat(cssnano);
const DEFAULT_EXTENSIONS = [".ts", ".tsx", ".mjs", ".cjs", ".js", ".jsx", ".json", ".vue"];
const DEFAULT_REPLACE_OPTIONS = {
preventAssignment: true
};
const DEFAULT_BABEL_OPTIONS = {
exclude: "node_modules/**",
extensions: DEFAULT_EXTENSIONS,
babelHelpers: "bundled",
presets: [
"@vue/babel-preset-jsx"
/* [
'@babel/preset-env',
{
useBuiltIns: 'usage',
corejs: '3.31.1'
}
] */
]
};
const DEFAULT_EXTERNALS = [
"fs",
"path",
"events",
"child_process",
"util",
"os",
"process",
"readline",
"commander",
"shelljs",
"chalk",
"promise",
"bluebird",
"axios",
"element-ui",
"sortablejs",
"vue",
"vue-i18n",
"vuex",
"vue-router",
"nprogress",
"nprogress/nprogress.css",
"qs"
];
const DEFAULT_IMG_SIZE = 1 * 1024 * 1024;
function formatRollupOptions(opts = {}) {
let replaceOpts = { ...DEFAULT_REPLACE_OPTIONS };
if (opts.replace || opts.rollup && opts.rollup.replace) {
replaceOpts = {
...DEFAULT_REPLACE_OPTIONS,
...opts.rollup.replace,
values: {
...opts.replace,
...opts.rollup.replace.values
}
};
}
let resolveOpts = {
extensions: DEFAULT_EXTENSIONS
};
if (opts.resolve) {
resolveOpts = { extensions: DEFAULT_EXTENSIONS, ...opts.resolve };
}
const pluginArr = [
replacePlugin__default(replaceOpts),
alias__default(opts.alias),
pluginNodeResolve.nodeResolve(resolveOpts),
json__default(),
rollupCommonjs__default()
];
if (!opts.notVue) {
pluginArr.push(
vuePlugin__default({
css: true,
style: {
// 处理sfc中style段的内容,但是不干涉script中 import的css文件
postcssOptions: {
extract: false,
minimize: true,
sourceMap: false
},
postcssPlugins: [
postcssUrl__default({
url: "inline",
maxSize: DEFAULT_IMG_SIZE / 1024
// 单位是kb
}),
autoprefixer__default({
cascade: false,
remove: false
}),
cssnano__default()
]
},
template: {
isProduction: true
}
}),
rollupUrl__default({
// 处理sfc中script段里的import 图片
limit: DEFAULT_IMG_SIZE
}),
postcss__default({
// 处理剩余的,例如 script段中的css文件的import
extract: false,
inject: true,
minimize: true,
sourceMap: false,
//extensions: ['.css', '.scss', '.less'],
plugins: [
postcssUrl__default({
url: "inline",
maxSize: 0
//DEFAULT_IMG_SIZE / 1024 // 单位是kb
}),
autoprefixer__default({
cascade: false,
remove: false
}),
cssnano__default()
]
})
);
}
pluginArr.push(pluginBabel.babel(DEFAULT_BABEL_OPTIONS));
const rollupOpts = {
input: opts.input,
output: opts.output,
plugins: pluginArr,
external: opts.externals ? [...DEFAULT_EXTERNALS, ...opts.externals] : DEFAULT_EXTERNALS,
onwarn(warning, rollupWarn) {
if (warning.code === "THIS_IS_UNDEFINED")
return;
rollupWarn(warning);
}
};
return rollupOpts;
}
const DEF_SEPARATER = "/";
function createBuildOptions(taskInfos = [], commonOpts) {
const taskOpts = [];
if (Array.isArray(taskInfos)) {
taskInfos.forEach((info) => {
const cTask = formatRollupOptions({ ...commonOpts, ...info });
taskOpts.push(cTask);
});
}
return taskOpts;
}
function mergePath(basePath, subPath, separater = DEF_SEPARATER) {
let i = 0, j = 0;
const base = basePath.split(separater), sub = subPath.split(separater);
while (i < base.length && j < sub.length) {
if (base[i] === sub[j]) {
i++;
j++;
} else {
i++;
j = 0;
}
}
const tmp = [...base];
if (j > 0) {
tmp.splice(i - j, j);
}
const mergedArray = [...tmp, ...sub];
const realPath = mergedArray.join(separater);
return realPath;
}
function preparePackageBuildOptions(comDefines, distDir, format = "es", rollupOpts = {}) {
return createPackObj(comDefines, distDir, format, rollupOpts);
}
function preparePackageBuildOptionsOnlyJS(fileArr, distDir, format = "es", rollupOpts = {}) {
return createPackObjForJS(fileArr, distDir, format, rollupOpts);
}
function createPackObj(comDefines, distDir, format = "es", rollupOpts = {}) {
const taskInfos = [];
if (Array.isArray(comDefines)) {
const curRootDir = process.cwd().replace(/\\/g, DEF_SEPARATER);
comDefines.forEach((com) => {
const { filename, importPath, exportName, packageName, basedir, hasInstall, outputFileName } = com;
basedir.split(DEF_SEPARATER);
const entryFilePath = mergePath(curRootDir, basedir, DEF_SEPARATER);
const inputFile = `${entryFilePath}/${filename}`;
let outputPrefix = "";
if (basedir.indexOf("src/") > -1) {
outputPrefix = basedir.substring(basedir.indexOf("src/") + 4);
}
const outputBase = `${distDir}/${outputPrefix}`;
let fName = filename, tmpF = lodashEs.toLower(filename);
if (lodashEs.endsWith(tmpF, ".js") && fName.length > 3) {
fName = fName.slice(0, -3);
} else if (lodashEs.endsWith(tmpF, ".vue") && fName.length > 4) {
fName = fName.slice(0, -4);
}
taskInfos.push({
input: inputFile,
output: {
dir: outputBase,
format,
entryFileNames: `${outputFileName ? outputFileName : fName}.js`
},
outdir: outputBase
});
});
const tasks = createBuildOptions(taskInfos, rollupOpts);
return tasks;
}
return null;
}
function createPackObjForJS(fileArr, distDir, format = "es", rollupOpts = {}) {
const taskInfos = [];
if (Array.isArray(fileArr)) {
const curRootDir = process.cwd().replace(/\\/g, DEF_SEPARATER);
fileArr.forEach((file) => {
const { name, input } = file;
const inputFile = `${curRootDir}/${input.replace(/\\/g, DEF_SEPARATER)}`;
const outputBase = path__default.join(curRootDir, distDir).replace(/\\/g, DEF_SEPARATER);
taskInfos.push({
input: inputFile,
output: {
dir: outputBase,
format,
entryFileNames: `${name}.js`
},
outdir: outputBase
});
});
const localRollupOpts = {
...rollupOpts,
notVue: true
// 非vue文件打包
};
const tasks = createBuildOptions(taskInfos, localRollupOpts);
return tasks;
}
return null;
}
exports.createBuildOptions = createBuildOptions;
exports.createPackObj = createPackObj;
exports.createPackObjForJS = createPackObjForJS;
exports.preparePackageBuildOptions = preparePackageBuildOptions;
exports.preparePackageBuildOptionsOnlyJS = preparePackageBuildOptionsOnlyJS;