Webpack

88 阅读2分钟

webpack

webpack 的打包整体流程

1. 输入

从文件系统中读取代码

  • entry:用于定义项目的入口,webpack会从这些入口文件中找到所有文件
  • context: 定义项目的执行上下文

2.模块递归处理

调用Loader 转译Module内容,并将结果转换为AST,从中分析出模块依赖关系,进一步递归调用模块处理过程,直到所有依赖文件都处理完毕;

  • resolve: 用于配置模块路径的解析规则,可以帮助webpack更精确更高效找到指定模块;
  • module: 配置模块加载规则,loaders
  • externals: 申明资源之间的关系。用externals声明的外部资源,webpack会进行忽略。

3. 后处理

后处理:所有模块递归处理完毕后开会执行后处理,包括模块合并、注入运行时、产物优化等,最终输出Chunk 集合

  • optimization 用于控制如何优化产物包体积,scope hoisting,code splitting,代码混淆,代码压缩。
  • target 用于配置编译产物的目标环境,web,node,electron
  • mode dev prod 环境下的声明
  • output 输出,产出物

webpack 首先要根据输入配置找到项目的文件入口。根据模块递归处理规则逐一处理模块文件,处理的过程包括转译,依赖分析等模块处理完成后,再根据后处理规则,决定如何产出。

Webpack 的其他开发效率类

  • devtools 决定着我们 sourcemap 的生成规则
  • Devserver HMR
  • watch 模式,用于配置持续监听文件的变化
  • cache webpack 5 以后缓存编译信息

loader 的相关知识

babel-loader

css-loader

为啥有css loaders? 因为原生的webpack是不能识别css语法的,假如我们不做配置直接导入.css文件会失败。所以在webpack中处理css文件通常需要用到:

css-loader

它会将css翻译成类似 module.exports = ` ${css} `的JS代码,让CSS文件可以和JS一样作为资源。同时可以提供sourcemap,css-in-module,

style-loader

在具体的产物中,注入runtime代码,让这些代码将css注入到页面中

less/sass-loader

通过原本的less / sass 的解析器,解析然后生成css

postcss-loader

CSS界的babel

file-loader

经过file-loader 处理后,原始图片会被重命名并复制到产物文件夹,同时在代码里插入图片url

url-loader

对于小于阈值的图片,直接base 64编码

raw-loader

都不处理,直接拷贝,一般svg会用到

写一个less-loader

    const less = require('less');
    module.exports = function loader(source) {
      console.log(source);
      const callback = this.async();
      less.render(source, {
        sourceMap: {}
      }, function (err, res) {
        let { css, map } = res;
        console.log(source, css);
        callback(null, css, map)
      })
    }

plugin

常见的plugins

  • terser-webpack-plugin //压缩js
  • pnp-webpack-plugin //Yarn plug Play 插件
  • html-webpack-plugin //自动生成带有入口文件的index.html模板注入
  • mini-css-extract-plugin
  • define-plugin
  • friendly-error-webpack-plugin //友好的错误日志