uni-plugin-light
Version:
uni-app相关插件、loader及webpack基础配置
773 lines (740 loc) • 31.2 kB
JavaScript
;
Object.defineProperty(exports, '__esModule', { value: true });
var fs = require('fs');
var path = require('path');
var tComm = require('t-comm');
var FileManagerPlugin = require('filemanager-webpack-plugin');
var webpackBundleAnalyzer = require('webpack-bundle-analyzer');
var PrerenderSpaPlugin = require('prerender-spa-plugin');
var HooksScriptPlugin = require('webpack-hooks-shellscripts');
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
function _interopNamespace(e) {
if (e && e.__esModule) return e;
var n = Object.create(null);
if (e) {
Object.keys(e).forEach(function (k) {
if (k !== 'default') {
var d = Object.getOwnPropertyDescriptor(e, k);
Object.defineProperty(n, k, d.get ? d : {
enumerable: true,
get: function () { return e[k]; }
});
}
});
}
n["default"] = e;
return Object.freeze(n);
}
var fs__namespace = /*#__PURE__*/_interopNamespace(fs);
var path__namespace = /*#__PURE__*/_interopNamespace(path);
var FileManagerPlugin__default = /*#__PURE__*/_interopDefaultLegacy(FileManagerPlugin);
var PrerenderSpaPlugin__default = /*#__PURE__*/_interopDefaultLegacy(PrerenderSpaPlugin);
var HooksScriptPlugin__default = /*#__PURE__*/_interopDefaultLegacy(HooksScriptPlugin);
function _typeof(o) {
"@babel/helpers - typeof";
return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) {
return typeof o;
} : function (o) {
return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o;
}, _typeof(o);
}
function _toPrimitive(input, hint) {
if (_typeof(input) !== "object" || input === null) return input;
var prim = input[Symbol.toPrimitive];
if (prim !== undefined) {
var res = prim.call(input, hint || "default");
if (_typeof(res) !== "object") return res;
throw new TypeError("@@toPrimitive must return a primitive value.");
}
return (hint === "string" ? String : Number)(input);
}
function _toPropertyKey(arg) {
var key = _toPrimitive(arg, "string");
return _typeof(key) === "symbol" ? key : String(key);
}
function _defineProperty(obj, key, value) {
key = _toPropertyKey(key);
if (key in obj) {
Object.defineProperty(obj, key, {
value: value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key] = value;
}
return obj;
}
function _arrayLikeToArray(arr, len) {
if (len == null || len > arr.length) len = arr.length;
for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
return arr2;
}
function _arrayWithoutHoles(arr) {
if (Array.isArray(arr)) return _arrayLikeToArray(arr);
}
function _iterableToArray(iter) {
if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
}
function _unsupportedIterableToArray(o, minLen) {
if (!o) return;
if (typeof o === "string") return _arrayLikeToArray(o, minLen);
var n = Object.prototype.toString.call(o).slice(8, -1);
if (n === "Object" && o.constructor) n = o.constructor.name;
if (n === "Map" || n === "Set") return Array.from(o);
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
}
function _nonIterableSpread() {
throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _toConsumableArray(arr) {
return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();
}
/* eslint-disable no-prototype-builtins */
/**
* Execute html action
*
* @param {Object} command - Command data for given action
* @return {Function|null} - Function that returns a promise or null
* @ignore
*/
function htmlAction(command, options) {
var verbose = options.verbose;
if (!command.source || !command.destination) {
if (verbose) {
console.log(' - HtmlModifyPlugin: Warning - parameter has to be formatted as follows: { source: <string>, destination: <string> }');
}
return null;
}
return function () {
return new Promise(function (resolve, reject) {
fs__namespace.lstat(command.destination, function (dErr, dStats) {
if (dErr || !dStats.isFile()) {
return reject(dErr);
}
var htmlString = '';
var htmlLine = [];
if (command.ssr || dErr) {
// ssr取源文件为模板。模板文件不存在也取源文件为模板。
htmlString = fs__namespace.readFileSync(command.source, 'utf-8');
} else {
htmlString = fs__namespace.readFileSync(command.destination, 'utf-8');
}
htmlLine = htmlString.split('\n');
// 修改html:匹配<body>字符串,替换为 <body>...
var injectHtml = '<style>[v-cloak] {display: none;}</style>' + '\n';
if (!command.ssr) {
if (htmlString.indexOf('<div id=\'app\'') == -1 && htmlString.indexOf('<div id="app"') == -1) {
injectHtml += '<div id=\'app\'></div>' + '\n';
}
injectHtml += "\n<script>\n window.__serverFailed = 0;\n window.__breakerTime = 0;\n</script>";
// 静态版本这两个也用于熔断保护,由熔断机制动态替换其值
} else {
injectHtml += '<!--vue-ssr-outlet-->' + '\n';
injectHtml += "\n<script>\n window.__serverCount = {{__serverCount||0}};\n window.__serverFailed = {{__serverFailed||0}};\n window.__breakerTime = {{__breakerTime||0}};\n</script>";
}
for (var i in command.urls) {
injectHtml += "<script src='".concat(command.urls[i], "'></script>") + '\n';
}
injectHtml += "<script>window.igameVersion = { version: ".concat(new Date().getTime(), ", author: '").concat(tComm.getGitAuthor(), "' };</script>");
var injectPrefetch = '';
var prefetchInjected = false;
if (Array.isArray(command.prefetchList)) {
command.prefetchList.map(function (item) {
injectPrefetch += "<link rel=\"dns-prefetch\" href=\"".concat(item, "\">") + '\n';
injectPrefetch += "<link rel=\"preconnect\" href=\"".concat(item, "\" crossorigin>") + '\n';
});
}
for (var _i in htmlLine) {
if (htmlLine[_i].indexOf('<link') > -1 && injectPrefetch && !prefetchInjected) {
prefetchInjected = true;
// eslint-disable-next-line no-loop-func
htmlLine[_i] = htmlLine[_i].replace(/<link.*>/, function (a) {
return "".concat(a, "\n").concat(injectPrefetch);
});
}
if (htmlLine[_i].indexOf('<body>') > -1) {
htmlLine[_i] = htmlLine[_i].replace('<body>', "<body>\n".concat(injectHtml));
}
if (command.ssr && htmlLine[_i].indexOf('<title>') > -1) {
// 多页面标题可变
htmlLine[_i] = htmlLine[_i].replace(/<title>.*?<\/title>/, '<title>{{title}}</title>');
}
}
fs__namespace.writeFileSync(command.destination, htmlLine.join('\n'), 'utf-8');
resolve(1);
});
});
};
}
var classCallCheck = function classCallCheck(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError('Cannot call a class as a function');
}
};
var createClass = function () {
function defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ('value' in descriptor) descriptor.writable = true;
Object.defineProperty(target, descriptor.key, descriptor);
}
}
return function (Constructor, protoProps, staticProps) {
if (protoProps) defineProperties(Constructor.prototype, protoProps);
if (staticProps) defineProperties(Constructor, staticProps);
return Constructor;
};
}();
var toConsumableArray = function toConsumableArray(arr) {
if (Array.isArray(arr)) {
var arr2 = Array(arr.length);
for (var i = 0; i < arr.length; i++) {
arr2[i] = arr[i];
}
return arr2;
}
return Array.from(arr);
};
var HtmlModifyPlugin = function () {
function HtmlModifyPlugin(options) {
// @ts-ignore
classCallCheck(this, HtmlModifyPlugin);
// @ts-ignore
this.options = this.setOptions(options);
}
createClass(HtmlModifyPlugin, [{
key: 'setOptions',
value: function setOptions(userOptions) {
var defaultOptions = {
verbose: false,
moveWithMkdirp: false,
onStart: {},
onEnd: {}
};
for (var key in defaultOptions) {
if (userOptions.hasOwnProperty(key)) {
defaultOptions[key] = userOptions[key];
}
}
return defaultOptions;
}
}, {
key: 'checkOptions',
// 只有两个调用:this.checkOptions('onStart')和this.checkOptions('onEnd')
value: function checkOptions(stage, compiler) {
var that = this;
if (this.options.verbose && Object.keys(this.options[stage]).length) {
console.log("HtmlModifyPlugin: processing ".concat(stage, " event"));
}
var operationList = [];
if (this.options[stage] && Array.isArray(this.options[stage])) {
// onEnd: [{copy:[]}, {delete:[]}],数组形式,按序执行
this.options[stage]
// @ts-ignore
.map(function (opts) {
return operationList.push.apply(operationList, toConsumableArray(that.parseOptions(opts, true)));
});
} else {
// onEnd: {copy:[], delete:[]},对象形式,不保证顺序
// @ts-ignore
operationList.push.apply(operationList, toConsumableArray(this.parseOptions(this.options[stage])));
}
if (operationList.length) {
operationList.reduce(function (previous, fn) {
return previous.then(function (retVal) {
return fn(retVal, compiler);
})["catch"](function (err) {
return console.log(err);
});
}, Promise.resolve());
}
}
}, {
key: 'replaceHash',
value: function replaceHash(filename) {
return filename.replace('[hash]', this.fileHash);
}
}, {
key: 'processAction',
value: function processAction(action, params, commandOrder) {
var result = action(params, this.options);
if (result !== null) {
commandOrder.push(result);
}
}
}, {
key: 'parseOptions',
// options : {copy:[...], delete:[...]}
value: function parseOptions(options) {
var that = this;
var commandOrder = [];
Object.keys(options).forEach(function (actionType) {
var actionOptions = options[actionType];
var actionParams = null;
actionOptions.forEach(function (actionItem) {
switch (actionType) {
case 'html':
actionParams = {
source: that.replaceHash(actionItem.source),
destination: actionItem.destination,
urls: actionItem.urls,
prefetchList: actionItem.prefetchList || [],
ssr: actionItem.ssr || '' // '','client','server'
};
that.processAction(htmlAction, actionParams, commandOrder);
break;
}
});
});
return commandOrder;
}
}, {
key: 'apply',
value: function apply(compiler) {
var that = this;
var comp = function comp(compilation) {
try {
that.checkOptions('onStart', compiler);
} catch (error) {
compilation.errors.push(error);
}
};
var afterEmit = function afterEmit(compilation, cb) {
// 已经计算好的hash
that.fileHash = compilation.hash;
try {
that.checkOptions('onEnd', compiler);
} catch (error) {
compilation.errors.push(error);
}
cb();
};
if (compiler.hooks) {
compiler.hooks.compilation.tap('compilation', comp);
compiler.hooks.afterEmit.tapAsync('afterEmit', afterEmit);
} else {
compiler.plugin('compilation', comp);
compiler.plugin('after-emit', afterEmit);
}
}
}]);
return HtmlModifyPlugin;
}();
function getRootDir() {
return process.cwd();
}
var TOOL_PATH_MAP$1 = {
tipCSSLoader: './loader/cross-game-style.js',
crossPlatformVueLoader: './loader/cross-platform.js',
crossPlatformJSLoader: './loader/cross-platform.js',
ifdefLoader: './loader/ifdef-loader.js',
publishUtil: './webpack-publish.js'
};
function getLocalToolPathMap() {
return Object.keys(TOOL_PATH_MAP$1).reduce(function (acc, key) {
acc[key] = path__namespace.resolve(__dirname, TOOL_PATH_MAP$1[key]);
return acc;
}, {});
}
var DEFAULT_CDN_URLS = ['https://image-1251917893.file.myqcloud.com/igame/npm/vue%402.6.10/dist/vue.runtime.min.js', 'https://image-1251917893.file.myqcloud.com/igame/npm/vue-router@3.5.2/dist/vue-router.min.js', 'https://image-1251917893.file.myqcloud.com/igame/npm/vuex@3.0.1/dist/vuex.min.js', 'https://image-1251917893.file.myqcloud.com/igame/npm/axios@0.18.0/dist/axios.min.js', 'https://image-1251917893.file.myqcloud.com/igame/npm/vue-lazyload@1.3.3/vue-lazyload.js', 'https://image-1251917893.file.myqcloud.com/igame/common/js/emonitor_custom_46f41566.js'];
var DEFAULT_PROJECT_MAP = {
'project/pvp-match-apply': 'project/match-apply',
'project/pvp-match-apply-mobile': 'project/match-apply-mobile',
'project/gp-match-apply': 'project/match-apply',
'project/gp-match-apply-mobile': 'project/match-apply-mobile',
'project/lol-match-apply': 'project/match-apply',
'project/lol-match-apply-mobile': 'project/match-apply-mobile',
'project/qp-match-apply': 'project/match-apply',
'project/qp-match-apply-mobile': 'project/match-apply-mobile'
};
var curDirname = getRootDir();
var TOOL_PATH_MAP = getLocalToolPathMap();
// 获取真实的vue-app名字
function getRealVueAppDir() {
var shadowProjectMap = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var vueAppDir = process.env.VUE_APP_DIR || '';
if (DEFAULT_PROJECT_MAP[vueAppDir]) {
return DEFAULT_PROJECT_MAP[vueAppDir];
}
if (shadowProjectMap[vueAppDir]) {
return shadowProjectMap[vueAppDir];
}
return vueAppDir || '';
}
var publishPara = process.env.publish;
var port = process.env.port || process.env.npm_config_port || 443;
var DEFAULT_HANDLE_IF_DEF_FILES = /(press-ui|component).*(\.vue|\.ts|\.js|\.css|\.scss)$/;
function getAppName() {
var arr = (process.env.VUE_APP_DIR || '').split('/');
return arr[arr.length - 1];
}
// 输出路径,构建的ssr包放在ssr目录下,构建的static包放在static目录下
function getOutputPath() {
if (process.env.VUE_APP_PLUGIN) {
return path__namespace.resolve(curDirname, 'dist', process.env.VUE_APP_DIR || '', 'plugin');
}
if (process.env.VUE_APP_SSR) {
return path__namespace.resolve(curDirname, 'dist', process.env.VUE_APP_DIR || '', 'ssr');
}
return path__namespace.resolve(curDirname, 'dist', process.env.VUE_APP_DIR || '', 'static');
}
// 入口:entry.js, entry-server.js, entry-client.js
function getEntry(shadowProjectMap) {
return path__namespace.resolve(curDirname, 'src', getRealVueAppDir(shadowProjectMap), 'main.js'); // plugin的入口用自己的
}
// 获取目下所有项目文件夹名称并创建webpack别名
function getAllAppNameAlias(shadowProjectMap) {
var files = fs__namespace.readdirSync(path__namespace.resolve(curDirname, 'src'));
var result = {
foldername: [],
filename: [] // 文件名,有后缀
};
files.forEach(function (file) {
var pathname = path__namespace.join(curDirname, 'src', file);
var stat = fs__namespace.lstatSync(pathname);
if (!stat.isDirectory()) {
result.filename.push(file);
} else {
result.foldername.push(file);
}
});
var alias = {
src: path__namespace.resolve(curDirname, 'src'),
'@': path__namespace.resolve(curDirname, 'src', getRealVueAppDir(shadowProjectMap)) // 由环境变量确定当前的项目
};
result.foldername.forEach(function (dir) {
alias[dir] = path__namespace.resolve(curDirname, 'src', dir);
});
return alias;
}
// 需要构建时自动注入的cdn url
function getCdnInject(_ref) {
var _ref$isVue = _ref.isVue3,
isVue3 = _ref$isVue === void 0 ? false : _ref$isVue;
var objs = {
mqq: 'mqq',
wx: 'wx',
msdkShare: 'msdkShare',
vue: 'Vue',
'vue-router': 'VueRouter',
vuex: 'Vuex',
axios: 'axios',
'vue-lazyload': 'VueLazyload'
};
// 必要的cdn写这里。构建时注入html中。(不是所有页面都要的,页面自己加载)
var cdnUrls = DEFAULT_CDN_URLS;
if (isVue3) {
cdnUrls = ['https://unpkg.com/vue@3.2.31/dist/vue.runtime.global.prod.js', 'https://unpkg.com/vue-router@4.0.14/dist/vue-router.global.js', 'https://unpkg.com/vuex@4.0.2/dist/vuex.global.js'].concat(_toConsumableArray(cdnUrls.slice(3)));
}
return {
objs: objs,
cdnUrls: cdnUrls
};
}
function getWebpackBaseConfig(options) {
var _merge = tComm.merge({}, {
isUseVueLoader: true,
isVue3: false,
useXSS: true,
useIfDefLoader: true,
handleIfDefFiles: DEFAULT_HANDLE_IF_DEF_FILES
}, options || {}),
isUseVueLoader = _merge.isUseVueLoader,
isVue3 = _merge.isVue3,
useXSS = _merge.useXSS,
useIfDefLoader = _merge.useIfDefLoader,
handleIfDefFiles = _merge.handleIfDefFiles,
_merge$shadowProjectM = _merge.shadowProjectMap,
shadowProjectMap = _merge$shadowProjectM === void 0 ? {} : _merge$shadowProjectM;
var terserPureFuncs = ['console.log', 'console.table'];
if (options !== null && options !== void 0 && options.terserPureFuncs) {
terserPureFuncs = options.terserPureFuncs || [];
}
var config = {
publicPath: process.env.VUE_APP_PUBLICPATH,
outputDir: getOutputPath(),
assetsDir: '',
lintOnSave: process.env.NODE_ENV === 'development',
productionSourceMap: false,
transpileDependencies: ['press-ui', 'pmd-merchant-ui'],
parallel: false,
css: {
extract: false
},
devServer: {
port: port,
https: true,
proxy: {
'/pvp/share/getsharecfg': {
target: 'https://igame.qq.com',
changeOrigin: true,
ws: true
},
'/pvp/share/gethash': {
target: 'https://igame.qq.com',
changeOrigin: true,
ws: true
}
},
disableHostCheck: (process.env.NODE_ENV || '').startsWith('development')
},
configureWebpack: {
entry: getEntry(shadowProjectMap),
name: getAppName(),
resolve: {
alias: getAllAppNameAlias(shadowProjectMap),
extensions: ['js', 'vue', 'json', 'ts']
}
// 可用来测试webpack运行时机制
// optimization: {
// minimize: false,
// runtimeChunk: { name: 'runtime' },
// },
},
chainWebpack: function chainWebpack(config) {
config.module.rule('vue').uses["delete"]('cache-loader');
config.module.rule('js').uses["delete"]('cache-loader');
config.module.rule('ts').uses["delete"]('cache-loader');
config.module.rule('tsx').uses["delete"]('cache-loader');
if (useIfDefLoader) {
config.module.rule('ifdef-loader')
// 根据项目实际配置文件类型
.test(handleIfDefFiles)
// 不要配成下面这样,会卡住
// .test(/\.vue|\.ts|\.js|\.css|\.scss$/)
.use(TOOL_PATH_MAP.ifdefLoader).loader(TOOL_PATH_MAP.ifdefLoader).options({
context: {
H5: true
},
type: ['css', 'js', 'html']
}).end();
}
// 先暂时去掉eslint
config.module.rule('eslint').uses.clear();
config.when(process.env.PUBLISH_ENV !== 'test', function (config) {
// 去掉console.log
config.optimization.minimizer('terser').tap(function (args) {
// remove debugger
args[0].terserOptions.compress.drop_debugger = true;
// 移除 console.log
args[0].terserOptions.compress.pure_funcs = terserPureFuncs;
// 去掉注释 如果需要看chunk-vendors公共部分插件,可以注释掉就可以看到注释了
args[0].terserOptions.output = {
comments: false
};
return args;
});
});
// config.plugins.delete('preload'); // 这个不禁止,预加载很快会被用到的内容
config.plugins["delete"]('prefetch'); // 这个禁止掉,首屏不预加载其他路由的js,需要预加载的路由,引入的时候,加上/* webpackPrefetch: true */
config.plugin('preload').use('@vue/preload-webpack-plugin').tap(function () {
return [{
rel: 'preload',
// 不写这个runtime.js会被打包进去
fileBlacklist: [/\.map$/, /hot-update\.js$/, /runtime\..*\.js$/],
include: 'initial'
}];
});
if (process.env.npm_config_report) {
console.log('进行包分析');
config.plugin('webpack-bundle-analyzer').use(webpackBundleAnalyzer.BundleAnalyzerPlugin).end();
} else if (process.env.NODE_ENV !== 'development') {
config.plugin('webpack-bundle-analyzer').use(new webpackBundleAnalyzer.BundleAnalyzerPlugin({
analyzerMode: 'static',
openAnalyzer: false,
reportFilename: 'my-bundle-analyze.html'
})).end();
}
// set preserveWhitespace
config.module.rule('vue').test(/\.vue$/).use(TOOL_PATH_MAP.tipCSSLoader, TOOL_PATH_MAP.crossPlatformVueLoader) // 处理样式的loader,必须在vue-loader前执行
.loader(TOOL_PATH_MAP.tipCSSLoader, TOOL_PATH_MAP.crossPlatformVueLoader).end();
if (isUseVueLoader) {
config.module.rule('vue').test(/\.vue$/).use('vue-loader').loader('vue-loader').tap(function (options) {
if (options) {
options.compilerOptions.whitespace = 'preserve';
}
return options;
}).tap(function (options) {
if (useXSS) {
options.compilerOptions.directives = {
html: function html(node, directiveMeta) {
(node.props || (node.props = [])).push({
name: 'innerHTML',
value: "xss ? xss(_s(".concat(directiveMeta.value, ")) : ").concat(directiveMeta.value)
});
}
};
}
return options;
}).end();
}
config.module.rule('js').test(/\.[jt]s$/).use(TOOL_PATH_MAP.crossPlatformJSLoader) // 处理样式的loader,必须在vue-loader前执行
.loader(TOOL_PATH_MAP.crossPlatformJSLoader).end();
config
// https://webpack.js.org/configuration/devtool/#development
.when(process.env.NODE_ENV === 'development', function (config) {
return config.devtool('cheap-source-map');
});
config.when(process.env.NODE_ENV !== 'development', function (config) {
config.plugin('ScriptExtHtmlWebpackPlugin').after('html').use('script-ext-html-webpack-plugin', [{
// `runtime` must same as runtimeChunk name. default is `runtime`
inline: /runtime\..*\.js$/
}]).end();
config.optimization.splitChunks({
chunks: 'all',
cacheGroups: {
libs: {
name: 'chunk-libs',
test: /[\\/]node_modules[\\/]/,
priority: 10,
chunks: 'initial' // only package third parties that are initially dependent
},
elementUI: {
name: 'chunk-elementUI',
// the weight needs to be larger than libs and app or it will be packaged into libs or app
priority: 20,
test: /[\\/]node_modules[\\/]_?element-ui(.*)/ // in order to adapt to cnpm
},
comm: {
name: 'chunk-comm',
test: /[\\/]src[\\/]_?comm(.*)/,
minChunks: 2,
minSize: 10 * 1024,
maxSize: 244 * 1024,
priority: 5,
reuseExistingChunk: true
},
component: {
name: 'chunk-component',
test: /[\\/]src[\\/]_?component(.*)/,
minChunks: 2,
minSize: 10 * 1024,
maxSize: 244 * 1024,
priority: 5,
reuseExistingChunk: true
},
logic: {
name: 'chunk-logic',
test: /[\\/]src[\\/]_?logic(.*)/,
minChunks: 2,
minSize: 10 * 1024,
maxSize: 244 * 1024,
priority: 5,
reuseExistingChunk: true
}
}
});
config.optimization.runtimeChunk('single');
});
var serving = false;
process.argv.forEach(function (i) {
if (i.indexOf('--serving') == 0) {
serving = true;
}
});
// 指定html模板文件
config.plugin('html').tap(function (args) {
args[0].template = path__namespace.resolve(curDirname, 'src', getRealVueAppDir(shadowProjectMap) || 'comm', 'index.html'); // 业务目录下自己的模板。默认在vue-cli3/public/index.html
args[0].minify = false; // 不需要压缩,没几个字节,不压缩方便后续处理
return args;
});
// config.when(process.env.NODE_ENV !== 'hotreload', config => {
if (!serving) {
console.log("--------not serving now: ".concat(process.env.NODE_ENV, "----------"));
// html后处理:title替换,cdnurl自动注入。自定义HtmlmodifyPlugin插件
config.plugin('Htmlmodify').use(new HtmlModifyPlugin({
onEnd: {
html: [{
source: path__namespace.resolve(curDirname, 'src', getRealVueAppDir(shadowProjectMap), 'index.html'),
destination: "".concat(getOutputPath(), "/index.html"),
ssr: process.env.VUE_APP_SSR,
urls: getCdnInject({
isVue3: isVue3
}).cdnUrls
}]
}
})).tap(function (args) {
return args;
});
if (process.env.npm_config_prerender) {
console.log('开始预渲染');
config.plugin('prerender-spa-plugin').use(PrerenderSpaPlugin__default["default"], [{
// 生成文件的路径,也可以与webpakc打包的一致。
// 这个目录只能有一级,如果目录层次大于一级,在生成的时候不会有任何错误提示,在预渲染的时候只会卡着不动。
staticDir: path__namespace.join(curDirname, './dist'),
outputDir: getOutputPath(),
indexPath: "".concat(getOutputPath(), "/index.html"),
routes: ['/', '/index'],
renderer: new PrerenderSpaPlugin__default["default"].PuppeteerRenderer({
inject: {
initLocation: false // 是否初始化定位组件,为false不会渲染定位相关
},
// headless: false,
renderAfterTime: 10000
// 在 main.js 中 document.dispatchEvent(new Event('render-event')),两者的事件名称要对应上。
// renderAfterDocumentEvent: 'render-event',
})
}]).end();
}
// 打包构建后的文件
config.plugin('FileManager').use(new FileManagerPlugin__default["default"]({
onEnd: [{
archive: [{
source: getOutputPath(),
destination: "".concat(getOutputPath(), "/static_").concat(getAppName(), "_").concat(tComm.getIPAddressStr(), ".tar"),
format: 'tar'
}]
}]
})).tap(function (args) {
return args;
});
/* 申明外部全局变量
不经常改动的库、我们通过cdn引入. require('Vue')或者import('Vue') 时webpack不对他们进行打包,
可以减少代码的大小、也可以减少服务器的带宽,更能把这些文件缓存到客户端,客户端加载的会更快。
*/
config.externals(getCdnInject({
isVue3: isVue3
}).objs);
if (publishPara == 'test') {
console.log('编译并发布到测试环境');
config.plugin('webpack-hooks-shellscripts').use(HooksScriptPlugin__default["default"]({
beforeRun: [],
afterEmit: ["node ".concat(TOOL_PATH_MAP.publishUtil)]
})).end();
} else if (publishPara == 'prod') {
console.log('编译并发布到正式环境');
config.plugin('webpack-hooks-shellscripts').use(HooksScriptPlugin__default["default"]({
beforeRun: [],
afterEmit: ["node ".concat(TOOL_PATH_MAP.publishUtil, " prod")]
})).end();
} else {
console.log('只编译不发布');
config.plugin('webpack-hooks-shellscripts').use(HooksScriptPlugin__default["default"]({
beforeRun: [],
afterEmit: []
})).end();
}
// })
}
}
};
return config;
}
var PUBLISH_BASE_OPTIONS = {};
function ownKeys$1(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread$1(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$1(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$1(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
function innerPublish(publishEnv) {
tComm.localPublish(_objectSpread$1(_objectSpread$1({}, PUBLISH_BASE_OPTIONS), {}, {
publishEnv: publishEnv
}));
}
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
var WEBPACK_BASE_CONFIG = _objectSpread({}, getWebpackBaseConfig());
exports.WEBPACK_BASE_CONFIG = WEBPACK_BASE_CONFIG;
exports.getWebpackBaseConfig = getWebpackBaseConfig;
exports.innerPublish = innerPublish;