webpack实际应用配置

在实际应用中,可能不再是spa,需要生成多个html;css文件太多打包到js中导致js比较大;需要引入第三方插件或者自己写的函数;配合react框架或者vue框架的时候,需要做些相关配置,以解决上述问题

一、多入口配置

默认情况下,打包后是只生成一个html文件的;在一些情况下,我们是需要打包后产生多个html文件。那我们就需要指定多个入口文件,并修改output的filenme设置

1.1首先我们需要指定多个入口,让webpck执行打包时从entry设置的几个js中开始解析

entry: {
    index: path.join(srcPath,'index.js'),
    other: path.join(srcPath,'other.js')
}
复制代码

1.2修改输出文件名设置,因为对于不同js打包后的结果,为了输出文件不重名;我们需要将filename用变量表示

output: {
    filename: '[name].[contentHash:8].js',//name的值对应于entry对象的属性名
    path: disPath,
}
复制代码

1.3在plugins数组中存放多个HtmlWebpackPlugin实例,HtmlWebpackPlugin的作用就是用来生成html文件并引入对应js的

plugins: [
    new HtmlWebpckPlugin({
        template: path.join(srcPth,'index.html'),
        filename: 'index.html',
        chunks: ['index']//chunks指定生成的html文件引入什么什么名称的js,如果不配置chunks,会把生成的js都引入进来,这里要考虑到代码分割后,需要引入被分割的js
    }),
    new HtmlWebpackPlgin({
        template: path.join(srcPth,'other.html'),
        filename: 'other.html',
        chuncks: ['other']//
    })
]
复制代码

二、抽离css文件

在不配置抽离css文件的情况下,打包后css样式会在打包后的js中,这样的话,只有当程序运行了js,js执行了将样式插入到body里的style标签中,样式才会起作用;而且当css不变的情况下,改变js,css同样要跟着被打包到js中,打包时比较耗费性能。 为了使css可以不依赖js执行,提升打包性能,选择抽离css文件比较好,抽离后的css文件在html中是以link标签引入进来的

2.1在plugins中配置MiniCssExtractPlugin

plugins: [
    //抽离css文件,指定抽离出的css文件的存放目录
    new MiniCssExtractPlugin({
        filename: 'css/main.[contentHash:8].css'
    })
]
复制代码

2.2 使用loader解析css/less文件,不再直接使用style-loader将css内容插入到style标签中了,而是使用MiniCssExtractPlugin抽离文件

rules: [
    //抽离css
    {
        test: /\.css$/,
        loader: [
            MiniCssExtractPlugin.loader,
            'css-loader',
            'postcss-loader'
        ]
    },
    //抽离less 先将less转css
    {
        test: /\.less$/,
        loader: [
            MiniCssExtractPlugin.loader,
            'css-loader',
            'less-loader',
            'postcss-loader'
        ]
    }
]
复制代码

2.3对抽离出的css文件进行压缩

optimization: {
    //压缩css
    minimizer: [
        new TerserJSPlugin({}),
        new OptimizeCssAssetsPlugin({})
    ]
}
复制代码

三、抽离公共代码

在实际开发当中,经常会有多个模块都引入了同一段公共代码,在打包时,如果每个模块都包含公共代码,是比较浪费空间的。我们需要将公共部分抽离出来,各个模块之间去进行相互引用,能减少加载和执行的次数。而且如果公共模块是第三方提供的模块,体积 比较大,我们是需要将它单独打包的,不然我们只是改变了业务代码,第三方模块也要跟着被重新打包进js中,是比较耗费性能的。下面分别对第三方模块和公共模块进行处理

3.1在optimization中使用splitChunks

    optimization: {
        splitChunks: {
            chunks: 'all',
            /**
              initial 入口chunk,对于异步导入的文件不处理,
              async 只对异步导入的文件处理
              all 全部chunk
            */
            //缓存分组
            cacheGroups: {
                //处理第三方模块
                vendor: {
                    name: 'vendor',//chunk名称
                    priority: 1, //优先级
                    test: /node_modules/,
                    minSize: xx,//大小限制,如果小于限制就不会被抽离
                    minChunks: 1 //最少复用过几次,只要被引用过一次,就要被抽离
                },
                //处理公共模块
                common: {
                    name: 'common',//chunk名称
                    priority: 0,//优先级
                    minSize: xx,公共模块的大小限制
                    minChunks: 2//公共模块最少复用过几次
                } 
            }
        }
    }
复制代码

四、处理jsx

npm install --save-dev @babel/preset-react
复制代码

安装后,在.babelrc文件中设置

{
    "presets": ["@babel/preset-react"]
}
复制代码

五、处理vue文件

使用vue-loader即可

rules: [
    {
        test: /\.vue$/,
        loader: ['vue-loader'],
        include: srcPath
    }
]
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享