Webpack高级配置

ppgo8 于 2023-06-28 发布

高级配置

高级配置就是进行Webpack优化,让代码在编译/运行时性能更好.

提升开发体验

为什么

浏览器提示代码的错误的位置是构建后的代码,不方便开发.

是什么

SourceMap(源代码映射)是一个用来生成源代码与构建后代码意义映射的文件的方案.

它会生成一个xxx.map文件,当构建后代码出错了,会通过这个文件从构建代码出错的位置找到映射后源代码出错的位置,从而让浏览器提示源代码文件出错的位置,帮助程序员快速会遭到错误根源.

怎么没用

  1. 配置

    image-20230628115553238

提升打包构建速度

项目体积大,打包速度就很慢,所以需要使用各种手段提升打包构建速度.

HotModuleRepalcement

热模块替换/热替换

为什么

开发时修改其中一个模块的代码,Webpack默认会将所有模块全部重新打包编译,速度很慢.

所以需要做到修改了某个模块的代码,就只打包修改代码的模块,其他模块不变,一次提高速度.

适用场景:只能用在开发模式,生产模式下必须全部重新打包,

是什么

HotModuleRepalcement(HMR/热替换模块)

在程序运行中,替换/添加/删除讴歌模块,而无需加载刷新整个页面.

怎么用

在webpack5默认开启

配置工具

devServer:{
    hot:true // 开启HMR
}

css样式style-loader直接支持热替换

开启这个功能后,js也可能会全部重新加载而不是热替换,js想使用热替换,需要在入口js里面设置以下在开发中实际不写

if(module.hot){
    // 判断是否支持热模块功能
    module.hot.accept(js模块名1)
    ...
    module.hot.accept(js模块名2)
    
}

上面js的方式如果有100个模块就很复杂,所以在以后的开发中使用项目的loader如vue-laoder,react-hot-loader这两个loader提供热替换工鞥

Oneof

为什么

打包时每个文件都会经过所有 loader 处理,所有loader都要过一遍,速度比较慢.

是什么

只匹配一个loader,其他不匹配了

怎么用

include/Excluede

为什么

开发时我们需要使用第三方的库或插件,所有文件都下载到 node_modules 中了。而这些文件是不需要编译可以直接使用的。

所以我们在对 js 文件处理时,要排除 node_modules 下面的文件。

是什么

二者只能写一个

怎么用

只针对第三方js文件排除或包含,而样式文件不考虑这个问题.

Cache缓存

为什么

开发时js文件占的比重比较大,而js打包每次都要经过 Eslint 检查 和 Babel 编译,速度比较慢.所以可以缓存之前的 Eslint 检查 和 Babel 编译结果,==下一次打包时==:

是什么

对 js文件的Eslint 检查 和 Babel 编译结果进行缓存。

怎么用

Thead多进程

为什么

是什么

怎么用

  1. 获取CPU核数

    能启动的进程的最大数量就是CPU的核数

    // nodejs核心模块,直接使用
    const os = require("os");
    // cpu核数
    const threads = os.cpus().length;
    
  2. 下载包

    npm i thread-loader -D
    
  3. 修改配置

    // 获得核数
    const os = require("os");
    const threads = os.cpus().length; // cpu核数
    
    // 生产模式
    // module模块下
    {
        test: /\.js$/,
        exclude: /node_modules/, 
        use: [
          {
             // 开启多进程 
            loader: "thread-loader",  
            options: {
              works: threads, // 进程数量
            },
      ]
    }  
    
    // 针对ESLint的多线程
    new ESLintPlugin({
          // 略
          threads, // 开启多进程和设置进程数量
    })   
    
    // 针对terser压缩的缓存
    const TerserWebpackPlugin = require("terser-webpack-plugin");
    optimization: {
        // 压缩的操作
        minimizer: [
          new CssMinimizerPlugin(),
          new TerserWebpackPlugin({
            parallel: threads, // 开启多进程和设置进程数量
          }),
        ]
    }
    

减少代码体积

Tree Shaking

webpack已经默认开启了这个功能。

优化代码运行性能

Babel

将babel添加的辅助代码作为一个独立模块,来避免重复引入。

Image Minimizer

压缩图片

优化代码运行性能

code spilt

提取重复代码

适用多入口文件

按需加载,动态导入

Preload / Prefetch

Core-js

它能将 ES6 的一些语法进行编译转换,比如箭头函数、点点点运算符等。但是如果是 async 函数、promise 对象、数组的一些方法(includes)等,它没办法处理。 core-js 是专门用来做 ES6 以及以上 API 的 polyfill

PWA

渐进式网络应用程序(progressive web application - PWA):是一种可以提供类似于 native app(原生应用程序) 体验的 Web App 的技术。