溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

淺談webpack和webpack-cli模塊源碼分析

發(fā)布時(shí)間:2020-10-20 10:08:28 來源:腳本之家 閱讀:368 作者:ToSmile 欄目:web開發(fā)

webpack4與webpack3的區(qū)別

webpack4.0 以后,似乎執(zhí)行方式就發(fā)生了改變,不再是 webpack 一波流,而是多了一個(gè) webpack-cli。webpack3webpack-cli是合在webpack中。所以在命令行運(yùn)行 webpack 命令的同時(shí),會(huì)提示讓你再裝一個(gè) webpack-cli。

執(zhí)行腳本到打包結(jié)束流程

1、當(dāng)我們安裝了webpack模塊后,就會(huì)在node_modules/.bin目錄下生成一個(gè)webpack、webpack.cmd,webpacklinux下的命令腳本,webpack.cmdwindows下命令腳本,webpack.cmd可以在windows系統(tǒng)上直接運(yùn)行。

每當(dāng)執(zhí)行npm run,就會(huì)自動(dòng)新建一個(gè) Shell,在這個(gè) Shell 里面執(zhí)行指定的腳本命令。因此,只要是 Shell(一般是 Bash)可以運(yùn)行的命令,就可以寫在 npm 腳本里面。

比較特別的是,npm run新建的這個(gè) Shell,會(huì)將當(dāng)前目錄的node_modules/.bin子目錄加入PATH變量(軟連接),執(zhí)行結(jié)束后,再將PATH變量恢復(fù)原樣。

這意味著,當(dāng)前目錄的node_modules/.bin子目錄里面的所有腳本,都可以直接用腳本名調(diào)用,而不必加上路徑。比如,當(dāng)前項(xiàng)目的依賴?yán)锩嬗?Mocha,只要直接寫mocha test就可以了。

執(zhí)行一下命令
cd .\node_modules\.bin\

淺談webpack和webpack-cli模塊源碼分析

2、package.jsonscript配置dev: webpack --mode development,當(dāng)執(zhí)行npm run dev相當(dāng)于執(zhí)行webpack --mode development

淺談webpack和webpack-cli模塊源碼分析

webpack.cmd執(zhí)行時(shí)會(huì)判斷當(dāng)前目錄下是否存在node執(zhí)行程序,如果存在就使用當(dāng)前node進(jìn)程執(zhí)行node_modules/webpack/bin/webpack.js,如果當(dāng)前目錄下不存在node進(jìn)程,則使用全局(也就是本地)node執(zhí)行node_modules/webpack/bin/webpack.js文件

3、node_modules/webpack/bin/webpack.js首先會(huì)判斷是否安裝了webpack-cli模塊,如果沒有安裝webpack-cli模塊就會(huì)引導(dǎo)用戶去安裝,如果已經(jīng)安裝了webpack-cli模塊,就會(huì)去執(zhí)行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:\項(xiàng)目\webpack學(xué)習(xí)\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中會(huì)require("webpack")引入webpack模塊(/node_modules/lib/webpack.js)得到一個(gè)webpack函數(shù),運(yùn)行webpack函數(shù),返回一個(gè)compiler對象,執(zhí)行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 {
    // 運(yùn)行webpack函數(shù),返回一個(gè)compiler對象
    compiler = webpack(options); 
   } catch (err) {
    // something code...
   }
   // 執(zhí)行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://www.jb51.net/article/148443.htm
webpack-cli源碼解析:https://www.jianshu.com/p/ec8e70d362ef

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI