提及webpack,相信对于前端工程师们而言早已经不是什么新鲜的事物。可是因为webpack有着较为复杂和灵活的配置项,因此给人的第一感受是难以彻底掌握。前端
此次就跟你们分享一下有关webpack构建过程的相关知识,但愿对你们进一步理解webpack有所帮助。webpack
本次分析的对象是webpack(v3.6.0),这是gayhub地址 摸我git
因为webpack的内容实在太多,一会儿讲太多东西容易懵逼,咱们此次就从最最最简单的例子开始讲起。github
如下是我写的一个炒鸡简单的例子:web
// webpack.config.js var path = require("path"); module.exports = { entry: './src/index.js', output: { path: path.resolve(__dirname, "build"), filename: "bundle.js" } }
假设咱们的工做目录下有一个这样的webpack.config.js文件,那么当咱们执行webpack命令的时候【前提是你已经安装了webpack】,那么首先会执行的是 /bin 目录下的webpack.js前端工程师
OK,做为入口文件,咱们首先要分析的就是: /bin/webpack.jsapp
这个文件主要作了如下几件事:函数
var webpack = require("../lib/webpack.js"); ... ... try { // 这里的options就是转换以后的参数,convert-argv文件主要负责这些工做 // 获得compiler对象 compiler = webpack(options); }catch(e) { ... ... } ... ... // 执行编译 compiler.run(compilerCallback)
因为这里讲的例子比较简单,不涉及到其余参数相关的内容,感兴趣的同窗能够进一步了解参数处理的部分,这里就很少作解释了。重点咱们仍是看一下这个编译的过程。ui
做为complier的入口文件,咱们接下来看一下: /lib/webpack.jsthis
接下来咱们先分析WebpackOptionsApply类:/lib/WebpackOptionsApply.js
从上面看到,在编译以前,webpack会先实例化WebpackOptionsApply类,而后调用其process方法
咱们看到process方法其实就是注册了N多个插件,而后触发了某些插件的回调函数
首先判断options.target,若是值为“web”的话(这种状况是最多见的,其余状况的逻辑也是相似的),则注册插件JsonpTemplatePlugin【注册“this-compilation”回调】,FunctionModulePlugin【注册“compilation”回调】,NodeSourcePlugin【注册“compilation” & “after-resolver”回调】,LoaderTargetPlugin【注册“compilation”回调】。
以上就是WebpackOptionsApply实例调用process的全过程
在/bin/webpack中,获得的是/lib/webpack返回的compiler对象,最后调用compiler对象的run方法。
做为编译过程的核心类,咱们接下来看看Compiler这个类:/lib/Compiler.js
咱们看到Compiler类继承自Tapable类 github地址
Tapable类提供了一种调用插件的方式,webpack所有插件都是基于这种方式来注册和调用的。
Tapable类定义了plugin方法,用于注册插件,将插件及其回调函数以key-value的形式保存在内部_plugins={}对象中;
又定义了applyPlugins,applyPluginsWaterfall等方法来触发插件的回调函数。其实就是一个订阅-发布模式的实现。
因此当Compiler类继承Tapable类后,也一样具备注册插件和触发回调函数的功能。
接下来看看Compiler中的run方法
调用compile方法,进入compile过程
触发“make”回调函数
这就是compiler的run方法的主要内容分析
以上就是webpack简单的构建流程的分析。哈哈今天就分享到这里,但愿你们喜欢,祝你们周末愉快啊。。。