UNPKG

@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
'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;