浅谈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 相关文章推荐
Jquery 设置标题的自动翻转
Oct 03 Javascript
简洁短小的 JavaScript IE 浏览器判定代码
Mar 21 Javascript
javascript 节点遍历函数
Mar 28 Javascript
把字符串按照特定的字母顺序进行排序的js代码
Jan 28 Javascript
JavaScript中的关联数组问题
Mar 04 Javascript
jquery马赛克拼接翻转效果代码分享
Aug 24 Javascript
js简单时间比较的方法
Aug 02 Javascript
js中document.write和document.writeln的区别
Mar 11 Javascript
React注册倒计时功能的实现
Sep 06 Javascript
JavaScript中0、空字符串、'0'是true还是false的知识点分享
Sep 16 Javascript
浅谈webpack构建工具配置和常用插件总结
May 11 Javascript
Vue element-ui父组件控制子组件的表单校验操作
Jul 17 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 Ajax实现页面无刷新发表评论
2007/01/02 PHP
php实现概率性随机抽奖代码
2016/01/02 PHP
Yii2针对游客、用户防范规则和限制的解决方法分析
2016/10/08 PHP
js中apply方法的使用详细解析
2013/11/04 Javascript
如何实现textarea里的不同文本显示不同颜色
2014/01/20 Javascript
jQuery学习笔记之 Ajax操作篇(三) - 过程处理
2014/06/23 Javascript
JavaScript取得WEB安全颜色列表的方法
2015/07/14 Javascript
基于jQuery滑动杆实现购买日期选择效果
2015/09/15 Javascript
jQuery Collapse1.1.0折叠插件简单使用
2017/08/28 jQuery
JavaScript实现重力下落与弹性效果的方法分析
2017/12/20 Javascript
vue中axios解决跨域问题和拦截器的使用方法
2018/03/07 Javascript
js获取浏览器地址(获取第1个斜杠后的内容)
2019/09/03 Javascript
Layui实现数据表格中鼠标悬浮图片放大效果,离开时恢复原图的方法
2019/09/11 Javascript
Weex开发之WEEX-EROS开发踩坑(小结)
2019/10/16 Javascript
element-ui中dialog弹窗关闭按钮失效的解决
2020/09/22 Javascript
Javascript生成器(Generator)的介绍与使用
2021/01/31 Javascript
python查询mysql中文乱码问题
2014/11/09 Python
Python异常学习笔记
2015/02/03 Python
python利用matplotlib库绘制饼图的方法示例
2016/12/18 Python
python获取代理IP的实例分享
2018/05/07 Python
Python操作Sql Server 2008数据库的方法详解
2018/05/17 Python
对python Tkinter Text的用法详解
2018/10/11 Python
python 实现在tkinter中动态显示label图片的方法
2019/06/13 Python
pyqt5 键盘监听按下enter 就登陆的实例
2019/06/25 Python
美国运动鞋和运动服零售商:Footaction
2017/04/07 全球购物
HashMap和Hashtable的区别
2013/05/18 面试题
工程预算与管理应届生求职信
2013/10/06 职场文书
保安拾金不昧表扬信
2014/01/15 职场文书
原材料检验岗位职责
2014/03/15 职场文书
承诺书模板
2014/08/30 职场文书
2014银行领导班子四风对照检查材料思想汇报
2014/09/25 职场文书
培训讲师开场白
2015/06/01 职场文书
党支部季度考核意见
2015/06/02 职场文书
小学班主任培训心得体会
2016/01/07 职场文书
Python max函数中key的用法及原理解析
2021/06/26 Python
python单向链表实例详解
2022/05/25 Python