浅谈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的extend和fn.extend的使用说明
Jan 09 Javascript
ie 7/8不支持trim的属性的解决方案
May 23 Javascript
JS对象与json字符串格式转换实例
Oct 28 Javascript
深入理解JavaScript系列(17):面向对象编程之概论详细介绍
Mar 04 Javascript
详解vue父子模版嵌套案例
Mar 04 Javascript
H5手机端多文件上传预览插件
Apr 21 Javascript
ztree实现权限横向显示功能
May 20 Javascript
React+react-dropzone+node.js实现图片上传的示例代码
Aug 23 Javascript
关于laydate.js加载laydate.css路径错误问题解决
Dec 27 Javascript
详解javascript中的变量提升和函数提升
May 24 Javascript
React传值 组件传值 之间的关系详解
Aug 26 Javascript
vue3.0 项目搭建和使用流程
Mar 04 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常用字符串String函数实例总结【转换,替换,计算,截取,加密】
2016/12/07 PHP
laravel 5.4中实现无限级分类的方法示例
2017/07/27 PHP
yii2的restful api路由实例详解
2019/05/14 PHP
Javascript中获取出错代码所在文件及行数的代码
2010/09/23 Javascript
Extjs中通过Tree加载右侧TabPanel具体实现
2013/05/05 Javascript
基于JavaScript实现继承机制之构造函数方法对象冒充的使用详解
2013/05/07 Javascript
node.js中使用node-schedule实现定时任务实例
2014/06/03 Javascript
node.js中的buffer.write方法使用说明
2014/12/10 Javascript
使用npm发布Node.JS程序包教程
2015/03/02 Javascript
BootStrap Datetimepicker 汉化的实现代码
2017/02/10 Javascript
nodejs创建简易web服务器与文件读写的实例
2017/09/07 NodeJs
微信小程序顶部导航栏滑动tab效果
2019/01/28 Javascript
js实现图片局部放大效果详解
2019/03/18 Javascript
JS中数组实现代码(倒序遍历数组,数组连接字符串)
2019/12/29 Javascript
javascript实现留言板功能
2020/02/08 Javascript
ES6箭头函数和扩展实例分析
2020/05/23 Javascript
[01:03:33]Alliance vs TNC 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
[46:49]完美世界DOTA2联赛PWL S3 access vs Rebirth 第二场 12.19
2020/12/24 DOTA
Python脚本实现DNSPod DNS动态解析域名
2015/02/14 Python
将Python的Django框架与认证系统整合的方法
2015/07/24 Python
Python 爬虫学习笔记之单线程爬虫
2016/09/21 Python
Python爬虫使用脚本登录Github并查看信息
2018/07/16 Python
python2与python3的print及字符串格式化小结
2018/11/30 Python
Python类的继承用法示例
2019/01/31 Python
Python实现查找字符串数组最长公共前缀示例
2019/03/27 Python
python3.6+django2.0+mysql搭建网站过程详解
2019/07/24 Python
django formset实现数据表的批量操作的示例代码
2019/12/06 Python
Python爬虫scrapy框架Cookie池(微博Cookie池)的使用
2021/01/13 Python
人力资源管理专业毕业生自我评价
2013/09/21 职场文书
《世界多美呀》教学反思
2014/03/02 职场文书
扩大国家免疫规划实施方案
2014/03/21 职场文书
企业领导班子四风对照检查材料
2014/09/27 职场文书
2014年林业工作总结
2014/12/05 职场文书
2015仓库保管员年终工作总结
2015/05/13 职场文书
八年级英语教学反思
2016/02/15 职场文书
java后台调用接口及处理跨域问题的解决
2022/03/24 Java/Android