import { Configuration } from "webpack"; import { merge } from "webpack-merge"; import baseConfig from "./webpack.common"; const MiniCssExtractPlugin = require("mini-css-extract-plugin"); import CssMinimizerPlugin from "css-minimizer-webpack-plugin"; import TerserPlugin from "terser-webpack-plugin"; import CompressionPlugin from "compression-webpack-plugin"; const globAll = require("glob-all"); const { PurgeCSSPlugin } = require("purgecss-webpack-plugin"); import path from "path"; import CopyWebpackPlugin from "copy-webpack-plugin"; const prodConfig: Configuration = merge(baseConfig, { mode: "production", // 生产模式,会开启tree-shaking和压缩代码,以及其他优化 optimization: { minimize: true, minimizer: [ new CssMinimizerPlugin(), // 压缩css // 压缩js new TerserPlugin({ parallel: true, // 开启多线程压缩 terserOptions: { compress: { pure_funcs: ["console.log"], // 删除console.log }, }, }), ], splitChunks: { // 分隔代码 cacheGroups: { vendors: { // 提取node_modules代码 test: /node_modules/, // 只匹配node_modules里面的模块 name: "vendors", // 提取文件命名为vendors,js后缀和chunkhash会自动加 minChunks: 1, // 只要使用一次就提取出来 chunks: "initial", // 只提取初始化就能获取到的模块,不管异步的 minSize: 0, // 提取代码体积大于0就提取出来 priority: 1, // 提取优先级为1 }, commons: { // 提取页面公共代码 name: "commons", // 提取文件命名为commons minChunks: 2, // 只要使用两次就提取出来 chunks: "initial", // 只提取初始化就能获取到的模块,不管异步的 minSize: 0, // 提取代码体积大于0就提取出来 }, }, }, }, performance: { hints: false, maxAssetSize: 4000000, // 整数类型(以字节为单位) maxEntrypointSize: 5000000, // 整数类型(以字节为单位) }, plugins: [ // 抽离css new MiniCssExtractPlugin({ filename: "static/css/[name].[contenthash:8].css", // 抽离css的输出目录和名称 }), // 清理无用css,检测src下所有tsx文件和public下index.html中使用的类名和id和标签名称 // 只打包这些文件中用到的样式 new PurgeCSSPlugin({ paths: globAll.sync( [ `${path.join(__dirname, "../src")}/**/*`, path.join(__dirname, "../public/index.html"), ], { nodir: true, } ), // 用 only 来指定 purgecss-webpack-plugin 的入口 // https://github.com/FullHuman/purgecss/tree/main/packages/purgecss-webpack-plugin only: ["dist"], safelist: { standard: [/^ant-/], // 过滤以ant-开头的类名,哪怕没用到也不删除 }, }), // 打包时生成gzip文件,减少nginx的gzip实时压缩负载 new CompressionPlugin({ test: /\.(js|css)$/, // 只生成css,js压缩文件 filename: "[path][base].gz", // 文件命名 algorithm: "gzip", // 压缩格式,默认是gzip threshold: 10240, // 只有大小大于该值的资源会被处理。默认值是 10k minRatio: 0.8, // 压缩率,默认值是 0.8 }), new CopyWebpackPlugin({ patterns: [ { from: path.join(__dirname, "../public/img"), to: "./img", }, { from: path.join(__dirname, "../public/favicon.svg"), to: ".", }, ], }), ], }); export default prodConfig;