3.webpack4生产环境配置

343 阅读1分钟

提取css为单独文件并压缩css

依赖:mini-css-extract-plugin
     optimize-css-assets-webpack-plugin
const miniCssExtractPlugin = require('mini-css-extract-plugin')
const optimizeCssAssetsWebpackPlugin = require('optimize-css-assets-webpack-plugin')

module: {
       rules: [
           {
               test: /\.css$/,
               use: [
                   // 创建style标签,将js中的css放入插到页面中
                   // 缺点:样式放在js中页面会出现闪屏
                   // 'style-loader', 
                   // 这个loader取代style-loader,作用:提取js中的css成单独文件
                   miniCssExtractPlugin.loader,
                   'css-loader'
               ]
           }
       ]
   },
   plugins: [
       new miniCssExtractPlugin({
           // 对输出的文件进行重命名
           filename: 'css/built.css'
       }),
       new optimizeCssAssetsWebpackPlugin()
   ],

css兼容性处理

依赖:postcss-loader postcss-preset-env

package.json: 跟devDependencies同级
    "browserslist": {
             // 开发环境 --> 手动设置node环境变量:process.env.NODE_ENV = 'development'
                "development": [
                "> 1%",
                "last 4 versions"
                ],
                // 生产环境:默认生产环境
                "procution": [
                ">0.2%",
                "not ie<=7",
                "not op_mini all"
                ]
            }
            
postcss-preset-env: 帮postcss找到在package.json中的browserslist里面的配置,通过配置加载指定的css兼容性样式
  module: {
        rules: [{
            test: /\.css$/,
            use: [
                miniCssExtractPlugin.loader,
                'css-loader',
                {
                    loader: 'postcss-loader',
                    options: {
                        ident: 'postcss',
                        plugins: [
                            require('postcss-preset-env')()
                        ]
                    }
                }
            ]
        }]
    },

js兼容性处理

依赖:babel-loader @babel/core @babel/preset-env

基本兼容性处理

问题: 只能转换基本语法, 如promise高级语法不能转换
   {
                test: /\.js$/,
                exclude: /node_modules/,
                loader: 'babel-loader',
                options: {
                    // 预设: 指示babel做怎么样的兼容性处理
                    // 例如这个可以转换箭头函数为普通函数 可以在ie低版本上执行 
                   presets: ['@babel/preset-env']
                }
            }

全部兼容性处理

依赖:@babel/polyfill
     只需要在js中直接引入就可,import '@babel/polyfill'
问题:我只要解决部分兼容性问题,但是将所有兼容性代码全部引入,体积太大了

不清楚这个配置用不用,有空测试一下

 {
              test: /\.js$/,
              exclude: /node_modules/,
              loader: 'babel-loader',
              options: {
                  // 预设: 指示babel做怎么样的兼容性处理
                  // 例如这个可以转换箭头函数为普通函数 可以在ie低版本上执行 
                 presets: ['@babel/preset-env']
              }
          }

按需兼容

依赖: core-js
 @babel/preset-env跟core-js结合就可以完成全部的js处理,2因为打包后体积过大,不推荐
{
               test: /\.js$/,
               exclude: /node_modules/,
               loader: 'babel-loader',
               options: {
                   presets: [
                       [
                           '@babel/preset-env',
                           {
                               // 按需加载
                               useBuiltIns: 'usage',
                               // 指定core-js版本
                               corejs: {
                                   version: 3
                               },
                               // 指定兼容性做到那个版本的浏览器
                               targets: {
                                   chrome: '60',
                                   firefox: '60',
                                   ie: '9',
                                   safari: '10',
                                   edge: '17'
                               }
                           }
                       ]
                   ]
               }
           }

js和html压缩

 js压缩: mode设置为production
 html压缩:
      plugins: [
        new HtmlWebpackPlugin({
            template: './src/index.html',
            minify: {
                // 移除空格
                collapseWhitespace: true,
                // 移除注释
                removeComments: true
            }
        })
    ]