一 目录
不折腾的前端,和咸鱼有什么区别
目录 |
---|
一 目录 |
二 前言 |
三 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
篇幅太小啦,感觉没啥内容,收回来像划水,于是抽取进去了。
而后因为是纯理论的知识点,又不记得是不是间接复制某篇文章的,所以如果文章有触犯,欢送分割我删除,联系方式在 GitHub 首页:
- https://github.com/LiangJunro...
当然,文章是没有收益的,纯 share
,佛系发文,随缘交友,欢送来聊天吹水。
过年回去又要被催找女票了,好扎心……
三 Babel
返回目录
- 面试官:理解过
Babel
吗? - jsliang:大略晓得将 ES6+ 代码,先通过词法剖析和语法分析之后解析为
AST
,而后将这份AST
转换为咱们须要模式的AST
,最初将这个AST
再转换成 ES5 或者冀望格局的内容。 - 面试官:写过
Babel
插件吗? - jsliang:没有。
- (完结)
3.1 AST
返回目录
形象语法树(Abstract Syntax Tree,AST),或简称语法树(Syntax tree),是源代码语法结构的一种形象示意。
它以树状的模式体现编程语言的语法结构,树上的每个节点都示意源代码中的一种构造。
之所以说语法是 “形象”的,是因为这里的语法并不会示意出实在语法中呈现的每个细节。
转换成 AST 的目标就是将咱们书写的字符串文件转换成计算机更容易辨认的数据结构,这样更容易提取其中的要害信息,而这棵树在计算机上的表现形式,其实就是一个单纯的 Object
。
比方 if(false){}
编译成 AST 代码,咱们是晓得这段不执行的,就删除这个语法。
- AST Explorer
3.2 Babel 原理
返回目录
大多数 JavaScript Parser
遵循 estree
标准,Babel
最后基于 acorn
我的项目(轻量级古代 JavaScript 解析器)
Babel
大略分为三大部分:
解析:将代码转换成
AST
- 词法剖析:将代码(字符串)宰割为
token
流,即语法单元成的数组 - 语法分析:剖析 token 流(下面生成的数组)并生成
AST
- 词法剖析:将代码(字符串)宰割为
转换:拜访
AST
的节点进行变换操作生产新的AST
Taro
就是利用babel
实现的小程序语法转换
- 生成:以新的
AST
为根底生成代码
想理解如何一步一步实现一个编译器的小伙伴能够移步 Babel
官网已经举荐的开源我的项目 the-super-tiny-compiler。
四 Webpack - Scope Hoisiting
返回目录
Scope Hoisting
是 Webpack3 的新性能,直译为 「作用域晋升」,它能够让 Webpack 打包进去的 「代码文件更小」,「运行更快」。
相熟 JavaScript 都应该晓得 「函数晋升」 和 「变量晋升」 ,JavaScript 会把函数和变量申明晋升到以后作用域的顶部。
「作用域晋升」 也相似于此,Webpack 会把引入的 js 文件 “晋升到” 它的引入者顶部。
4.1 Scope Hoisting 开启前后比照
返回目录
假如咱们有两个文件:
原始文件
// main.jsexport default "hello jsliang~";// index.jsimport 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
对应模块中,这样做的益处:
- 「代码体积更小」,因为函数申明语句会产生大量代码,导致包体积增大(模块越多越显著);
- 代码在运行时因为创立的函数作用域更少,「内存开销也随之变小」。
4.2 原理
返回目录
Scope Hoisting
的实现原理其实很简略:剖析出模块之间的依赖关系,尽可能将打散的模块合并到一个函数中,前提是不能造成代码冗余。因而「只有那些被援用了一次的模块能力被合并」。
因为 Scope Hoisting
须要剖析出模块之间的依赖关系,因而源码「必须采纳 ES6
模块化语句」,不然它将无奈失效。起因和 Tree Shaking
中介绍的相似。
五 参考文献
返回目录
5.1 Scope Hoisting
返回目录
- [x] webpack 的 scope hoisting 是什么?【浏览倡议:5min】
- [x] 通过Scope Hoisting优化Webpack输入【浏览倡议:5min】
- [x] 【Webpack】654- 了不起的 Webpack Scope Hoisting 学习指南【浏览倡议:5min】
5.2 Babel
返回目录
- [x] 一篇文章理解前端开发必须懂的 Babel【浏览倡议:10min】
- [x] 不容错过的 Babel7 常识【浏览倡议:30min】
- [x] 前端工程师须要理解的 Babel 常识【浏览倡议:30min】
- [x] 深入浅出 Babel 上篇:架构和原理 + 实战【浏览倡议:30min】
- [x] 深入浅出 Babel 下篇:既生 Plugin 何生 Macros【浏览倡议:30min】
- [x] 前端工程师的自我涵养-对于 Babel 那些事儿【浏览倡议:20min】
- [x] 前端与编译原理——用JS写一个JS解释器【浏览倡议:20min】
- [x] 面试官: 你理解过Babel吗?写过Babel插件吗? 答: 没有。卒【浏览倡议:10min】
- [x] 入门babel--实现一个es6的class转换器【浏览倡议:10min】
jsliang 的文档库由 梁峻荣 采纳 常识共享 署名-非商业性应用-雷同形式共享 4.0 国内 许可协定 进行许可。<br/>基于 https://github.com/LiangJunrong/document-library 上的作品创作。<br/>本许可协定受权之外的应用权限能够从 https://creativecommons.org/licenses/by-nc-sa/2.5/cn/ 处取得。