浅谈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 16 Javascript
推荐8款jQuery轻量级树形Tree插件
Nov 12 Javascript
node.js+Ajax实现获取HTTP服务器返回数据
Nov 26 Javascript
node.js中的buffer.toJSON方法使用说明
Dec 14 Javascript
JavaScript中的对象序列化介绍
Dec 30 Javascript
JavaScript实现鼠标滑过处生成气泡的方法
May 16 Javascript
当jquery ajax遇上401请求的解决方法
May 19 Javascript
AngularJS实现单独作用域内的数据操作
Sep 05 Javascript
使用snowfall.jquery.js实现爱心满屏飞的效果
Jan 05 Javascript
浅谈angular.copy() 深拷贝
Sep 14 Javascript
从零使用TypeScript开发项目打包发布到npm
Feb 14 Javascript
深入详解JS函数的柯里化
Jun 09 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
PHPLog php 程序调试追踪工具
2009/09/09 PHP
从手册去理解分析PHP session机制
2011/07/17 PHP
php使用正则过滤js脚本代码实例
2014/05/10 PHP
php获取系统变量方法小结
2015/05/29 PHP
php微信公众号开发之校园图书馆
2018/10/20 PHP
一些常用的Javascript函数
2006/12/22 Javascript
用CSS+JS实现的进度条效果效果
2007/06/05 Javascript
JavaScript 在各个浏览器中执行的耐性
2009/04/06 Javascript
Extjs Ajax 乱码问题解决方案
2009/04/15 Javascript
javascript使用中为什么10..toString()正常而10.toString()出错呢
2013/01/11 Javascript
jquery特效 幻灯片效果示例代码
2013/07/16 Javascript
D3.js实现雷达图的方法详解
2016/09/22 Javascript
Bootstrap媒体对象学习使用
2017/03/07 Javascript
angular框架实现全选与单选chekbox的自定义
2017/07/06 Javascript
AngularJS实现的select二级联动下拉菜单功能示例
2017/10/25 Javascript
webstrom Debug 调试vue项目的方法步骤
2018/07/17 Javascript
微信小程序实现弹出层效果
2020/05/26 Javascript
如何在wxml中直接写js代码(wxs)
2019/11/14 Javascript
Vue使用Proxy代理后仍无法生效的解决
2020/11/13 Javascript
Linux下用Python脚本监控目录变化代码分享
2015/05/21 Python
星球大战与Python之间的那些事
2016/01/07 Python
Python实现的简单dns查询功能示例
2017/05/24 Python
Python通过Django实现用户注册和邮箱验证功能代码
2017/12/11 Python
python 输出上个月的月末日期实例
2018/04/11 Python
Python实现删除时保留特定文件夹和文件的示例
2018/04/27 Python
Python 利用切片从列表中取出一部分使用的方法
2019/02/01 Python
Python requests上传文件实现步骤
2020/09/15 Python
Farfetch巴西官网:奢侈品牌时尚购物平台
2020/10/19 全球购物
英国最受欢迎的母婴精品品牌:JoJo Maman BéBé
2021/02/17 全球购物
讲文明树新风公益广告宣传方案
2014/02/25 职场文书
毕业生自荐信格式
2014/03/07 职场文书
民间借贷借条如何写
2015/05/26 职场文书
工商局调档介绍信
2015/10/22 职场文书
《倍数和因数》教学反思
2016/02/23 职场文书
thinkphp 获取控制器及控制器方法
2021/04/16 PHP
vue.js 使用原生js实现轮播图
2022/04/26 Vue.js