浅析webpack tree-shaking

  • 首先区分一下 es modules 和 common.js
  • es modules 用于浏览器环境的js模块化,export default 、export 来导出 。编译时引入。
  • common.js 用于node.js 平台,module exports 、 exports 来导出。运行时导入。
  • es modules 可以静态解析 哪个模块引入但没有调用 , 最后打包bundle.js 就不会打包那些没引入的模块。另外,tree-shaking 除了可以shake掉没有用到的模块,还可以摇掉没有用到的函数和变量。是script标签内声明的函数和变量,而不是methods里的或者data里的函数和变量,因为对于一个Vue的实例对象,methods和data都是属于一个对象的属性,属性是可以动态调用的,而script标签内Vue实例外部的函数和变量是不能动态调用。所谓动态调用就是,作为对象的属性,你是可以通过用户点击来切换是否引入这些属性,所以dev-server的watcher是不能判断其是否被调用,只能判断其对象。而外部的函数和变量,通过编译解析成AST后,ast tree 上的token 是变量形式的,变量是可以被遍历检索其是否被某个地方调用的,如果没有被用到那它就会是 no use 状态,因此tree-shaking会将其抹除。而tree-shaking的解析过程,就是一开始通过将一个类似entry.js的入口文件转化ast后,就检索ast上的token的状态,是否属于no use,而具体去实现的就是 uglify.js 去具体执行的。
  • 关于 HMR,为什么HMR能够如此迅速的去替换更改有变动的文件呢?除了是基于content hash来判断哪个文件是改动过的,浏览器相当于是一个client ,webpack端是一个server端,通过websocket来彼此进行通信。并且每次编译会将所有文件打包成一个bundle.js,而每个bundle.js 其实都是由多个模块的路径及打包内容组装的,这就为迅速编译提供了可能性,因为每个模块都有独特的路径,那么我只需知道哪个模块是做了修改的,只对该部分进行替换即可。所以HMR之所以能够快速的实现热替换,是因为webpack作为server端会先检索哪些文件是变动的,然后对这些文件单独进行编译打包成小的bundle,然后通过websocket与浏览器client端建立的通信通道,告诉其需求请求哪些小的文件,然后webpack会对这些文件打包成一个个的小bundle并返还给浏览器,再组装成大的bundle.js ,从而实现迅速的替换。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Webpack树摇是一种优化技术,它可以通过静态分析代码,识别出哪些代码没有被使用,然后将这些代码从最终的打包文件中删除,从而减小打包文件的体积。这种技术可以帮助开发者减少不必要的代码,提高应用程序的性能和加载速度。 ### 回答2: Webpack tree-shaking是指,使用webpack构建工具进行打包时,通过静态分析的方式,去除代码中没有用到的部分,以减小打包后的文件体积。它是针对ES6模块化语法设计的一种解决方案。 在ES6模块化语法中,模块一般是通过export关键字导出需要暴露的部分,通过import关键字引入需要使用的模块。我们常常会引入一个模块只为了使用它的某一个方法或变量,而在打包时,经常会将整个模块一起打包,导致最终打包后的文件过大。这时候,就需要tree-shaking来解决这个问题。tree-shaking会以导入模块为节点,分析出所有代码的关系,去除没有被使用到的部分。 具体的实现方式是,通过静态分析模块之间的依赖关系,找出所有的“无用代码”。在只要有一个代码块被使用,就可以排除它里面的所有没有用到的代码。最终,webpack会将剩余的有用代码打包到一个文件中,以提高打包的效率。 使用tree-shaking的好处是,可以减小打包后的文件体积,提高应用的加载速度和性能。但是,它也需要开发者自己注意代码的编写。因为只有静态分析发现没被使用的代码才能被排除,因此在编写代码时,需要让webpack能够分析出代码的具体使用情况,避免没有用到的代码被打包进去。 ### 回答3: Webpack Tree Shaking是一种优化技术,旨在减少前端网页或应用程序的体积和加载时间,这是特别适用于大型或复杂的项目或库。它是基于ES6模块系统的静态分析。静态分析是指在编译时(非运行时)进行分析,检查哪些函数、变量和代码路径实际上被使用了。然后用这些信息去优化我们要生成的代码,去除掉那些没有用过的代码,实现额外的减小文件体积的优化效果。 Webpack会自动创建依赖关系树,称为Module graph,用于确定每个模块的依赖,并创建与之相关的Chunk。树摇是在WebPack将库包装为模块和依赖关系树之后的下一步优化。它的作用是通过分析代码到汇编语言的转换过程(或更正式的称呼静态分析),以识别那些未使用的代码,并将其从最终构建中移除掉。举个例子,如果我们引入了一个JS库,但我们的代码仅使用了其中的一小部分函数,例如:一个仅仅用到math库中的pow函数。通过tree-shaking,只有Math.pow的函数在最终构建文件中会被包含,而没有被使用到的函数则被移除,如sqrt、log等等,这样就可以使最终构建包变得更小,提高项目的加载性能。 但是,我们需要知道一些前提和限制。Tree shaking 只能消除那些明确定义但未被引用的代码。对于动态引用的情况,如通过require(“path”+ variable + name)来引用模块等,Tree shaking可能会失效。另外,一些函数和语法结构比如eval()调用,这些都可能会让Tree shaking失效。 总之,webpack tree-shaking是目前优化JS代码体积的非常有效的方法之一,可以帮助我们有效地减少构建后的代码量和提高前端性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值