215 lines
6.0 KiB
JavaScript
215 lines
6.0 KiB
JavaScript
const path = require('path');
|
|
const { name } = require('./package');
|
|
const { defineConfig } = require('@vue/cli-service');
|
|
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
|
|
const HtmlWebpackInlineSourcePlugin = require('html-webpack-inline-source-plugin');
|
|
const HtmlWebpackPlugin = require('html-webpack-plugin');
|
|
const InlineSourceWebpackPlugin = require('inline-source-webpack-plugin');
|
|
|
|
function resolve(dir) {
|
|
return path.join(__dirname, dir);
|
|
}
|
|
|
|
module.exports = defineConfig({
|
|
publicPath: '/',
|
|
productionSourceMap: false,
|
|
devServer: {
|
|
port: 4004,
|
|
client: {
|
|
webSocketTransport: 'sockjs',
|
|
overlay: false,
|
|
},
|
|
allowedHosts: 'all',
|
|
webSocketServer: 'sockjs',
|
|
proxy: {
|
|
['^((?!/login)(?!/document))']: {
|
|
target: 'http://localhost:8004',
|
|
ws: false,
|
|
},
|
|
'/websocket': {
|
|
target: 'http://localhost:8004',
|
|
ws: true,
|
|
},
|
|
},
|
|
// 跨域
|
|
headers: {
|
|
'Access-Control-Allow-Origin': '*',
|
|
},
|
|
},
|
|
pages: {
|
|
index: {
|
|
entry: 'src/main.js',
|
|
template: 'public/index.html',
|
|
filename: 'index.html',
|
|
},
|
|
|
|
shareApiReport: {
|
|
entry: 'src/template/report/share/share-api-report.js',
|
|
template: 'src/template/report/share/share-api-report.html',
|
|
filename: 'share-api-report.html',
|
|
},
|
|
shareDocument: {
|
|
entry: 'src/template/document/share/share-document.js',
|
|
template: 'src/template/document/share/share-document.html',
|
|
filename: 'share-document.html',
|
|
},
|
|
apiDocument: {
|
|
entry: 'src/template/document/api-document.js',
|
|
template: 'src/template/document/api-document.html',
|
|
filename: 'api-doc.html',
|
|
inlineSource: '.*',
|
|
},
|
|
},
|
|
configureWebpack: {
|
|
devtool: 'cheap-module-source-map',
|
|
resolve: {
|
|
alias: {
|
|
'@': resolve('src'),
|
|
mockjs: resolve('node_modules/mockjs'),
|
|
'vue-i18n': resolve('node_modules/vue-i18n'),
|
|
jsondiffpatch: resolve('node_modules/jsondiffpatch'),
|
|
},
|
|
},
|
|
output: {
|
|
// 把子应用打包成 umd 库格式(必须)
|
|
library: `${name}-[name]`,
|
|
libraryTarget: 'umd',
|
|
chunkLoadingGlobal: `webpackJsonp_${name}`,
|
|
// 打包后js的名称
|
|
filename: `js/${name}-[name].[contenthash:8].js`,
|
|
chunkFilename: `js/${name}-[name].[contenthash:8].js`,
|
|
},
|
|
optimization: {
|
|
splitChunks: {
|
|
cacheGroups: {
|
|
'chunk-vendors': {
|
|
test: /[\\/]node_modules[\\/]/,
|
|
name: 'chunk-vendors',
|
|
priority: 1,
|
|
minChunks: 3,
|
|
chunks: 'all',
|
|
},
|
|
'chunk-common': {
|
|
test: /[\\/]src[\\/]/,
|
|
name: 'chunk-common',
|
|
priority: 1,
|
|
minChunks: 5,
|
|
chunks: 'all',
|
|
},
|
|
html2canvas: {
|
|
test: /[\\/]html2canvas[\\/]/,
|
|
name: 'html2canvas',
|
|
priority: 3,
|
|
chunks: 'all',
|
|
},
|
|
fortawesome: {
|
|
test: /[\\/]@fortawesome[\\/]/,
|
|
name: 'fortawesome',
|
|
priority: 3,
|
|
chunks: 'all',
|
|
},
|
|
'el-tree-transfer': {
|
|
test: /[\\/]el-tree-transfer[\\/]/,
|
|
name: 'el-tree-transfer',
|
|
priority: 3,
|
|
chunks: 'all',
|
|
},
|
|
jspdf: {
|
|
test: /[\\/]jspdf[\\/]/,
|
|
name: 'jspdf',
|
|
priority: 3,
|
|
chunks: 'all',
|
|
},
|
|
jsondiffpatch: {
|
|
test: /[\\/]jsondiffpatch[\\/]/,
|
|
name: 'jsondiffpatch',
|
|
priority: 3,
|
|
chunks: 'all',
|
|
},
|
|
jsencrypt: {
|
|
test: /[\\/]jsencrypt[\\/]/,
|
|
name: 'jsencrypt',
|
|
priority: 3,
|
|
chunks: 'all',
|
|
},
|
|
mockjs: {
|
|
test: /[\\/]mockjs[\\/]/,
|
|
name: 'mockjs',
|
|
priority: 3,
|
|
chunks: 'all',
|
|
},
|
|
pinia: {
|
|
test: /[\\/]pinia[\\/]/,
|
|
name: 'pinia',
|
|
priority: 3,
|
|
chunks: 'all',
|
|
},
|
|
brace: {
|
|
test: /[\\/]brace[\\/]/,
|
|
name: 'brace',
|
|
priority: 3,
|
|
chunks: 'all',
|
|
},
|
|
echarts: {
|
|
test: /[\\/](echarts|zrender)[\\/]/,
|
|
name: 'echarts',
|
|
priority: 3,
|
|
chunks: 'all',
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
css: {
|
|
// 将组件内的 CSS 提取到一个单独的 CSS 文件 (只用在生产环境中)
|
|
// 也可以是一个传递给 `extract-text-webpack-plugin` 的选项对象
|
|
// 修改打包后css文件名
|
|
// extract: true,
|
|
extract: {
|
|
ignoreOrder: true,
|
|
filename: `css/${name}-[name].[contenthash:8].css`,
|
|
chunkFilename: `css/${name}-[name].[contenthash:8].css`,
|
|
},
|
|
},
|
|
chainWebpack: (config) => {
|
|
config.module.rule('svg').exclude.add(resolve('../../framework/sdk-parent/frontend/src/assets/module')).end();
|
|
config.module
|
|
.rule('icons')
|
|
.test(/\.svg$/)
|
|
.include.add(resolve('../../framework/sdk-parent/frontend/src/assets/module'))
|
|
.end()
|
|
.use('svg-sprite-loader')
|
|
.loader('svg-sprite-loader')
|
|
.options({
|
|
symbolId: 'icon-[name]',
|
|
});
|
|
|
|
// 报告模板打包成一个html
|
|
config
|
|
.plugin('inline-source-html')
|
|
.after('html-apiDocument')
|
|
.use(
|
|
new InlineSourceWebpackPlugin({
|
|
compress: true,
|
|
rootpath: '../../framework/sdk-parent/frontend/public/js',
|
|
noAssetMatch: 'warn',
|
|
}),
|
|
[HtmlWebpackPlugin]
|
|
);
|
|
|
|
config
|
|
.plugin('inline-source-html-apiDocument')
|
|
.after('html-apiDocument')
|
|
.use(HtmlWebpackInlineSourcePlugin, [HtmlWebpackPlugin]);
|
|
if (process.env.NODE_ENV === 'analyze') {
|
|
config.plugin('webpack-report').use(BundleAnalyzerPlugin, [
|
|
{
|
|
analyzerMode: 'static',
|
|
reportFilename: './webpack-report.html',
|
|
openAnalyzer: false,
|
|
},
|
|
]);
|
|
}
|
|
},
|
|
});
|