我在应用webpack过程中,很屡次用到一个性能就是tree-shaking(树摇),这是一个非常形象的名字,这个性能实现webpack在打包过程中将没有应用的模块或者没有运行的代码干掉。


1、模块引入计划

在开始介绍tree-shaking的实现原理之前,咱们先看下几种支流的模块引入计划:

  • AMD计划
  • CMD
  • commonjs
  • es6Module

次要看下前面两个:

  • commonjs:
  • es6module

对于es6Module和commonjs次要区别在于

  • 1、ES6 Module 输入的是值的援用,而 CommonJS 输入的是值的拷贝
  • 2、ES6 Module 是编译时执行,而 CommonJS 模块是在运行时加载
  • 3、CommonJs 是单个值导出,ES6 Module能够导出多个
  • 4、CommonJs 是动静语法能够写在判断里,ES6 Module 动态语法只能写在顶层

ES6Module 最大的特点就是动态化,在编译时就能确定模块的依赖关系,以及输出和输入的值,这象征意味着模块的依赖关系是确定的,和运行时的状态无关,能够进行牢靠的动态剖析,正是基于这个根底,才使得 Tree-Shaking 成为可能

即: tree-shaking依赖ES6module的动态剖析

2、tree-shaking的性能

tree-shaking的性能次要是有两点:

  • 按需加载,即没有被援用的模块不会被打包进来;
  • 把加载后未应用的模块干掉
  • 把加载结束的模块中的未应用的代码干掉

tree-shaking实现原理:

  • Tree-shaking = ES6odule(非default) + UglifyJS
  • 其中,es6module通过对模块进行动态剖析,找到未引入模块和引入但未应用模块; UglifyJS实现对引入模块中未应用的代码进行干掉

参考: https://www.ruanyifeng.com/bl...