segmentfault.com/a/119000001… juejin.im/post/5a4dca…
而在js运行时会进行三件事:1语法分析 2.预编译 3.解释执行
语法分析会在代码执行前对代码进行通篇检查,以排除一些低级错误
预编译发生在代码执行的前一刻
解释执行顾名思义就是执行代码
js编译器:https://www.zhihu.com/question/25254230
首先对源码进行分析(类似编译器前端做的工作:词法,语法分析等),得到AST后,
进一步分析(数据流,控制流分析,类型系统等),获取到一些有用的信息(类似智能
提示的那种,比如类型变换情况,转换是否安全,空指针检测,是否有潜在的bug等),
帮助我们写出安全的代码.
1.treeShake的作用是什么:
2.treeShake原理是什么:
ES6模块依赖关系是确定的,和运行时的状态无关,可以进行可靠的静态分析,这就是
tree-shaking的基础。所谓静态分析就是不执行代码,从字面量上对代码进行分析,
ES6之前的模块化,比如我们可以动态require一个模块,只有执行后才知道引用的什么模块,这个就不能通过静态分析去做优化。
--------------------------------------------------------------------------------
用代码消除在广泛存在于传统的编程语言编译器中,编译器可以判断出某些代码根本不影响输出,然后消除这些代码,这个称之为DCE
--------------------------------------------------------------------------------
ES6的模块引入是静态分析的,故而可以在编译时正确判断到底加载了什么代码。
--------------------------------------------------------------------------------
分析程序流,判断哪些变量未被使用、引用,进而删除此代码。
--------------------------------------------------------------------------------
rollup只处理函数和顶层的import/export变量,不能把没用到的类的方法消除掉javascript动态语言的特性
使得静态分析比较困难图7下部分的代码就是副作用的一个例子,如果静态分析的时候删除里run或者jump,程序运行时就可能报错,那就本末倒置了
,我们的目的是优化,肯定不能影响执行
3.treeShake是函数级别还是文件级别:
复制代码