123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202 |
- 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 AutoImport = require('unplugin-auto-import/webpack');
- const Components = require('unplugin-vue-components/webpack');
- const { ElementPlusResolver } = require('unplugin-vue-components/resolvers');
- const IS_PRODUCTION = process.env.NODE_ENV === 'production';
- // 当前场景
- const SCENE = process.env.SCENE;
- if (SCENE != null) {
- console.log('当前场景:', SCENE);
- }
- const ENV = getEnv();
- module.exports = defineConfig({
- transpileDependencies: true,
- lintOnSave: false,
- pages: {
- scene: {
- template: 'public/index.html',
- entry: 'src/main.ts',
- filename: IS_PRODUCTION ? `${SCENE || 'index'}.html` : 'index.html',
- title: process.env.TITLE,
- },
- hotspot: {
- template: 'hotspot/hotspot.html',
- entry: `hotspot/${SCENE ? SCENE + '-' : ''}main.ts`,
- filename: IS_PRODUCTION ? `${SCENE ? SCENE + '-' : ''}hotspot.html` : 'hotspot.html',
- title: process.env.TITLE,
- },
- },
- outputDir: IS_PRODUCTION && !!SCENE ? `build/${SCENE}` : 'build',
- // 根据场景隔离
- assetsDir: path.posix.join(config.assetsDir, SCENE || ''),
- productionSourceMap: process.env.SOURCE_MAP === 'true' || false,
- css: {
- loaderOptions: {
- sass: {
- additionalData: ENV.sass,
- },
- },
- },
- /**
- * 开发服务器配置
- */
- devServer: {
- compress: true,
- host: '0.0.0.0',
- port: process.env.PORT || 80,
- historyApiFallback: true,
- allowedHosts: 'all',
- },
- configureWebpack: {
- devtool: 'source-map',
- resolve: {
- symlinks: false,
- alias: {
- '@': path.join(__dirname, 'src'),
- '@hotspot': path.join(__dirname, 'hotspot'),
- },
- },
- plugins: [
- new NodePolyfillPlugin(),
- // 扩展 process.env
- new webpack.DefinePlugin(ENV.define),
- AutoImport({
- resolvers: [ElementPlusResolver()],
- }),
- Components({
- resolvers: [ElementPlusResolver()],
- }),
- ],
- },
- chainWebpack: (webpackConfig) => {
- if (SCENE != null) {
- const extensions = webpackConfig.resolve.extensions.values();
- for (let i = extensions.length - 1; i >= 0; i--) {
- webpackConfig.resolve.extensions.prepend(`.${SCENE}${extensions[i]}`);
- }
- }
- webpackConfig.module
- .rule('json')
- .test(/(.*)\.tr$/)
- .use('json-loader')
- .loader('json-loader')
- .end();
- if (IS_PRODUCTION) {
- webpackConfig.plugin('loadshReplace').use(new LodashModuleReplacementPlugin());
- // 主包分割
- webpackConfig.optimization.splitChunks({
- cacheGroups: {
- common: {
- name: 'chunk-common',
- chunks: 'initial',
- minChunks: 2,
- // 一个入口最大的并行请求数
- maxInitialRequests: 4,
- // 形成一个新代码块最小的体积
- minSize: 5000,
- // 缓存组打包的先后优先级
- priority: 1,
- // 如果当前的 chunk 已被从 split 出来,那么将会直接复用这个 chunk 而不是重新创建一个
- reuseExistingChunk: true,
- },
- vendors: {
- name: 'chunk-vendors',
- test: /[\\/]node_modules[\\/]/,
- chunks: 'initial',
- priority: 2,
- reuseExistingChunk: true,
- // 总是为这个缓存组创建 chunks
- enforce: true,
- },
- elementIcons: {
- name: 'element-icons',
- test: /[\\/]node_modules[\\/]@element-plus[\\/]/,
- chunks: 'initial',
- priority: 3,
- reuseExistingChunk: true,
- enforce: true,
- },
- elementPlus: {
- name: 'element-plus',
- test: /[\\/]node_modules[\\/]element-plus[\\/]/,
- chunks: 'initial',
- priority: 3,
- reuseExistingChunk: true,
- enforce: true,
- },
- swiper: {
- name: 'swiper',
- test: /[\\/]node_modules[\\/]swiper[\\/]/,
- chunks: 'initial',
- priority: 3,
- reuseExistingChunk: true,
- enforce: true,
- },
- },
- });
- }
- },
- });
- /**
- * 初始化环境变量
- */
- 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', 'HOT_DOMAIN'];
- 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 {
- sass: variables.map((d) => `$` + d + ';\n').join(''),
- 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;
- }, {}),
- };
- }
|