亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

細說webpack源碼之compile流程-入口函數run

2019-11-19 14:38:55
字體:
來源:轉載
供稿:網友

Webpack是目前基于React和Redux開發的應用的主要打包工具。我想使用Angular 2或其他框架開發的應用也有很多在使用Webpack。

本節流程如圖:

  現在正式進入打包流程,起步方法為run:

Compiler.prototype.run = (callback) => {  const startTime = Date.now();  const onCompiled = (err, compilation) => { /**/ };  this.applyPluginsAsync("before-run", this, err => {    if (err) return callback(err);    this.applyPluginsAsync("run", this, err => {      if (err) return callback(err);      this.readRecords(err => {        if (err) return callback(err);        this.compile(onCompiled);      });    });  });}

  為什么不介紹compiler對象?因為構造函數中并沒有一個初始化的方法,只是普通的變量聲明,沒啥好講的。

  在run方法中,首先是調用了tapable的applyPluginsAsync執行了before-run事件流,該事件流的定義地點如下:

// NodeEnvironmentPlugincompiler.plugin("before-run", (compiler, callback) => {  if (compiler.inputFileSystem === inputFileSystem)    inputFileSystem.purge();  callback();});

  在對compiler對象的文件系統方法的掛載插件中,注入了before-run這個事件流,這里首先看一下applyPluginsAsync(做了小幅度的修改以適應webpack源碼):

// tapableTapable.prototype.applyPluginsAsync = (name, ...args, callback) => {  var plugins = this._plugins[name];  if (!plugins || plugins.length === 0) return callback();  var i = 0;  var _this = this;  // args為[args,next函數]  args.push(copyProperties(callback, function next(err) {    // 事件流出錯或者全部執行完后調用回調函數    if (err) return callback(err);    i++;    if (i >= plugins.length) {      return callback();    }    // 執行下一個事件    plugins[i].apply(_this, args);  }));  // 執行第一個事件  plugins[0].apply(this, args);};

  當時在第八節沒有講這個系列的事件流觸發方式,這里簡單說下:

1、copyProperties用于對象屬性的拷貝,類似于Object.assign,然而在這里傳入的是兩個函數,一點用都沒有?。。。?!(當時沒寫講解就是因為一直卡在這個對象拷貝方法在這里有什么毛用)

2、在webpack中,args為一個this,指向compiler的上下文

3、注入該事件流的事件必須要執行callback方法(如上例),此時執行的并不是外部的callback,而是next函數

4、有兩種情況下會執行外部callback,中途出錯或者所有事件流執行完畢

  這樣就很明白了,注入before-run中的函數形參的意義如下:

// before-run// compiler => this// callback => next(compiler, callback) => {  if (compiler.inputFileSystem === inputFileSystem)    inputFileSystem.purge();  callback();}

  由于before-run中只有一個事件,所以在調用內部callback的next方法后,會由于i大于事件長度而直接調用外部callback。 

  這里的purge方法之前見過,這里復習下內容:

// NodeEnvironmentPlugincompiler.inputFileSystem = new CachedInputFileSystem(new NodeJsInputFileSystem(), 60000);// CachedInputFileSystemCachedInputFileSystem.prototype.purge = function(what) {  this._statStorage.purge(what);  this._readdirStorage.purge(what);  this._readFileStorage.purge(what);  this._readlinkStorage.purge(what);  this._readJsonStorage.purge(what);};// CachedInputFileSystem => StorageStorage.prototype.purge = function(what) {  if (!what) {    this.count = 0;    clearInterval(this.interval);    this.nextTick = null;    this.data.clear();    this.levels.forEach(function(level) {      level.clear();    });  } else if (typeof what === "string") { /**/ } else { /**/ }};

  一句話概括就是:清除所有打包中緩存的數據。

  由于假設是第一次,所以這里并沒有什么實際操作,接著調用外部callback,用同樣的方式觸發了run事件流。

  run事件流也只有一個方法,來源于CachePlugin插件:

Compiler.plugin("run", (compiler, callback) => {  // 這個屬性我暫時也不知道是啥 反正直接callback了  if (!compiler._lastCompilationFileDependencies) return callback();  const fs = compiler.inputFileSystem;  const fileTs = compiler.fileTimestamps = {};  asyncLib.forEach(compiler._lastCompilationFileDependencies, (file, callback) => {    // ...  }, err => {    // ...  });});

  在第一次觸發run事件流時,那個屬性是undefined,所以會直接跳過,因為我是邊看源碼邊解析,所以也不知道是啥,哈哈。

  接下來下一個callback是這個:

this.readRecords(err => {  if (err) return callback(err);  this.compile(onCompiled);});

  這是另一個原型方法,源碼如下:

Compiler.prototype.readRecords = (callback) => {  // 這個屬性也沒有  if (!this.recordsInputPath) {    this.records = {};    return callback();  }  this.inputFileSystem.stat(this.recordsInputPath, err => {    // ...  });}

  這里第一次也會跳過并直接callback,看源碼大概是傳入一個路徑并讀取里面的文件信息緩存到records中。

  這下連跳兩步,直接進入原型方法compile中,預覽一下這個函數:

Compiler.prototype.compile = (callback) => {  const params = this.newCompilationParams();  // 依次觸發事件流  this.applyPluginsAsync("before-compile", params, err => {    if (err) return callback(err);    this.applyPlugins("compile", params);    const compilation = this.newCompilation(params);    this.applyPluginsParallel("make", compilation, err => {      if (err) return callback(err);      compilation.finish();      compilation.seal(err => {        if (err) return callback(err);        this.applyPluginsAsync("after-compile", compilation, err => {          if (err) return callback(err);          return callback(null, compilation);        });      });    });  });}

  編譯打包的核心流程已經一覽無遺,方法中依次觸發了before-compile、compile、make、after-compile事件流,最后調用了回調函數。

總結

以上所述是小編給大家介紹的webpack源碼之compile流程-入口函數run,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩视频欧美视频| 欧美猛男性生活免费| 日产精品久久久一区二区福利| 精品中文视频在线| 国外视频精品毛片| 欧美巨猛xxxx猛交黑人97人| 国产一区二区日韩精品欧美精品| 91亚洲精品一区二区| 国产精品亚洲片夜色在线| 成人做爰www免费看视频网站| 久久人人爽人人爽人人片av高清| 久久久久久综合网天天| 精品久久久久久中文字幕大豆网| 自拍偷拍亚洲欧美| 91人人爽人人爽人人精88v| 日韩av中文字幕在线免费观看| 日韩三级影视基地| …久久精品99久久香蕉国产| 亚洲一区二区三区777| 综合久久五月天| 川上优av一区二区线观看| 一本色道久久综合狠狠躁篇怎么玩| 久久综合伊人77777| 欧美成人午夜激情| 国产91对白在线播放| 91国产视频在线播放| 毛片精品免费在线观看| 久久久久久久亚洲精品| 久热99视频在线观看| 日韩在线播放av| 亚洲一区二区少妇| 自拍视频国产精品| 日韩精品在线视频| 日韩欧美综合在线视频| 亚洲男子天堂网| 亚洲三级黄色在线观看| 中文字幕欧美亚洲| 亚洲国产婷婷香蕉久久久久久| 日本精品久久电影| 日韩中文字幕视频| 欧美大肥婆大肥bbbbb| 国产999在线观看| 中文字幕在线观看亚洲| xxxxxxxxx欧美| 国产色视频一区| 国产精品啪视频| 欧美黄色小视频| 欧美日韩一区二区免费视频| 久久久国产精品一区| 国产一区在线播放| 热re99久久精品国产66热| 国产成人精品国内自产拍免费看| 日本亚洲欧洲色| 国产一区二区三区在线播放免费观看| 国产盗摄xxxx视频xxx69| 亚洲级视频在线观看免费1级| 日韩成人在线免费观看| 欧美疯狂xxxx大交乱88av| 91国产中文字幕| 欧美另类极品videosbest最新版本| 国产精品白嫩美女在线观看| 亚洲欧洲第一视频| 成人免费网站在线观看| 欧美大全免费观看电视剧大泉洋| 欧美激情三级免费| 最好看的2019年中文视频| 欧美理论在线观看| 91高清视频在线免费观看| 福利微拍一区二区| 最近2019中文字幕大全第二页| 日韩欧中文字幕| 亚洲bt天天射| 欧美性生活大片免费观看网址| 亚洲欧美国内爽妇网| 亚洲护士老师的毛茸茸最新章节| 欧美丰满少妇xxxxx| 国产精品美女主播| 欧美日韩xxxxx| 亚洲欧美在线看| 91精品久久久久久久久| 日韩精品极品视频| 国产精品网站入口| 欧美日韩另类在线| 久久精品小视频| 久久久天堂国产精品女人| 欧美日韩日本国产| 中文字幕最新精品| 亚洲欧美国产精品专区久久| 国产精品久久久久久网站| 欧美日韩国产一区二区三区| 不卡伊人av在线播放| 久久久久久久国产精品| 成人激情春色网| 久久精品成人一区二区三区| 国产精品白嫩初高中害羞小美女| 午夜精品久久久久久久白皮肤| 亚洲成人xxx| 日韩欧美高清视频| 成人免费大片黄在线播放| 久久精品中文字幕一区| 免费av在线一区| 久久99久久99精品免观看粉嫩| 色妞欧美日韩在线| 欧美另类精品xxxx孕妇| 久久久精品久久久久| 成人免费在线视频网址| 91九色在线视频| 亚洲自拍偷拍在线| 亚洲欧美一区二区三区情侣bbw| 色偷偷噜噜噜亚洲男人| 久久国产精品久久精品| 亚洲视频一区二区三区| 成人激情综合网| 国产日韩中文字幕| 中文字幕亚洲无线码a| 亚洲成人久久久久| 国产精品久久久| 国产精品久久久久久亚洲调教| 欧美激情亚洲激情| 91免费视频国产| 日韩av影院在线观看| 久久久av免费| 国产成人高清激情视频在线观看| 国产精品免费久久久久久| 日本19禁啪啪免费观看www| 久久久久久久久久久免费| 欧美成人精品一区二区三区| 中文字幕9999| 中文字幕日本欧美| 亚洲成人网在线观看| 奇米影视亚洲狠狠色| 8050国产精品久久久久久| 成人国内精品久久久久一区| 亚洲国产婷婷香蕉久久久久久| 久久综合久中文字幕青草| 精品中文字幕视频| 国产婷婷色综合av蜜臀av| 亚洲欧美一区二区三区四区| 日韩美女毛茸茸| 精品一区二区电影| 国产一区二区三区久久精品| 久久精品成人动漫| 国产精品自在线| 久久亚洲私人国产精品va| 亚洲欧美国产精品专区久久| 精品久久久久久中文字幕大豆网| 日韩av在线高清| 热久久免费视频精品| 久青草国产97香蕉在线视频| 欧美午夜无遮挡| 91色中文字幕| 国产精品久久网| 久久久久日韩精品久久久男男| 精品国产91久久久久久老师| 美女精品视频一区| 中文字幕日韩欧美| 久久精品国产成人精品| 另类美女黄大片| 色综合91久久精品中文字幕| 国产精品一二三在线| 久久久国产影院| 久热精品视频在线观看一区| 国产精品中文字幕在线| 成人羞羞国产免费|