浅谈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 键盘记录实现(兼容FireFox和IE)
Feb 07 Javascript
mailto的使用技巧分享
Dec 21 Javascript
JS小功能(button选择颜色)简单实例
Nov 29 Javascript
Javascript浮点数乘积运算出现多位小数的解决方法
Feb 17 Javascript
javascript实现在线客服效果
Jul 15 Javascript
JAVASCRIPT代码编写俄罗斯方块网页版
Nov 26 Javascript
JS操作时间 - UNIX时间戳的简单介绍(必看篇)
Aug 16 Javascript
Vue的百度地图插件尝试使用
Sep 06 Javascript
javascript实现循环广告条效果
Dec 12 Javascript
微信小程序progress组件使用详解
Jan 31 Javascript
javaScript实现鼠标在文字上悬浮时弹出悬浮层效果
Apr 12 Javascript
一步一步实现Vue的响应式(对象观测)
Sep 02 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中处理mysql_fetch_assoc返回来的数组 不用foreach----echo
2011/05/04 PHP
php入门学习知识点七 PHP函数的基本应用
2011/07/14 PHP
分享一下贝贝成长进度的php代码
2012/09/14 PHP
php获取客户端电脑屏幕参数的方法
2015/01/09 PHP
微信公众平台之快递查询功能用法实例
2015/04/14 PHP
CodeIgniter与PHP5.6的兼容问题
2015/07/16 PHP
学习php设计模式 php实现状态模式
2015/12/07 PHP
浅谈PHP命令执行php文件需要注意的问题
2016/12/16 PHP
Javascript学习笔记8 用JSON做原型
2010/01/11 Javascript
jQuery实现原理的模拟代码 -6 代码下载
2010/08/16 Javascript
javascript判断用户浏览器插件安装情况的代码
2011/01/01 Javascript
jQuery + Flex 通过拖拽方式动态改变图片的代码
2011/08/03 Javascript
详谈JavaScript内存泄漏
2014/11/14 Javascript
jQuery抛物线运动实现方法(附完整demo源码下载)
2016/01/08 Javascript
Bootstrap实现带动画过渡的弹出框
2016/08/09 Javascript
jQuery基于事件控制实现点击显示内容下拉效果
2017/03/07 Javascript
Angularjs使用指令做表单校验的方法
2017/03/31 Javascript
vue.js异步上传文件前后端实现代码
2017/08/22 Javascript
js es6系列教程 - 基于new.target属性与es5改造es6的类语法
2017/09/02 Javascript
JavaScript继承定义与用法实践分析
2018/05/28 Javascript
Python基于分水岭算法解决走迷宫游戏示例
2017/09/26 Python
使用python对文件中的数值进行累加的实例
2018/11/28 Python
如何在django中实现分页功能
2020/04/22 Python
Python叠加矩形框图层2种方法及效果
2020/06/18 Python
python中HTMLParser模块知识点总结
2021/01/25 Python
中国电子产品外贸网站:MiniIntheBox
2017/02/06 全球购物
澳大利亚在线生活方式商店:Mytopia
2018/07/08 全球购物
售后专员岗位职责
2013/12/08 职场文书
大学生自我鉴定评语
2014/01/27 职场文书
空乘英文求职信
2014/04/13 职场文书
培训讲师岗位职责
2014/04/13 职场文书
保护环境演讲稿
2014/05/10 职场文书
正科级干部考察材料
2014/05/29 职场文书
森林防火宣传标语
2014/06/27 职场文书
廉政承诺书范文
2015/04/28 职场文书
交通事故协议书范本
2016/03/19 职场文书