原文地址:webpack源码阅读——npm脚本执行webpack与命令行输入webpack执行的区别
如有错误,欢迎指正!

webpack是目前被大家广为使用的模块打包器。从命令行输入webpack或者在package.json的npm scripts中配置webpack脚本都可以使用webpack。虽然效果是一样的,但是两者有区别吗?最近在阅读源码的过程中发现了这个事情,原来两者是有区别的。

webpack安装

webpack的安装分为全局安装和本地安装。

全局安装

npm install webpack -g 

本地安装

npm install webpack --save-dev

全局安装与本地安装的区别

  1. 安装时参数不同,全局安装需要添加 -g 参数
  2. 安装后生成的目录不同

    • 全局安装会在系统npm的根路径下生成node_modules目录,并在根路径下生成对应的.cmd 脚本文件用于启动webpack
    • 本地安装会在运行npm install 命令的目录下生成node_modules目录,并在node_modules 目录下生成.bin文件夹,里面存放了对应的.cmd脚本文件用于启动webpack
  3. 使用方式不同

    • 全局安装后可以直接在命令行输入webpack命令,使用webpack。否则在命令行输入webpack的情况下,会提示 command not found

命令行直接输入webpack的方式

这种方式使用webpack,必须全局安装webpack,在全局安装了webpack的情况下,命令行输入webpack并敲下回车时,系统会去npm全局根路径下寻找webpack.cmd命令(windows系统下),如何查看当前npm的全局安装目录? 输入以下命令:

npm root -g 

以windows为例,笔者的路径是:

C:\Users\(登录用户名)\AppData\Roaming\npm\node_modules

其中node_modules下存放了全局安装的一些npm包,npm文件夹下还存在了对应的webpack.cmd文件用于启动webpack

webpack.cmd

@IF EXIST "%~dp0\node.exe" ("%~dp0\node.exe"  "%~dp0\node_modules\webpack\bin\webpack.js" %*
) ELSE (@SETLOCAL@SET PATHEXT=%PATHEXT:;.JS;=;%node  "%~dp0\node_modules\webpack\bin\webpack.js" %*
)

这段脚本的意思就是使用当前目录下的node去运行node_modules/webpack/bin/webpack.js,如果当前目录不存在node.exe则使用全局的node去运行。

npm scripts配置npm脚本运行webpack的方式

如下所示

package.json

...
scripts: {"build": "webpack"
}
...

在package.json中定义了启动webpack的npm脚本,使用npm run build命令即可使用webpack进行构建。

关于执行npm run ***的原理可以参考阮老的教程npm scripts使用指南中的原理部分。

执行npm run build时, 会执行webpack命令,此时系统去当前目录而非全局npm目录寻找webpack.cmd文件并执行。其中webpack.cmd文件中定义了需要执行的webpack的目录,也就是在当前目录下寻找webpack/bin/webpack.js。如下:

webpack.cmd

@IF EXIST "%~dp0\node.exe" ("%~dp0\node.exe"  "%~dp0\..\webpack\bin\webpack.js" %*
) ELSE (@SETLOCAL@SET PATHEXT=%PATHEXT:;.JS;=;%node  "%~dp0\..\webpack\bin\webpack.js" %*
)

全局版本和本地版本都安装的情况下,使用的究竟是全局的webpack还是本地的webpack

如题,我们还是从两种方式使用webpack的情况下进行分析。

前提:全局以及本地都安装了webpack

命令行直接输入webpack的方式

这种方式运行的是全局的node_modules/webpack/bin/webpack.js,其中在webpack.js的开始有以下代码

// Local version replace global one
try {var localWebpack = require.resolve(path.join(process.cwd(), "node_modules", "webpack", "bin", "webpack.js"));if(__filename !== localWebpack) {return require(localWebpack);}
} catch(e) {}

这段代码判断了当前的文件路径与node进程运行时所在的路径下的node_modules/webpack/bin/webpack.js 是否相等,如果相等代表目前使用的就是本地的版本,如果不相等代表了当前使用的是全局版本,则直接请求本地版本。

结论:在全局安装以及本地都安装的情况下命令行中输入webpack,在webpack的源码逻辑中控制了直接使用本地安装的webpack。

npm 脚本中配置webpack命令

这种方式直接去本地node_modules/.bin去找webpack.cmd命令,然后运行本地node_modules下的webpack。

结论:在全局安装以及本地都安装的情况下,使用npm脚本的方式运行webpack,则直接运行的是本地版本。

总结:在全局以及本地都安装了webpack的情况下,运行时本地安装的webpack。

webpack源码阅读——npm脚本运行webpack与命令行输入webpack的区别相关推荐

  1. GDAL源码剖析(五)之Python命令行程序

    一. GDAL Python工具 本文主要介绍的是GDAL工具集中的Python脚本命令,需要的环境必须是有Python环境和GDAL的Python版本.这是必须的,否则这些工具都不能用.对于已经安装 ...

  2. 【Qt】通过QtCreator源码学习Qt(六):命令行参数解析实现

    参考下大神的命令行参数解析是如何是实现的 //使用const char []代替宏定义字符串,我以前都是用const QString,想想好傻 const char SETTINGS_OPTION[] ...

  3. 习题:编写一个二进制位查看器,要求程序运行时从命令行输入一个整数,将其在内存中的二进制位的形式输出出来。

    个人答案: (1)java import java.util.Scanner;public class 二进制 {public static void main(String[] args) {//输 ...

  4. webpack 源码泄露

    0x01 漏洞简介 webpack是一个JavaScript应用程序的静态资源打包器(module bundler).它会递归构建一个依赖关系图(dependency graph),其中包含应用程序需 ...

  5. webpack 源码分析(四)——complier模块

    webpack 源码分析(四)--complier模块 上一篇我们看到,webpack-cli 通过 yargs 对命令行传入的参数和配置文件里的配置项做了转换包装,然后传递给 webpack 的 c ...

  6. webpack 源码分析系列 ——loader

    想要更好的格式阅读体验,请查看原文:webpack 源码分析系列 --loader 为什么需要 loader webpack是一个用于现代 JavaScript 应用程序的静态模块打包工具.内部通过构 ...

  7. jdk javac运行不了_Intellij IDEA搭建jdk源码阅读环境

    一.找到源码位置 直接找到jdk安装的目录,会看到src.zip的压缩包,这里面就是jdk的源码,例如下图: 在这里解压. 第一次尝试建议使用9或更早版本jdk的源码,否则易造成卡死. 二.Intel ...

  8. .17-浅析webpack源码之compile流程-入口函数run

    本节流程如图: 现在正式进入打包流程,起步方法为run: Compiler.prototype.run = (callback) => {const startTime = Date.now() ...

  9. .5-浅析webpack源码之入口函数

    从convert-argv出来后,目前进度在这: yargs.parse(process.argv.slice(2), (err, argv, output) => {// ...// 从这里出 ...

最新文章

  1. shiro之AuthenticationStrategy
  2. MySql 触发器同步备份数据表记录
  3. Koa与Node.js开发实战(1)——Koa安装搭建(视频演示)
  4. 互联网企业安全之端口监控
  5. 还是畅通工程(克鲁斯卡尔算法+并查集)
  6. 视图请求限定装饰器-101.课时101.【Django视图高级】限制请求method装饰器(Av61533158,P101)
  7. oracle有硬件吗,Oracle 10G数据库中软硬件环境有哪些要求?
  8. python3x_Python3x 基本知识点
  9. ×××保障再上层楼:侠诺×××备援实例
  10. 流量 起伏大_广西崇左的德天跨国大瀑布,一半是中国一半是越南,天下奇观!...
  11. 《统一沟通-微软-实战》-3-部署-Exchange 2010-3-证书-创建-导入-分配
  12. docker安装vim
  13. 记一次搜外吹牛皮回答之旅,如何提升关键词排名
  14. java递归算法的实例最细讲解
  15. 飞算(SoFlu)软件机器人——人人都是全栈架构师
  16. WINCE下ActiveSync连接故障修复办法
  17. 小样本学习(FSL):Few-shot Learning 综述【模型微调(Fine-tunning)、数据增强、迁移学习(Transfer Learning)】
  18. 猴子问题----约瑟夫环算法
  19. 社交电商难定义,蘑菇街、小红书、拼多多注定要兵分三路?
  20. 28岁程序员从字节退休:IT是改命的唯一出路吗?

热门文章

  1. 万字长文带你看尽深度学习中的各种卷积网络
  2. 2018世界人工智能蓝皮书:看中国到底有多强!【附下载】| 智东西内参
  3. 国际互联网协会(ISOC)提出未来互联网十项原则
  4. 2018年中国65家机器人产业园布局与规划汇总盘点
  5. 周志华:最新实验表明gcForest已经是最好的非深度神经网络方法
  6. 微软大神“玩”出新花样,求平均值代码还能这样写?
  7. 倒计时|全场书籍低至 3.5 折起,无门槛包邮!
  8. 十年磨一剑!程序员老兵成新将
  9. JavaScript 爆红后,微软为何还要开发 TypeScript?
  10. 微软全球 AKS 女掌门人,这样击破云原生“怪圈”!