浅谈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 相关文章推荐
8款非常棒的响应式jQuery 幻灯片插件推荐
Feb 02 Javascript
JavaScript 验证码的实例代码(附效果图)
Mar 22 Javascript
js判断设备是否为PC并调整图片大小
Feb 12 Javascript
javascript 构造函数方式定义对象
Jan 02 Javascript
js+CSS实现模拟华丽的select控件下拉菜单效果
Sep 01 Javascript
Node.js中Request模块处理HTTP协议请求的基本使用教程
Mar 31 Javascript
微信小程序 出现47001 data format error原因解决办法
Mar 10 Javascript
AngularJs ng-change事件/指令的用法小结
Nov 01 Javascript
vue项目打包后打开页面空白解决办法
Jun 29 Javascript
VUE2.0+ElementUI2.0表格el-table循环动态列渲染的写法详解
Nov 30 Javascript
Vue通过for循环随机生成不同的颜色或随机数的实例
Nov 09 Javascript
微信小程序返回上一级页面的实现代码
Jun 19 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实现单例模式最安全的做法
2014/06/13 PHP
destoon实现调用热门关键字的方法
2014/07/15 PHP
PHP框架Laravel的小技巧两则
2015/02/10 PHP
PHP7之Mongodb API使用详解
2015/12/26 PHP
浅谈PHP接入(第三方登录)QQ登录 OAuth2.0 过程中遇到的坑
2017/10/13 PHP
浅谈PHP实现大流量下抢购方案
2017/12/15 PHP
PHP cURL获取微信公众号access_token的实例
2018/04/28 PHP
Javascript中的方法链(Method Chaining)介绍
2015/03/15 Javascript
JavaScript让Textarea支持tab按键的方法
2015/06/26 Javascript
基于jQuery实现搜索关键字自动匹配功能
2020/03/26 Javascript
JavaScript File分段上传
2016/03/10 Javascript
深入浅析JavaScript中的3DES
2016/08/24 Javascript
使用JS读取XML文件的方法
2016/11/25 Javascript
video.js 实现视频只能后退不能快进的思路详解
2018/08/09 Javascript
Vue 路由间跳转和新开窗口的方式(query、params)
2019/12/25 Javascript
JavaScript实现简单日历效果
2020/09/11 Javascript
[01:38]完美世界DOTA2联赛PWL S3 集锦第四期
2020/12/21 DOTA
Python连接mysql数据库的正确姿势
2016/02/03 Python
python爬虫_微信公众号推送信息爬取的实例
2017/10/23 Python
pycharm+django创建一个搜索网页实例代码
2018/01/24 Python
django.db.utils.ProgrammingError: (1146, u“Table‘’ doesn’t exist”)问题的解决
2018/07/13 Python
Python任意字符串转16, 32, 64进制的方法
2019/06/12 Python
Python中的延迟绑定原理详解
2019/10/11 Python
Python如何输出百分比
2020/07/31 Python
Solid & Striped官网:美国泳装品牌
2019/06/19 全球购物
可口可乐唇膏:Lip Smackers
2019/08/27 全球购物
什么是方法的重载
2013/06/24 面试题
自查自纠工作总结
2014/10/15 职场文书
2014年高数考试作弊检讨书
2014/12/14 职场文书
让生命充满爱观后感
2015/06/08 职场文书
培训心得体会怎么写
2016/01/25 职场文书
小学音乐课歌曲《堆雪人》教学反思
2016/02/18 职场文书
导游词之京东大峡谷旅游区
2019/10/29 职场文书
Python基础之操作MySQL数据库
2021/05/06 Python
Java Dubbo框架知识点梳理
2021/06/26 Java/Android
动画《新网球王子 U-17 WORLD CUP》希腊队PV公开
2022/04/02 日漫