浅谈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 相关文章推荐
JS控件autocomplete 0.11演示及下载 1月5日已更新
Jan 09 Javascript
iphone safari不支持position fixed的解决方法
May 04 Javascript
解决js正则匹配换行问题实现代码
Dec 10 Javascript
jquery判断元素的子元素是否存在的示例代码
Feb 04 Javascript
Bootstarp基本模版学习教程
Feb 01 Javascript
Dropify.js图片宽高自适应的方法
Nov 27 Javascript
使用Vue自定义指令实现Select组件
May 24 Javascript
微信小程序使用二次贝塞尔曲线画波浪
Dec 25 Javascript
js核心基础之构造函数constructor用法实例分析
May 11 Javascript
基于JavaScript获取url参数2种方法
Apr 17 Javascript
jQuery 添加元素和删除元素的方法
Jul 15 jQuery
Vue项目利用axios请求接口下载excel
Nov 17 Vue.js
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
C# Assembly类访问程序集信息
2009/06/13 PHP
关于使用key/value数据库redis和TTSERVER的心得体会
2013/06/28 PHP
PHP函数实现分页含文本分页和数字分页
2014/10/23 PHP
PHP循环遍历数组的3种方法list()、each()和while总结
2014/11/19 PHP
PHP中的自动加载操作实现方法详解
2019/08/06 PHP
避免 showModalDialog 弹出新窗体的原因分析
2010/05/31 Javascript
关于jquery动态增减控件的一些想法和小插件
2010/08/01 Javascript
使用js检测浏览器的实现代码
2013/05/14 Javascript
JQuery选择器绑定事件及修改内容的方法
2015/01/23 Javascript
jQuery菜单插件superfish使用指南
2015/04/21 Javascript
如何用JS判断两个数字的大小
2016/07/21 Javascript
Javascript中引用类型传递的知识点小结
2017/03/06 Javascript
bootstrap插件treeview实现全选父节点下所有子节点和反选功能
2017/07/21 Javascript
Javascript 实现 Excel 导入生成图表功能
2018/10/22 Javascript
支付宝小程序tabbar底部导航
2018/11/06 Javascript
NodeJs之word文件生成与解析的实现代码
2019/04/01 NodeJs
Vue注册组件命名时不能用大写的原因浅析
2019/04/25 Javascript
如何在selenium中使用js实现定位
2020/08/18 Javascript
带你使用webpack快速构建web项目的方法
2020/11/12 Javascript
跟老齐学Python之复习if语句
2014/10/02 Python
Mac中Python 3环境下安装scrapy的方法教程
2017/10/26 Python
python自动化生成IOS的图标
2018/11/13 Python
PyQt5+Caffe+Opencv搭建人脸识别登录界面
2019/08/28 Python
Python 根据数据模板创建shapefile的实现
2019/11/26 Python
Python面向对象之私有属性和私有方法应用案例分析
2019/12/31 Python
Python HTMLTestRunner库安装过程解析
2020/05/25 Python
前后端结合实现amazeUI分页效果
2020/08/21 HTML / CSS
Antonioli美国在线商店:时尚前卫奢华
2019/07/29 全球购物
aden + anais英国官网:美国婴儿贴身用品品牌
2019/09/08 全球购物
澳大利亚在线奢侈品时尚零售平台:Azura Runway
2021/01/13 全球购物
新闻专业本科生的自我评价分享
2013/11/20 职场文书
大学四年规划书范文
2013/12/27 职场文书
社会实践的活动方案
2014/08/22 职场文书
纪律教育学习月活动总结
2014/08/27 职场文书
2015年社区矫正工作总结
2015/04/21 职场文书
单位病假条范文
2015/08/17 职场文书