这节把编译打包后的流程梳理一下,然后集中处理compile。

  之前忽略了一个点,如下:

new NodeEnvironmentPlugin().apply(compiler);
// 引入插件加载
if (options.plugins && Array.isArray(options.plugins)) {
compiler.apply.apply(compiler, options.plugins);
}
compiler.applyPlugins("environment");
compiler.applyPlugins("after-environment");
compiler.options = new WebpackOptionsApply().process(options, compiler);

  在compiler对象的fs模块挂载完后,会对传入的插件进行加载,这个过程在内置插件加载之前。

  插件部分单独讲解,所以这个地方先暂时略过。

  剩余流程如图:

  内置插件全部plugin完毕后,会检测编译的回调函数:

if (callback) {
if (typeof callback !== "function") throw new Error("Invalid argument: callback");
// 检测是否有watch选项
if (options.watch === true || (Array.isArray(options) && options.some(o => o.watch))) {
const watchOptions = Array.isArray(options) ? options.map(o => o.watchOptions || {}) : (options.watchOptions || {});
return compiler.watch(watchOptions, callback);
}
compiler.run(callback);
}

  vue-cli的脚手架生产模式的构建文件build.js中就很明显的传了一个回调函数:

webpack(webpackConfig, (err, stats) => { /**/ })

  这里的回调函数主要是输出一些打包信息,包括打包文件的状态、打包错误提示、打包完成提示等等。

  暂时不管这个回调,因此会直接返回compiler,回到预编译的webpack.js文件中。

  又回到了久违的bin/webpack.js,后面的流程简化后源码如下:

try {
compiler = webpack(options);
} catch (err) { /**/ }
// --progress用于输出打包信息
if (argv.progress) {
var ProgressPlugin = require("../lib/ProgressPlugin");
compiler.apply(new ProgressPlugin({
profile: argv.profile
}));
}
// 输出打包信息的回调函数
function compilerCallback(err, stats) { /**/ }
// 如果有watch则打包后进程持续进行监视
if (firstOptions.watch || options.watch) { /**/ }
// 直接编译
else
compiler.run(compilerCallback);

  在返回compiler对象后,此时还未进行打包操作,只是准备好了一切,剩余的几步如下:

1、检测--progress指令,该指令用于将进度输出到控制台

2、检测--watch指令或者配置文件中的watch参数,如果有,则打包完后持续检测相关文件,发生变动立即调用打包操作

3、没有配置watch则直接进行打包操作,打包完成后调用回调函数

  

  progress这个可以自己去尝试,可以想象成安装程序那个界面。

  watch指令作用如图:

  打包完进程并不会退出,当修改入口文件并保存后,会立即打包并刷新提示输出信息。

  这里先暂时不管watch。

  最后一步就是打包的操作:

compiler.run(compilerCallback);

  传入的回调函数只是负责输出打包信息,源码如下:

function compilerCallback(err, stats) {
// 非watch模式下清理缓存
if (!options.watch || err) {
compiler.purgeInputFileSystem();
}
// 错误处理
if (err) { /**/ }
// 输出打包信息
if (outputOptions.json) {
process.stdout.write(JSON.stringify(stats.toJson(outputOptions), null, 2) + "\n");
} else if (stats.hash !== lastHash) {
lastHash = stats.hash;
var statsString = stats.toString(outputOptions);
if (statsString)
process.stdout.write(statsString + "\n");
}
if (!options.watch && stats.hasErrors()) {
process.exitCode = 2;
}
}

  stats是打包后生成的信息,将其格式化后通过prcess,stdout.write输出,这个输出方式底层就是console.log,上面那个图中打包完成信息就是通过这行代码输出的。

  

  至此,所以与打包过程无关的操作都已经完事,剩下的内容都集中在compiler.run这个调用中。

.16-浅析webpack源码之编译后流程梳理的更多相关文章

  1. .2-浅析webpack源码之打包后文件

    先不进源码,分析一下打包后的文件,来一张图: 首先创建两个JS文件,内容如下: // config.js module.exports = { entry: './input.js', output: ...

  2. 从谷歌官网下载android 6.0源码、编译并刷入nexus 6p手机

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/fuchaosz/article/details/52473660 1 前言 经过一周的奋战,终于从谷 ...

  3. .3-浅析webpack源码之预编译总览

    写在前面: 本来一开始想沿用之前vue源码的标题:webpack源码之***,但是这个工具比较巨大,所以为防止有人觉得我装逼跑来喷我(或者随时鸽),加上浅析二字,以示怂. 既然是浅析,那么案例就不必太 ...

  4. 【Android 系统开发】CyanogenMod 13.0 源码下载 编译 ROM 制作 ( 手机平台 : 小米4 | 编译平台 : Ubuntu 14.04 LTS 虚拟机)

                 分类: Android 系统开发(5)                                              作者同类文章X 版权声明:本文为博主原创文章 ...

  5. .17-浅析webpack源码之compile流程-入口函数run

    本节流程如图: 现在正式进入打包流程,起步方法为run: Compiler.prototype.run = (callback) => { const startTime = Date.now( ...

  6. .5-浅析webpack源码之入口函数

    从convert-argv出来后,目前进度在这: yargs.parse(process.argv.slice(2), (err, argv, output) => { // ... // 从这 ...

  7. 从Webpack源码探究打包流程,萌新也能看懂~

    简介 上一篇讲述了如何理解tapable这个钩子机制,因为这个是webpack程序的灵魂.虽然钩子机制很灵活,而然却变成了我们读懂webpack道路上的阻碍.每当webpack运行起来的时候,我的心态 ...

  8. 鸿蒙内核源码分析(编译过程篇) | 简单案例窥视GCC编译全过程 | 百篇博客分析OpenHarmony源码| v57.01

    百篇博客系列篇.本篇为: v57.xx 鸿蒙内核源码分析(编译过程篇) | 简单案例窥视编译全过程 | 51.c.h.o 编译构建相关篇为: v50.xx 鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙 ...

  9. 鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙看这篇或许真的够了 | 百篇博客分析OpenHarmony源码 | v50.06

    百篇博客系列篇.本篇为: v50.xx 鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙防掉坑指南 | 51.c.h.o 编译构建相关篇为: v50.xx 鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙防掉 ...

随机推荐

  1. Monkey学习网址

    http://***/2015/12/24/Android-Monkey-Test/ http://bbs.pediy.com/showthread.php?t=189584 http://***/2 ...

  2. 缓存中使用的ReentrantReadWriteLock锁

    java中提供了lock锁,简便了设计缓存,下面程序主要是使用读写锁的应用.... import java.util.HashMap; import java.util.Map; import jav ...

  3. Kali Linux渗透测试实战 2.1 DNS信息收集

    目录 2.1 DNS信息收集1 2.1.1 whois查询3 2.1.2 域名基本信息查询4 Dns服务器查询4 a记录查询4 mx记录查询5 2.1.3 域名枚举5 fierse 5 dnsdict ...

  4. JS学习笔记9_JSON

    1.JSON概述 JavaScript Object Natation,js对象表示法,(像XML一样)是一种数据格式,它与js有相同的语法形式 P.S.一点小历史:JSON之父是道格拉斯,<J ...

  5. C# 用户选择单个压缩-系统自带压缩

    //用C#自带的压缩,最少要.net4.5或以上,先增加引用 System.IO.Compression.FileSystem // FolderBrowserDialog dlg = new Fol ...

  6. 林纳斯·托瓦兹和Linux行为准则:揭穿7个谬论

    欢迎访问网易云社区,了解更多网易技术产品运营经验. 作者:史蒂芬·沃恩·尼古斯(Steven J.Vaughan-Nichols),从事Linux开源工作 时间:格林威治标准时间2018年9月25日— ...

  7. Python FTP文件传输

    FTP Server import socket import struct from concurrent.futures import ThreadPoolExecutor import json ...

  8. IIS 301重定向 报错 地址后面有eurl.axd

    错误发生的原因是当ASP.NET检测到Web站点配置为使用ASP.NET 4.0,本地ASP.NET 4.0 的组件会传递一个不能扩展的 URL到ASP.NET的管理程序作进一步处理.但是,如果一个低 ...

  9. MVC3学习:利用jquery+ajax生成二维码(支持中文)

    二维码越来越热火了,做电子商务网站,不做二维码,你就OUT了. 一.下载DLL文件(ThoughtWorks.QRCode.dll),并在项目中引用.点此下载 如果你还不知道什么是QRCode二维码, ...

  10. Googel 浏览器 模拟发送请求工具--Advanced REST Client

    Advanced REST Client是 Chrome 浏览器下的一个插件,通过它可以发送 http.https.WebSocket 请求.在 Chrome 商店下搜索 Advanced REST  ...