webpack配置详解 - 34.optimization

optimization来对打包结果进行优化(生产环境优化)。

文档: https://webpack.docschina.org/configuration/optimization/

1.文件结构

 

2.代码

a.js

export function add(x, y) {
    return x + y
}

index.js

// webpackChunkName:指定生成的文件名
import(/*webpackChunkName: 'a'*/'./a')
    .then(({add}) => {
        console.log('res:', add(1, 2))
    })
    .catch((err) => {
        console.log('err:', err)
    })

webpack.config.js

const {resolve} = require('path')
const htmlWebpackPlugin = require('html-webpack-plugin')
const terserWebpackPlugin = require('terser-webpack-plugin')

module.exports = {
    entry: './src/js/index.js',
    output: {
        filename: "js/[name].[contenthash:10].js",
        path: resolve(__dirname, 'build'),
        // 修改生成chunk文件的名字
        chunkFilename: "js/[name].[contenthash:10]_chunk.js"
    },
    module: {
        rules: [
            {
                test: /\.css$/,
                use: ['style-loader', 'css-loader']
            },
        ]
    },
    plugins: [new htmlWebpackPlugin()],
    // optimization 要在生产环境下使用
    mode: 'production',
    //解析模块规则
    resolve: {
        alias: {
            $css: resolve(__dirname, 'src/css')
        },
        extensions: ['.js', '.json', '.jsx', '.css'],
        modules: [resolve(__dirname, '../../node_modules'), 'node_modules']
    },
    optimization: {
        splitChunks: {
            chunks: 'all',
            //默认值,可以不写
            /*miniSize: 30 * 1024,//分割的 chunk 最小为30kb (文件小于30kb就不分割)
            maxSize: 0,//最大没有限制
            minChunks: 1,//被提取的 chunk 最少被引用以1次
            maxAsyncRequests: 5,//按需加载时,并行加载的文件的最大数量
            maxInitialRequests: 3,//入口js文件,最大并行请求数量
            automaticNameDelimiter: '~',//命名连接符
            name: true,//可以使用命名规则
            //分割 chunk 的组
            cacheGroups: {
                //node_modules 文件会被打包到 vendors 组的 chunk 中。 --> vendors~xxx.js
                //满足上面的公共规则, 如: 大小超过30kb,至少被引用一次。
                vendors: {
                    test: /[\\/]node_modules[\\/]/,
                    // 打包的优先级
                    priority: -10
                },
                default: {
                    //要提取的chunk至少被引用两次
                    minChunks: 2,
                    //打包的优先级
                    priority: -20,
                    //如果当前被打包的模块,和之前已经被提取的模块是同一个,就会复用,而不是重新打包
                    reuseExistingChunk: true,
                }

            }*/

        },
        // 将当前模块的记录其他模块的hash单独打包为一个文件 runtime
        // 解决:修改a文件导致b文件的contenthash变化
        runtimeChunk: {
            name: entrypoint => `runtime-${entrypoint.name}`
        },
        //配置生产环境的压缩方案: js / css
        minimizer: [
            new terserWebpackPlugin({
                // 开启缓存
                cache: true,
                //开启多进程打包
                parallel: true,
                //启动source-map
                sourceMap: true
            })
        ]
    }
}

 

3.打包 

$ webpack

 

 end~

 

posted @ 2022-09-09 13:45  Evengod  阅读(481)  评论(0编辑  收藏  举报