浅谈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和json从后台获得数据集的代码
Nov 07 Javascript
编写js扩展方法判断一个数组中是否包含某个元素
Nov 08 Javascript
jquery操作对象数组元素方法详解
Nov 26 Javascript
深入探寻javascript定时器
Jan 02 Javascript
详解JavaScript 中的 replace 方法
Jan 01 Javascript
JS函数修改html的元素内容,及修改属性内容的方法
Oct 28 Javascript
JavaScript数组的5种迭代方法
Sep 29 Javascript
C#实现将一个字符转换为整数
Dec 12 Javascript
Vuepress 搭建带评论功能的静态博客的实现
Feb 17 Javascript
小程序实现日历左右滑动效果
Oct 21 Javascript
Ant Design Vue table中列超长显示...并加提示语的实例
Oct 31 Javascript
Vue中foreach数组与js中遍历数组的写法说明
Jun 05 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
php无限极分类递归排序实现方法
2014/11/11 PHP
浅谈JavaScript中面向对象技术的模拟
2006/09/25 Javascript
Json对象替换字符串占位符实现代码
2010/11/17 Javascript
jquery 单击li防止重复加载的实现代码
2010/12/24 Javascript
获取客户端网卡MAC地址和IP地址实现JS代码
2013/03/17 Javascript
JS如何将数字类型转化为没3个一个逗号的金钱格式
2014/01/27 Javascript
Javascript小技巧之生成html元素
2014/05/15 Javascript
javascript实现单击和双击并存的方法
2014/12/13 Javascript
JS实现在页面随时自定义背景颜色的方法
2015/02/27 Javascript
jQuery统计指定子元素数量的方法
2015/03/17 Javascript
微信小程序 Canvas增强组件实例详解及源码分享
2017/01/04 Javascript
深入理解javascript的getTime()方法
2017/02/16 Javascript
VUE + UEditor 单图片跨域上传功能的实现方法
2018/02/08 Javascript
微信小程序使用map组件实现解析经纬度功能示例
2019/01/22 Javascript
基于Vue实现电商SKU组合算法问题
2019/05/29 Javascript
javascript二维数组和对象的深拷贝与浅拷贝实例分析
2019/10/26 Javascript
vue不操作dom实现图片轮播的示例代码
2019/12/18 Javascript
[57:47]Fnatic vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python使用PythonMagick将jpg图片转换成ico图片的方法
2015/03/26 Python
Python入门教程之if语句的用法
2015/05/14 Python
python tkinter实现彩球碰撞屏保
2019/07/30 Python
pytorch自定义初始化权重的方法
2019/08/17 Python
英国高档时尚男装购物网站:MR PORTER
2016/08/09 全球购物
美国祛痘、抗衰老药妆品牌:Murad
2016/08/27 全球购物
德国汽车零件和汽车配件网上商店:kfzteile24
2018/11/14 全球购物
Nike比利时官网:Nike.com (BE)
2019/02/07 全球购物
意大利在线药房:Farmacia Loreto Gallo
2019/08/09 全球购物
T3官网:头发造型工具
2019/12/26 全球购物
行政办公员自我评价分享
2013/12/14 职场文书
生产车间班组长岗位职责
2014/01/06 职场文书
高校教师自荐信范文
2014/03/13 职场文书
幼儿园家长寄语
2014/04/02 职场文书
2014年药剂科工作总结
2014/11/26 职场文书
2019大学毕业晚会主持词
2019/06/21 职场文书
手把手带你彻底卸载MySQL数据库
2022/06/14 MySQL