最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2020年01月19日 14:57:08   作者:ToSmile  
這篇文章主要介紹了淺談webpack和webpack-cli模塊源碼分析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

webpack4與webpack3的區(qū)別

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

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

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

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

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

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

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


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

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

3、node_modules/webpack/bin/webpack.js首先會判斷是否安裝了webpack-cli模塊,如果沒有安裝webpack-cli模塊就會引導(dǎo)用戶去安裝,如果已經(jīng)安裝了webpack-cli模塊,就會去執(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:\項目\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中會require("webpack")引入webpack模塊(/node_modules/lib/webpack.js)得到一個webpack函數(shù),運行webpack函數(shù),返回一個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 {
    // 運行webpack函數(shù),返回一個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 腳本的原理:http://m.fzitv.net/article/148443.htm
webpack-cli源碼解析:https://www.jianshu.com/p/ec8e70d362ef

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

相關(guān)文章

  • javascript快速排序算法詳解

    javascript快速排序算法詳解

    JavaScript實現(xiàn)的常見排序算法有:冒泡排序,選擇排序,插入排序,謝爾排序,快速排序(遞歸),快速排序(堆棧),歸并排序,堆排序。今天我們來詳細(xì)分析下快速排序算法
    2014-09-09
  • js實現(xiàn)輪播圖的完整代碼

    js實現(xiàn)輪播圖的完整代碼

    這篇文章主要為大家詳細(xì)介紹了js實現(xiàn)輪播圖的完整代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • 常見的javascript跨域通信方法

    常見的javascript跨域通信方法

    這篇文章主要介紹了常見的javascript跨域通信方法
    2015-12-12
  • 談一談js中的執(zhí)行環(huán)境及作用域

    談一談js中的執(zhí)行環(huán)境及作用域

    這篇文章主要和大家一起談一談js中的執(zhí)行環(huán)境及作用域,本文依據(jù)面試過程中遇到的問題進行探討,感興趣的小伙伴們可以參考一下
    2016-03-03
  • JS去掉第一個字符和最后一個字符的實現(xiàn)代碼

    JS去掉第一個字符和最后一個字符的實現(xiàn)代碼

    本篇文章主要是對JS去掉第一個字符和最后一個字符的實現(xiàn)代碼進行了介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2014-02-02
  • JavaScript變速動畫函數(shù)封裝添加任意多個屬性

    JavaScript變速動畫函數(shù)封裝添加任意多個屬性

    這篇文章主要介紹了JavaScript變速動畫函數(shù)封裝添加任意多個屬性 ,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-04-04
  • js圖片輪播特效代碼分享

    js圖片輪播特效代碼分享

    這篇文章主要介紹了js圖片輪播特效,圖片切換效果特別適合做產(chǎn)品演示,感興趣的小伙伴可以參考下
    2015-09-09
  • 大白話講解JavaScript的Promise

    大白話講解JavaScript的Promise

    這篇文章主要介紹了大白話講解JavaScript的Promise,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • JavaScript欄目列表隱藏/顯示簡單實現(xiàn)

    JavaScript欄目列表隱藏/顯示簡單實現(xiàn)

    隱藏側(cè)邊欄,并將圖片換成右箭頭圖片;顯示側(cè)邊欄,并將圖片換成左箭頭,這樣的效果想必大家都很熟悉吧,接下來實現(xiàn)下,感興趣的朋友可以參考下哈
    2013-04-04
  • Echart折線圖手柄觸發(fā)事件示例詳解

    Echart折線圖手柄觸發(fā)事件示例詳解

    這篇文章主要給大家介紹了關(guān)于Echart折線圖手柄觸發(fā)事件的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12

最新評論

花垣县| 江永县| 南郑县| 苏州市| 潼关县| 鸡西市| 论坛| 武威市| 比如县| 和顺县| 福州市| 莫力| 张家口市| 襄垣县| 棋牌| 阿巴嘎旗| 宁德市| 天水市| 宜君县| 桐柏县| 武强县| 定结县| 杭锦后旗| 平顺县| 招远市| 丰顺县| 准格尔旗| 和政县| 四平市| 鄄城县| 桐梓县| 盘锦市| 卢湾区| 红桥区| 都江堰市| 台江县| 翼城县| 略阳县| 临沭县| 黄浦区| 澎湖县|