浅谈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 jQuery中的DOM操作
Mar 21 Javascript
基于jquery实现的文字向上跑动类似跑马灯的效果
Jun 17 Javascript
JavaScript实现身份证验证代码
Feb 17 Javascript
Bootstrap入门书籍之(五)导航条、分页导航
Feb 17 Javascript
js和jq使用submit方法无法提交表单的快速解决方法
May 17 Javascript
Vue.js组件使用开发实例教程
Nov 01 Javascript
jquery dataview数据视图插件使用方法
Dec 23 Javascript
浅谈AngularJS中$http服务的简单用法
May 15 Javascript
JavaScript常用数组操作方法,包含ES6方法
May 10 Javascript
微信小程序 checkbox使用实例解析
Sep 09 Javascript
js实现鼠标点击页面弹出自定义文字效果
Dec 24 Javascript
微信小程序scroll-view的滚动条设置实现
Mar 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递归函数三种实现方法及如何实现数字累加
2015/08/07 PHP
php微信公众号开发(3)php实现简单微信文本通讯
2016/12/15 PHP
Code:loadScript( )加载js的功能函数
2007/02/02 Javascript
SUN的《AJAX与J2EE》全文译了
2007/02/23 Javascript
Javascript中的常见排序算法
2007/03/27 Javascript
为radio类型的INPUT添加客户端脚本(附加实现JS来禁用onClick事件思路代码)
2010/11/11 Javascript
javascript 进阶篇2 CSS XML学习
2012/03/14 Javascript
JQuery入门——事件切换之hover()方法应用介绍
2013/02/05 Javascript
jQuery实现鼠标移到元素上动态提示消息框效果
2013/10/20 Javascript
node.js调用C++开发的模块实例
2015/07/03 Javascript
JavaScript数据类型学习笔记
2016/01/25 Javascript
jquery实现图片上传前本地预览功能
2016/05/10 Javascript
JavaScript数值千分位格式化的两种简单实现方法
2016/08/01 Javascript
解决Extjs下拉框不显示的问题
2017/06/21 Javascript
jquery之基本选择器practice(实例讲解)
2017/09/30 jQuery
layui结合form,table的全选、反选v1.0示例讲解
2018/08/15 Javascript
Python Deque 模块使用详解
2014/07/04 Python
python检查指定文件是否存在的方法
2015/07/06 Python
Python 写了个新型冠状病毒疫情传播模拟程序
2020/02/14 Python
python编写俄罗斯方块
2020/03/13 Python
Python greenlet和gevent使用代码示例解析
2020/04/01 Python
使用python修改文件并立即写回到原始位置操作(inplace读写)
2020/06/28 Python
Python 合并拼接字符串的方法
2020/07/28 Python
美国NBA官方商店:NBA Store
2019/04/12 全球购物
标准化管理实施方案
2014/02/25 职场文书
工程建设实施方案
2014/03/14 职场文书
贯彻学习两会心得体会范文
2014/03/17 职场文书
初中生毕业评语
2014/12/29 职场文书
六年级语文下册教学计划
2015/01/22 职场文书
管理人员岗位职责
2015/02/14 职场文书
写给媳妇的检讨书
2015/05/06 职场文书
最美乡村教师观后感
2015/06/11 职场文书
严以用权专题学习研讨会发言材料
2015/11/09 职场文书
SQL SERVER中常用日期函数的具体使用
2021/04/08 SQL Server
什么是Python装饰器?如何定义和使用?
2022/04/11 Python
Windows Server 2012 R2服务器安装与配置的完整步骤
2022/07/15 Servers