不折騰的前端,和鹹魚有什麼區別前端
目錄 |
---|
一 目錄 |
二 前言 |
三 Babel |
3.1 AST |
3.2 Babel 原理 |
四 Webpack - Scope Hoisiting |
4.1 Scope Hoisting 開啓先後對比 |
4.2 原理 |
五 參考文獻 |
5.1 Scope Hoisting |
5.2 Babel |
返回目錄
由於 Babel
和 Webpack
的 Scope Hoisting
篇幅過小啦,感受沒啥內容,發出來像划水,因而抽取出來了。webpack
而後由於是純理論的知識點,又不記得是否是直接複製某篇文章的,因此若是文章有冒犯,歡迎聯繫我刪除,聯繫方式在 GitHub 首頁:git
固然,文章是沒有收益的,純 share
,佛系發文,隨緣交友,歡迎來聊天吹水。es6
過年回去又要被催找女票了,好扎心……
返回目錄
Babel
嗎?AST
,而後將這份 AST
轉換爲咱們須要形式的 AST
,最後將這個 AST
再轉換成 ES5 或者指望格式的內容。Babel
插件嗎?返回目錄
抽象語法樹(Abstract Syntax Tree,AST),或簡稱語法樹(Syntax tree),是源代碼語法結構的一種抽象表示。github
它以樹狀的形式表現編程語言的語法結構,樹上的每一個節點都表示源代碼中的一種結構。web
之因此說語法是 「抽象」的,是由於這裏的語法並不會表示出真實語法中出現的每一個細節。面試
轉換成 AST 的目的就是將咱們書寫的字符串文件轉換成計算機更容易識別的數據結構,這樣更容易提取其中的關鍵信息,而這棵樹在計算機上的表現形式,其實就是一個單純的 Object
。編程
好比 if(false){}
編譯成 AST 代碼,咱們是知道這段不執行的,就刪除這個語法。小程序
返回目錄
大多數 JavaScript Parser
遵循 estree
規範,Babel
最初基於 acorn
項目(輕量級現代 JavaScript 解析器)segmentfault
Babel
大概分爲三大部分:
解析:將代碼轉換成 AST
token
流,即語法單元成的數組AST
轉換:訪問 AST
的節點進行變換操做生產新的 AST
Taro
就是利用 babel
完成的小程序語法轉換AST
爲基礎生成代碼想了解如何一步一步實現一個編譯器的小夥伴能夠移步 Babel
官網曾經推薦的開源項目 the-super-tiny-compiler。
返回目錄
Scope Hoisting
是 Webpack3 的新功能,直譯爲 「做用域提高」,它可讓 Webpack 打包出來的 「代碼文件更小」,「運行更快」。
熟悉 JavaScript 都應該知道 「函數提高」 和 「變量提高」 ,JavaScript 會把函數和變量聲明提高到當前做用域的頂部。
「做用域提高」 也相似於此,Webpack 會把引入的 js 文件 「提高到」 它的引入者頂部。
返回目錄
假設咱們有兩個文件:
原始文件
// main.js export default "hello jsliang~"; // index.js import str from "./main.js";
使用 Webpack 打包後輸出文件內容:
[ (function (module, __webpack_exports__, __webpack_require__) { var __WEBPACK_IMPORTED_MODULE_0__util_js__ = __webpack_require__(1); console.log(__WEBPACK_IMPORTED_MODULE_0__util_js__["a"]); }), (function (module, __webpack_exports__, __webpack_require__) { __webpack_exports__["a"] = ('hello jsliang~'); }) ]
開啓 Scope Hoisting 後輸出文件內容:
[ (function (module, __webpack_exports__, __webpack_require__) { var util = ('hello jsliang~'); console.log(util); }) ]
對比兩種打包方式輸出的代碼,咱們能夠看出,啓用 Scope Hoisting
後,函數聲明變成一個, main.js
中定義的內容被直接注入到 main.js
對應模塊中,這樣作的好處:
返回目錄
Scope Hoisting
的實現原理其實很簡單:分析出模塊之間的依賴關係,儘量將打散的模塊合併到一個函數中,前提是不能形成代碼冗餘。所以「只有那些被引用了一次的模塊才能被合併」。
因爲 Scope Hoisting
須要分析出模塊之間的依賴關係,所以源碼「必須採用 ES6
模塊化語句」,否則它將沒法生效。緣由和 Tree Shaking
中介紹的相似。
返回目錄
返回目錄
返回目錄
jsliang 的文檔庫由 梁峻榮 採用 知識共享 署名-非商業性使用-相同方式共享 4.0 國際 許可協議 進行許可。<br/>基於 https://github.com/LiangJunrong/document-library 上的做品創做。<br/>本許可協議受權以外的使用權限能夠從 https://creativecommons.org/licenses/by-nc-sa/2.5/cn/ 處得到。