const webpack = require("webpack"); const UglifyJsPlugin = require("uglifyjs-webpack-plugin"); const isProd = process.env.NODE_ENV === "production"; // * 避免打包项 const externals = isProd ? { vue: "Vue", vuex: "Vuex", "vue-router": "VueRouter", axios: "axios", //clipboard: "Clipboard", } : {}; // * 资源地址 const assetsDir = isProd ? "static" + new Date().toLocaleDateString().replace(/\//g, "-") : "static"; // * 公共代码抽离 const optimization = { splitChunks: { cacheGroups: { vendors: { name: "chunk-vendors", test: /[\\/]node_modules[\\/]/, priority: 100, chunks: "all", minChunks: 1, maxInitialRequests: 5, minSize: 0, }, common: { name: "chunk-common", test: /[\\/]src[\\/]ts[\\/]/, minChunks: 2, maxInitialRequests: 5, minSize: 0, priority: 60, chunks: "all", reuseExistingChunk: true, }, antDesignVue: { name: "chunk-antdv", test: /[\\/]node_modules[\\/]ant-design-vue[\\/]/, chunks: "initial", priority: 120, reuseExistingChunk: true, enforce: true, }, styles: { name: "styles", test: /\.(sa|sc|c)ss$/, chunks: "all", enforce: true, }, runtimeChunk: { name: "manifest", }, }, }, }; const ossCDN = "https://firemanage.oss-cn-hangzhou.aliyuncs.com/FE-resource"; // * oss config const ossConfig = { buildPath: "/", region: "oss-cn-hangzhou", ak: "LTAIowrHAk6HHxb8", sk: "vhrLQEn1WW8WQphOPBfcDE8zwx7nel", bucket: "firemanage", }; // * 资源配置 const cdns = { dev: {}, build: { css: [], js: [ `${ossCDN}/library/vue.next.min.js`, `${ossCDN}/library/vuex.next.min.js`, `${ossCDN}/library/vue-router.next.min.js`, `${ossCDN}/library/axios.min.js`, //`${ossCDN}/library/clipboard.min.js`, ], }, }; // * 打包后资源上传oss const uploadAssetsToOSS = (config) => { config .plugin("webpack-aliyun-oss-plugin") .use(require("webpack-aliyun-oss-plugin"), [ { buildPath: ossConfig.buildPath, region: ossConfig.region, ak: ossConfig.ak, sk: ossConfig.sk, bucket: ossConfig.bucket, filter: function(assets) { return !/\.html$/.test(assets); }, }, ]); }; // * 打包gzip const assetsGzip = (config) => { config .plugin("compression-webpack-plugin") .use(require("compression-webpack-plugin"), [ { filename: "[path].gz[query]", algorithm: "gzip", test: /\.js$|\.html$|\.json$|\.css/, threshold: 10240, // 只有大小大于该值的资源会被处理 10240 minRatio: 0.8, // 只有压缩率小于这个值的资源才会被处理 deleteOriginalAssets: true, // 删除原文件 }, ]); }; // * 代码压缩 const codeUglifyConfig = { uglifyOptions: { //生产环境自动删除console compress: { drop_debugger: true, drop_console: false, pure_funcs: ["console.log"], }, }, sourceMap: false, parallel: true, }; const plugins = isProd ? [ new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/), new webpack.HashedModuleIdsPlugin(), //new UglifyJsPlugin(codeUglifyConfig), ] : []; module.exports = { uploadAssetsToOSS, assetsGzip, plugins, externals, optimization, cdns, assetsDir, };