浅谈webpack和webpack-cli模块源码分析


Posted in Javascript onJanuary 19, 2020

webpack4与webpack3的区别

webpack4.0 以后,似乎执行方式就发生了改变,不再是 webpack 一波流,而是多了一个 webpack-cliwebpack3webpack-cli是合在webpack中。所以在命令行运行 webpack 命令的同时,会提示让你再装一个 webpack-cli

执行脚本到打包结束流程

1、当我们安装了webpack模块后,就会在node_modules/.bin目录下生成一个webpack、webpack.cmd,webpacklinux下的命令脚本,webpack.cmdwindows下命令脚本,webpack.cmd可以在windows系统上直接运行。

每当执行npm run,就会自动新建一个 Shell,在这个 Shell 里面执行指定的脚本命令。因此,只要是 Shell(一般是 Bash)可以运行的命令,就可以写在 npm 脚本里面。

比较特别的是,npm run新建的这个 Shell,会将当前目录的node_modules/.bin子目录加入PATH变量(软连接),执行结束后,再将PATH变量恢复原样。

这意味着,当前目录的node_modules/.bin子目录里面的所有脚本,都可以直接用脚本名调用,而不必加上路径。比如,当前项目的依赖里面有 Mocha,只要直接写mocha test就可以了。

执行一下命令
cd .\node_modules\.bin\

浅谈webpack和webpack-cli模块源码分析

2、package.jsonscript配置dev: webpack --mode development,当执行npm run dev相当于执行webpack --mode development

浅谈webpack和webpack-cli模块源码分析

webpack.cmd执行时会判断当前目录下是否存在node执行程序,如果存在就使用当前node进程执行node_modules/webpack/bin/webpack.js,如果当前目录下不存在node进程,则使用全局(也就是本地)node执行node_modules/webpack/bin/webpack.js文件

3、node_modules/webpack/bin/webpack.js首先会判断是否安装了webpack-cli模块,如果没有安装webpack-cli模块就会引导用户去安装,如果已经安装了webpack-cli模块,就会去执行node_modules\webpack-cli\bin\cli.js

CLIs = [
 {
  name: "webpack-cli",
  package: "webpack-cli",
  binName: "webpack-cli",
  alias: "cli",
  installed: isInstalled("webpack-cli"),
  recommended: true,
  url: "https://github.com/webpack/webpack-cli",
  description: "The original webpack full-featured CLI."
 },
 {
  // some coding
 }
];

const installedClis = CLIs.filter(cli => cli.installed);

if (installedClis.length === 0) {
 // some coding
 const question = `Do you want to install 'webpack-cli' (yes/no): `;
 // some coding
} else if (installedClis.length === 1) {
 const path = require("path");
 const pkgPath = require.resolve(`${installedClis[0].package}/package.json`);
 const pkg = require(pkgPath);
 console.log(path.resolve(
  path.dirname(pkgPath),
  pkg.bin[installedClis[0].binName]
 )) // E:\项目\webpack学习\node_modules\webpack-cli\bin\cli.js
 require(path.resolve(
  path.dirname(pkgPath),
  pkg.bin[installedClis[0].binName]
 ));
}

4、node_modules\webpack-cli\bin\cli.js中会require("webpack")引入webpack模块(/node_modules/lib/webpack.js)得到一个webpack函数,运行webpack函数,返回一个compiler对象,执行compiler中的run,开始编译

// node_modules/bin/cli.js
(function() {
 // 一大堆配置
 // something code ...
 yargs.parse(process.argv.slice(2), (err, argv, output) => {
  // something code ...
  function processOptions(options) {
   // 各种if else 过滤和配置
   // something code...
   const webpack = require("webpack");
   let compiler;
   try {
    // 运行webpack函数,返回一个compiler对象
    compiler = webpack(options); 
   } catch (err) {
    // something code...
   }
   // 执行compiler中的run,开始编译。
   compiler.run(compilerCallback);
  }
  processOptions(options);
 })
 // something code ...

})()
// node_modules/webpack/lib/webpack.js
const webpack = (options, callback) => {
 // some coding
 return compiler;
}
exports = module.exports = webpack;

参考
npm 脚本的原理:https://3water.com/article/148443.htm
webpack-cli源码解析:https://www.jianshu.com/p/ec8e70d362ef

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
用javascript做拖动布局的思路
May 31 Javascript
jQuery 中国省市两级联动选择附图
May 14 Javascript
JavaScript中判断原生函数检查function是否是原生代码
Sep 09 Javascript
javascript生成img标签的3种实现方法(对象、方法、html)
Dec 25 Javascript
javascript实现全角转半角的方法
Jan 23 Javascript
jQuery validate插件功能与用法详解
Dec 15 Javascript
全面解析Node.js 8 重要功能和修复
Jun 02 Javascript
javascript将list转换成树状结构的实例
Sep 08 Javascript
vue里面父组件修改子组件样式的方法
Feb 03 Javascript
JavaScript中的事件与异常捕获详析
Feb 24 Javascript
Vue+Element UI+vue-quill-editor富文本编辑器及插入图片自定义
Aug 20 Javascript
layui原生表单验证的实例
Sep 09 Javascript
js原生map实现的方法总结
Jan 19 #Javascript
Node.js操作MongoDB数据库实例分析
Jan 19 #Javascript
JS运算符简单用法示例
Jan 19 #Javascript
Vue 微信端扫描二维码苹果端却只能保存图片问题(解决方法)
Jan 19 #Javascript
JS基础之逻辑结构与循环操作示例
Jan 19 #Javascript
js实现图片上传到服务器和回显
Jan 19 #Javascript
ES6如何用一句代码实现函数的柯里化
Jan 18 #Javascript
You might like
PHP中返回引用类型的方法
2015/04/03 PHP
php创建多级目录与级联删除文件的方法示例
2019/09/12 PHP
jquery中prop()方法和attr()方法的区别浅析
2013/09/06 Javascript
js带按钮的提示框可供选择示例代码
2013/09/17 Javascript
jQuery之DOM对象和jQuery对象的转换与区别分析
2015/01/08 Javascript
EasyUI实现第二层弹出框的方法
2015/03/01 Javascript
JavaScript实现图片DIV竖向滑动的方法
2015/04/25 Javascript
AngularJS的一些基本样式初窥
2015/07/27 Javascript
JavaScript模拟push
2016/03/06 Javascript
JavaScript数据结构学习之数组、栈与队列
2017/05/02 Javascript
原生JS实现的简单小钟表功能示例
2018/08/30 Javascript
详解微信小程序scroll-view横向滚动的实践踩坑及隐藏其滚动条的实现
2019/03/14 Javascript
vue轮播组件实现$children和$parent 附带好用的gif录制工具
2019/09/26 Javascript
解决vue单页面应用打包后相对路径、绝对路径相关问题
2020/08/14 Javascript
[01:36:57]【09DOTA2第一视角】小骷髅
2014/04/16 DOTA
Python编程实现微信企业号文本消息推送功能示例
2017/08/21 Python
Python collections.defaultdict模块用法详解
2020/06/18 Python
python编程的核心知识点总结
2021/02/08 Python
用python 绘制茎叶图和复合饼图
2021/02/26 Python
阿拉伯世界最大的电子商务网站:Souq沙特阿拉伯
2016/10/28 全球购物
英国天然抗衰老护肤品品牌:Nakin Skin Care
2019/04/16 全球购物
UDP协议功能
2013/01/06 面试题
大学四年职业生涯规划书范文
2014/01/02 职场文书
高中体育教学反思
2014/01/29 职场文书
日语专业个人求职信范文
2014/02/02 职场文书
中式结婚主持词
2014/03/14 职场文书
企业法人代表证明书
2014/09/27 职场文书
2014年银行个人工作总结
2014/12/05 职场文书
九九重阳节致辞
2015/07/31 职场文书
大学生军训感言
2015/08/01 职场文书
2016年校园社会综合治理宣传月活动总结
2016/03/16 职场文书
民政局2016年“六一”儿童节慰问活动总结
2016/04/06 职场文书
人事行政部各岗位职责说明书!
2019/07/15 职场文书
图文详解matlab原始处理图像几何变换
2021/07/09 Python
spring cloud gateway中如何读取请求参数
2021/07/15 Java/Android
Python利用Turtle绘制哆啦A梦和小猪佩奇
2022/04/04 Python