成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

理解webpack原理,手寫一個100行的webpack

王偉廷 / 2048人閱讀

摘要:什么是可以引用官網(wǎng)的一幅圖解釋,我們可以看到,可以分析各個模塊的依賴關(guān)系,最終打包成我們常見的靜態(tài)文件,。我們暫時把通過傳文件路徑能返回文件信息的這個函數(shù)叫。

什么是webpack

可以引用官網(wǎng)的一幅圖解釋,我們可以看到webpack,可以分析各個模塊的依賴關(guān)系,最終打包成我們常見的靜態(tài)文件,.js 、 .css 、 .jpg 、.png。今天我們先不弄那么復(fù)雜,我們就介紹webpack是怎么分析ES6的模塊依賴,怎么把ES6的代碼轉(zhuǎn)成ES5的。

實現(xiàn)

由于ES6轉(zhuǎn)ES5中需要用到babel,所以要用到一下插件

npm install @babel/core @babel/parser @babel/traverse @babel/preset-env --save-dev

需要的文件

使用webpack肯定少不了原文件,我們會涉及三個需要打包的js文件(entry.js、message.js、name.js

// entry.js

import message from "./message.js";
console.log(message);
// message.js

import {name} from "./name.js";
export default `hello ${name}!`;
// name.js

export const name = "world";
//bundler.js 
// 讀取文件信息,并獲得當(dāng)前js文件的依賴關(guān)系
function createAsset(filename) {//代碼略}
// 從入口開始分析所有依賴項,形成依賴圖,采用廣度遍歷
function createGraph(entry) {//代碼略}
// 根據(jù)生成的依賴關(guān)系圖,生成瀏覽器可執(zhí)行文件
function bundle(graph) {//代碼略}

entry.js 就是我們的入口文件,文件的依賴關(guān)系是,entry.js依賴message.jsmessage.js依賴name.js。

bundler.js 是我們簡易版的webpack

目錄結(jié)構(gòu)

- example
    - entry.js
    - message.js
    - name.js
- bundler.js
如何分析依賴

webpack分析依賴是從一個入口文件開始分析的,當(dāng)我們把一個入口的文件路徑傳入,webpack就會通過這個文件的路徑讀取文件的信息(讀取到的本質(zhì)其實是字符串),然后把讀取到的信息轉(zhuǎn)成AST(抽象語法樹),簡單點來說呢,就是把一個js文件里面的內(nèi)容存到某種數(shù)據(jù)結(jié)構(gòu)里,里面包括了各種信息,其中就有當(dāng)前模塊依賴了哪些模塊。我們暫時把通過傳文件路徑能返回文件信息的這個函數(shù)叫 createAsset

createAsset返回什么

第一步我們肯定需要先從 entry.js 開始分析,于是就有了如下的代碼,我們先不關(guān)心createAsset具體代碼是怎么實現(xiàn)的,具體代碼我會放在最后。

createAsset("./example/entry.js");

當(dāng)執(zhí)行這句代碼,createAsset 會返回下面的數(shù)據(jù)結(jié)構(gòu),這里包括了模塊的id,文件路徑,依賴數(shù)組entry.js依賴了message.js,所以會返回依賴的文件名),code(這個就是entry.js ES6轉(zhuǎn)ES5的代碼)

通過 createAsset 我們成功拿到了entry.js的依賴,就是 dependencies 數(shù)組。

createGraph返回什么,如何找下一個依賴

我們通過上面可以拿到entry.js依賴的模塊,于是我們就可以接著去遍歷dependencies 數(shù)組,循環(huán)調(diào)用createAsset這樣就可以得到全部模塊相互依賴的信息。想得到全部依賴信息需要調(diào)用 createGraph 這個一個函數(shù),它會進(jìn)行廣度遍歷,最終返回下面的數(shù)據(jù)

我們可以看到返回的數(shù)據(jù),字段之前都和大家解釋了,除了 mapping,mapping這個字段是把當(dāng)前模塊依賴的文件名稱 和 模塊的id 做一個映射,目的是為了更方便查找模塊。

bundle返回什么 && 最后步驟

我們現(xiàn)在已經(jīng)能拿到每個模塊之前的依賴關(guān)系,我們再通過調(diào)用bundle函數(shù),我們就能構(gòu)造出最后的bundle.js,輸出如下圖

源碼

點擊查看源碼

最后

文章可能有不足的地方,請大家見諒,如果有什么疑問可以下方留言討論。

如果大家對文字描述還是不太清楚,建議看我下方提供的視頻,我就是從視頻中學(xué)的,這個是在youtube上的視頻,大家懂的,有條件的還是建議看一下。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/102365.html

相關(guān)文章

  • 9102年:手寫一個React腳手架 【優(yōu)化極致版】

    摘要:馬上要出了,完全手寫一個優(yōu)化后的腳手架是不可或缺的技能。每個依賴項隨即被處理,最后輸出到稱之為的文件中,我們將在下一章節(jié)詳細(xì)討論這個過程。的事件流機制保證了插件的有序性,使得整個系統(tǒng)擴展性很好。 webpack馬上要出5了,完全手寫一個優(yōu)化后的腳手架是不可或缺的技能。 本文書寫時間 2019年5月9日 , webpack版本 4.30.0最新版本 本人所有代碼均手寫,親自試驗過可...

    Kylin_Mountain 評論0 收藏0
  • 9102年:手寫一個React腳手架 【優(yōu)化極致版】

    摘要:馬上要出了,完全手寫一個優(yōu)化后的腳手架是不可或缺的技能。每個依賴項隨即被處理,最后輸出到稱之為的文件中,我們將在下一章節(jié)詳細(xì)討論這個過程。的事件流機制保證了插件的有序性,使得整個系統(tǒng)擴展性很好。 webpack馬上要出5了,完全手寫一個優(yōu)化后的腳手架是不可或缺的技能。 本文書寫時間 2019年5月9日 , webpack版本 4.30.0最新版本 本人所有代碼均手寫,親自試驗過可...

    whatsns 評論0 收藏0
  • 9102年:手寫一個React腳手架 【優(yōu)化極致版】

    摘要:馬上要出了,完全手寫一個優(yōu)化后的腳手架是不可或缺的技能。每個依賴項隨即被處理,最后輸出到稱之為的文件中,我們將在下一章節(jié)詳細(xì)討論這個過程。的事件流機制保證了插件的有序性,使得整個系統(tǒng)擴展性很好。 webpack馬上要出5了,完全手寫一個優(yōu)化后的腳手架是不可或缺的技能。 本文書寫時間 2019年5月9日 , webpack版本 4.30.0最新版本 本人所有代碼均手寫,親自試驗過可...

    bingo 評論0 收藏0
  • 前端面試整理

    摘要:新布局基本數(shù)據(jù)類型,幾種種也是返回類型非負(fù)區(qū)別創(chuàng)建對象的方式閉包的理解原型鏈原理手寫判斷是一個數(shù)組深拷貝原生操作創(chuàng)建元素刪除元素你覺得有哪些好處還用過什么工具庫事件委托事件理解規(guī)范怎么寫插件怎么給數(shù)組原型添加方法怎么合并兩個對象常 h5 html5 新api storage geolocation history webworker indexDB websocket can...

    yvonne 評論0 收藏0

發(fā)表評論

0條評論

王偉廷

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<