细说 webpack 之流程篇

556 查看

tb1_znhnxxxxxxbxpxxxxxxxxxx-900-500

引言

目前,几乎所有业务的开发构建都会用到 webpack 。的确,作为模块加载和打包神器,只需配置几个文件,加载各种 loader 就可以享受无痛流程化开发。但对于 webpack 这样一个复杂度较高的插件集合,它的整体流程及思想对我们来说还是很透明的。那么接下来我会带你了解 webpack 这样一个构建黑盒,首先来谈谈它的流程。

准备工作

1. webstorm 中配置 webpack-webstorm-debugger-script

在开始了解之前,必须要能对 webpack 整个流程进行 debug ,配置过程比较简单。

先将 webpack-webstorm-debugger-script 中的 webstorm-debugger.js 置于webpack.config.js 的同一目录下,搭建好你的脚手架后就可以直接 Debug 这个 webstorm-debugger.js 文件了。

2. webpack.config.js 配置

估计大家对 webpack.config.js 的配置也尝试过不少次了,这里就大致对这个配置文件进行个分析。

除此之外再大致介绍下 webpack 的一些核心概念:

  • loader:能转换各类资源,并处理成对应模块的加载器。loader 间可以串行使用。
  • chunk:code splitting 后的产物,也就是按需加载的分块,装载了不同的 module。

对于 module 和 chunk 的关系可以参照 webpack 官方的这张图:

tb1b0dxnxxxxxxdxfxxxxxxxxxx-368-522

  • plugin:webpack 的插件实体,这里以 UglifyJsPlugin 为例。

    在 webpack 中你经常可以看到 compilation.plugin(‘xxx’, callback) ,你可以把它当作是一个事件的绑定,这些事件在打包时由 webpack 来触发。
3. 流程总览

在具体流程学习前,可以先通过这幅 webpack 整体流程图 了解一下大致流程(建议保存下来查看)。

tb1gvgfnxxxxxatapxxxxxxxxxx-4436-4244

shell 与 config 解析

每次在命令行输入 webpack 后,操作系统都会去调用 ./node_modules/.bin/webpack 这个 shell 脚本。这个脚本会去调用 ./node_modules/webpack/bin/webpack.js 并追加输入的参数,如 -p , -w 。(图中 webpack.js 是 webpack 的启动文件,而 $@ 是后缀参数)

tb1kvfbnxxxxxarxpxxxxxxxxxx-500-111

在 webpack.js 这个文件中 webpack 通过 optimist 将用户配置的 webpack.config.js 和 shell 脚本传过来的参数整合成 options 对象传到了下一个流程的控制对象中。

1. optimist

和 commander 一样,optimist 实现了 node 命令行的解析,其 API 调用非常方便。