|
@@ -1,38 +1,113 @@
|
|
|
-const { defineConfig } = require("@vue/cli-service");
|
|
|
+const { defineConfig } = require('@vue/cli-service');
|
|
|
+const webpack = require('webpack');
|
|
|
const path = require('path');
|
|
|
const config = require('./config');
|
|
|
+const NodePolyfillPlugin = require('node-polyfill-webpack-plugin');
|
|
|
+const LodashModuleReplacementPlugin = require('lodash-webpack-plugin');
|
|
|
|
|
|
const IS_PRODUCTION = process.env.NODE_ENV === 'production';
|
|
|
-// 当前博物馆
|
|
|
-const MUSEUM = process.env.MUSEUM;
|
|
|
+// 当前场景
|
|
|
+const SCENE = process.env.SCENE;
|
|
|
|
|
|
-if (MUSEUM != null) {
|
|
|
- console.log('当前博物馆:', MUSEUM);
|
|
|
+if (SCENE != null) {
|
|
|
+ console.log('当前场景:', SCENE);
|
|
|
}
|
|
|
|
|
|
+const ENV = getEnv();
|
|
|
+
|
|
|
module.exports = defineConfig({
|
|
|
transpileDependencies: true,
|
|
|
lintOnSave: false,
|
|
|
publicPath: IS_PRODUCTION ? config.publicPath : '/',
|
|
|
- outputDir: (IS_PRODUCTION && !!MUSEUM) ? `build/${MUSEUM}` : 'build',
|
|
|
- // 根据博物馆隔离
|
|
|
- assetsDir: path.posix.join(config.assetsDir, MUSEUM || ''),
|
|
|
+ outputDir: IS_PRODUCTION && !!SCENE ? `build/${SCENE}` : 'build',
|
|
|
+ // 根据场景隔离
|
|
|
+ assetsDir: path.posix.join(config.assetsDir, SCENE || ''),
|
|
|
|
|
|
configureWebpack: {
|
|
|
+ devtool: 'source-map',
|
|
|
resolve: {
|
|
|
symlinks: false,
|
|
|
alias: {
|
|
|
'@': path.join(__dirname, 'src'),
|
|
|
},
|
|
|
},
|
|
|
+ plugins: [
|
|
|
+ new NodePolyfillPlugin(),
|
|
|
+
|
|
|
+ // 扩展 process.env
|
|
|
+ new webpack.DefinePlugin(ENV.define),
|
|
|
+ ],
|
|
|
},
|
|
|
|
|
|
chainWebpack: (webpackConfig) => {
|
|
|
- if (MUSEUM != null) {
|
|
|
+ if (SCENE != null) {
|
|
|
const extensions = webpackConfig.resolve.extensions.values();
|
|
|
for (let i = extensions.length - 1; i >= 0; i--) {
|
|
|
- webpackConfig.resolve.extensions.prepend(`.${MUSEUM}${extensions[i]}`);
|
|
|
+ webpackConfig.resolve.extensions.prepend(`.${SCENE}${extensions[i]}`);
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
+
|
|
|
+ webpackConfig.module
|
|
|
+ .rule('json')
|
|
|
+ .test(/(.*)\.tr$/)
|
|
|
+ .use('json-loader')
|
|
|
+ .loader('json-loader')
|
|
|
+ .end();
|
|
|
+
|
|
|
+ webpackConfig.module.rules.delete('svg'); // 删除默认svg配置
|
|
|
+ webpackConfig.module
|
|
|
+ .rule('svg-sprite-loader')
|
|
|
+ .test(/\.svg$/)
|
|
|
+ .use('svg-sprite-loader')
|
|
|
+ .loader('svg-sprite-loader')
|
|
|
+ .options({
|
|
|
+ symbolId: 'icon-[name]',
|
|
|
+ })
|
|
|
+ .end();
|
|
|
+
|
|
|
+ if (IS_PRODUCTION) {
|
|
|
+ webpackConfig.plugin('loadshReplace').use(new LodashModuleReplacementPlugin());
|
|
|
+ }
|
|
|
+ },
|
|
|
});
|
|
|
+
|
|
|
+/**
|
|
|
+ * 初始化环境变量
|
|
|
+ */
|
|
|
+function getEnv() {
|
|
|
+ const constants = config.constants;
|
|
|
+
|
|
|
+ // 扩展内置变量
|
|
|
+ for (const key in constants) {
|
|
|
+ process.env[`VUE_APP_${key}`] = constants[key];
|
|
|
+ }
|
|
|
+
|
|
|
+ // 内置变量
|
|
|
+ const vueVariables = ['NODE_ENV', 'BASE_URL'];
|
|
|
+ const variableNames = [...vueVariables, 'SCENE'];
|
|
|
+ const variables = [];
|
|
|
+
|
|
|
+ for (const key in process.env) {
|
|
|
+ if (key.startsWith('VUE_APP_')) {
|
|
|
+ variableNames.push(key);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ variableNames.forEach((name) => {
|
|
|
+ variables.push(`${name}: "${process.env[name]}"`);
|
|
|
+ });
|
|
|
+
|
|
|
+ return {
|
|
|
+ variableNames,
|
|
|
+ variables,
|
|
|
+ // 用于 definePlugin
|
|
|
+ define: variableNames
|
|
|
+ .filter((name) => {
|
|
|
+ return !name.startsWith('VUE_APP_') && !vueVariables.includes(name);
|
|
|
+ })
|
|
|
+ .reduce((prev, cur) => {
|
|
|
+ prev[`process.env.${cur}`] = JSON.stringify(process.env[cur]);
|
|
|
+ return prev;
|
|
|
+ }, {}),
|
|
|
+ };
|
|
|
+}
|