"use strict"; const path = require("path"); const defaultSettings = require("./src/settings.js"); const webpack = require("webpack"); const CompressionPlugin = require("compression-webpack-plugin"); // const zlib = require("zlib"); function resolve(dir) { return path.join(__dirname, dir); } const name = defaultSettings.title || "vue Admin Template"; // page title const port = 8888 || process.env.port || process.env.npm_config_port; // dev port module.exports = { publicPath: "./", outputDir: "dist", assetsDir: "static", lintOnSave: process.env.NODE_ENV === "development", // lintOnSave: false, productionSourceMap: false, devServer: { // 配置反向代理 compress: true, // 配置webpack的压缩,但是在package.json中需要配置 --compress port: port, open: true, overlay: { warnings: false, errors: true, }, proxy: { // 地址中有 /api 的时候会触发代理 "/api_prod": { // target: "http://localhost:8001/", target: "http://bl7.matripe.com.cn:8001", // target: "http://1shoudan.renminshitang.com.cn", // target: "https://idaotian.com", // target: "https://d.matripe.com.cn", ws: true, // proxy websockets changeOrigin: true, // 确定是否跨域 pathRewrite: { "^/api_prod": "", }, }, "/yishoudan": { // target: "http://localhost:8001/", // target: "http://bl7.matripe.com.cn:8001", // target: "http://1shoudan.renminshitang.com.cn", target: "https://idaotian.com", // target: "https://d.matripe.com.cn", ws: true, // proxy websockets changeOrigin: true, // 确定是否跨域 pathRewrite: { "^/yishoudan": "/yishoudan", }, }, // '/api_prod': { // target: 'http://a.matripe.com.cn', // ws: true, // proxy websockets // changeOrigin: true, // needed for virtual hosted sites // pathRewrite: { // '^/api_prod': '' // rewrite path // } // }, // '/api_dev': { // target: 'http://nb.renminshitang.com.cn:8001', // ws: true, // proxy websockets // changeOrigin: true, // needed for virtual hosted sites // pathRewrite: { // '^/api_dev': '/' // rewrite path // } // } // ,'/api_test': { // target: 'http://localhost:8003', // ws: true, // proxy websockets // changeOrigin: true, // needed for virtual hosted sites // pathRewrite: { // '^/api_test': '' // rewrite path // } // } }, // before: require('./mock/mock-server.js') }, chainWebpack: (config) => { // console.dir(config.optimization.minimizer); // 开发环境的webpack配置 config.when(process.env.NODE_ENV === "development", (config) => { config.entry("app").clear().add("./src/main-dev.js"); config.set("externals", {}); }); // 生产环境的webpack配置 config.when(process.env.NODE_ENV === "production", (config) => { config.entry("app").clear().add("./src/main-prod.js"); }); // if (process.env.NODE_ENV === "production") { // 忽略输出 Pass true to discard calls to console.* functions. // config.optimization.minimizer[0].options.terserOptions.compress.drop_console = true; // } config.plugins.delete("fork-ts-checker"), // 禁用fork-ts-checker config.plugins.delete("prefetch"); }, configureWebpack: { // provide the app's title in webpack's name field, so that // it can be accessed in index.html to inject the correct title. name: name, resolve: { alias: { "@": resolve("src"), "@ant-design/icons/lib/dist.$": resolve("src/icons.js"), }, }, plugins: [ // new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/), // // 下面两项配置才是 compression-webpack-plugin 压缩配置 // // 压缩成 .gz 文件 // new CompressionPlugin({ // algorithm: "gzip", // test: /\.js$|\.html$|\.css/, //匹配文件名 // threshold: 10240, // minRatio: 0.8, // deleteOriginalAssets: false, // 是否删除源文件 // }), // 压缩成 .br 文件,如果 zlib 报错无法解决,可以注释这段使用代码,一般本地没问题,需要注意线上服务器会可能发生找不到 zlib 的情况。 // new CompressionPlugin({ // filename: '[path].br', // algorithm: 'brotliCompress', // test: /\.(js|css|html|svg)$/, // compressionOptions: { // params: { // [zlib.constants.BROTLI_PARAM_QUALITY]: 11 // } // }, // threshold: 10240, // minRatio: 0.8, // deleteOriginalAssets: true //是否删除原文件 // }) ], // }, optimization: { runtimeChunk: "single", splitChunks: { chunks: "all", maxInitialRequests: Infinity, minSize: 20000, cacheGroups: { vendor: { test: /[\\/]node_modules[\\/]/, name(module) { // get the name. E.g. node_modules/packageName/not/this/part.js // or node_modules/packageName const packageName = module.context.match(/[\\/]node_modules[\\/](.*?)([\\/]|$)/)[1]; // npm package names are URL-safe, but some servers don't like @ symbols return `npm.${packageName.replace("@", "")}`; }, }, }, }, }, // chainWebpack (config) { // // it can improve the speed of the first screen, it is recommended to turn on preload // config.plugin('preload').tap(() => [ // { // rel: 'preload', // // to ignore runtime.js // // https://github.com/vuejs/vue-cli/blob/dev/packages/@vue/cli-service/lib/config/app.js#L171 // fileBlacklist: [/\.map$/, /hot-update\.js$/, /runtime\..*\.js$/], // include: 'initial' // } // ]) // // when there are many pages, it will cause too many meaningless requests // config.plugins.delete('prefetch') // // set svg-sprite-loader // config.module // .rule('svg') // .exclude.add(resolve('src/icons')) // .end() // config.module // .rule('icons') // .test(/\.svg$/) // .include.add(resolve('src/icons')) // .end() // .use('svg-sprite-loader') // .loader('svg-sprite-loader') // .options({ // symbolId: 'icon-[name]' // }) // .end() // config // .when(process.env.NODE_ENV !== 'development', // 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', // split elementUI into a single package // priority: 20, // the weight needs to be larger than libs and app or it will be packaged into libs or app // test: /[\\/]node_modules[\\/]_?element-ui(.*)/ // in order to adapt to cnpm // }, // commons: { // name: 'chunk-commons', // test: resolve('src/components'), // can customize your rules // minChunks: 3, // minimum common number // priority: 5, // reuseExistingChunk: true // } // } // }) // // https:// webpack.js.org/configuration/optimization/#optimizationruntimechunk // config.optimization.runtimeChunk('single') // } // ) // } }, };