原文地址: webpack源码阅读——npm脚本执行webpack与命令行输入webpack执行的区别
若有错误,欢迎指正!
webpack是目前被你们广为使用的模块打包器。从命令行输入webpack或者在package.json的npm scripts中配置webpack脚本均可以使用webpack。虽然效果是同样的,可是二者有区别吗?最近在阅读源码的过程当中发现了这个事情,原来二者是有区别的。html
webpack的安装分为全局安装和本地安装。node
全局安装webpack
npm install webpack -g
本地安装web
npm install webpack --save-dev
全局安装与本地安装的区别npm
-g
参数安装后生成的目录不一样json
使用方式不一样windows
command not found
这种方式使用webpack,必须全局安装webpack,在全局安装了webpack的状况下,命令行输入webpack并敲下回车时,系统会去npm全局根路径下寻找webpack.cmd命令(windows系统下),如何查看当前npm的全局安装目录? 输入如下命令:ui
npm root -g
以windows为例,笔者的路径是:命令行
C:\Users\(登陆用户名)\AppData\Roaming\npm\node_modules
其中node_modules下存放了全局安装的一些npm包,npm文件夹下还存在了对应的webpack.cmd文件用于启动webpackcode
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去运行。
以下所示
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的方式
这种方式运行的是全局的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。