<代码> webpack4.0> 代码以后,似乎执行方式就发生了改变,不再是<代码> webpack 代码>一波流,而是多了一个<代码> webpack-cli> 代码。<代码> webpack3> 代码中<代码> webpack-cli> 代码是合在<代码> webpack> 代码中,所以在命令行运行<代码> webpack 代码>命令的同时,会提示让你再装一个<代码> webpack-cli> 代码。
1,当我们安装了<代码> webpack 代码>模块后,就会在<代码> node_modules/1?/代码>目录下生成一个<代码> webpack, webpack.cmd, webpack 代码>是<代码> 代码> linux下的命令脚本,<代码> webpack.cmd 代码>是<代码> 代码>窗户下命令脚本,<代码> webpack.cmd> 代码可以在windows <代码> 代码>系统上直接运行。
每当执行<代码> npm> 代码运行,就会自动新建一个<代码>壳> 代码,在这个<代码> 代码>壳里面执行指定的脚本命令,因此,只要是<代码>壳> 代码(一般是Bash <代码> 代码>)可以运行的命令,就可以写在<代码> npm 代码>脚本里面。
比较特别的是,<代码> npm> 代码运行新建的这个壳,会将当前目录的<代码> node_modules/1?/代码>子目录加入<代码>路径> 代码变量(软连接),执行结束后,再将<代码>路径> 代码变量恢复原样。
这意味着,当前目录的<代码> node_modules/1敬? 子目录里面的所有脚本,都可以直接用脚本名调用,而不必加上路径。比如,当前项目的依赖里面有<代码>摩卡> 代码,只要直接写<代码>摩卡测试> 代码就可以了。
执行一下命令 cd。\ node_modules \。bin \
<代码> webpack.cmd> 代码执行时会判断当前目录下是否存在<代码>节点> 代码执行程序,如果存在就使用当前<代码> 代码>节点进程执行<代码> node_modules/webpack/bin/webpack.js> 代码,如果当前目录下不存在<代码> 代码>节点进程,则使用全局(也就是本地)代码> <代码>节点执行<代码> 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 代码>
综合领先指标=[ { 名称:“webpack-cli”, 包:“webpack-cli”, binName:“webpack-cli”, 别名:“cli”, 安装:isInstalled (“webpack-cli”), 建议:没错, url:“https://github.com/webpack/webpack-cli”, 描述:“原webpack功能齐全的CLI。” }, {//一些编码 } ]; const installedClis=综合领先指标。过滤器(cli=比;cli.installed); 如果(installedClis。长度===0){//一些编码 const问题='你想安装' webpack-cli”(是/否):;//一些编码 如果(installedClis}其他。长度===1){ const path=要求(“路径”); const pkgPath=require.resolve (“$ {installedClis [0] .package}/package.json '); const pkg=要求(pkgPath); console.log (path.resolve ( path.dirname (pkgPath), pkg.bin [installedClis [0] .binName] )//E: \项目\ webpack学习\ node_modules \ webpack-cli \ bin \ cli.js 要求(path.resolve ( path.dirname (pkgPath), pkg.bin [installedClis [0] .binName] )); }
, <代码> node_modules \ webpack-cli \ bin \ cli.js> 代码中会<代码>要求(“webpack”) 代码>引入<代码> webpack 代码>模块(<代码>/node_modules/lib/webpack.js> 代码)得到一个<代码> webpack 代码>函数,运行<代码> webpack 代码>函数,返回一个编译器<代码> 代码>对象,执行<代码> 代码>中编译器的<代码>运行> 代码,开始编译
//node_modules/bin/cli.js (函数(){//一大堆配置//代码的东西…… yargs.parse (process.argv.slice(2),(呃,argv、输出)=比;{//代码的东西…… 函数processOptions(选项){//各种如果其他过滤和配置//代码的东西…… const webpack=要求(“webpack”); 让编译器; 尝试{//运行webpack函数,返回一个编译器对象 编译器=webpack(选项); }捕捉(err) {//代码的东西…… }//执行编译器中运行的,开始编译。 compiler.run (compilerCallback); } processOptions(选项); })//代码的东西…… })()浅谈webpack和webpack-cli模块源码分析