vue3中tree shaking特性

Treeshaking是一种优化技术,通过删除未使用的代码(Deadcodeelimination)来减小项目打包后的体积。基于ES6模块系统,它在编译时分析依赖关系和变量使用。在Vue中,使用构建步骤和适当的打包配置可以有效地实现Treeshaking,例如,未使用的组件或模块将不会包含在最终产物中。然而,注意webpack可能因defineComponent的函数调用误判副作用,需要特殊注释。对于不使用构建步骤的情况,可以考虑使用petite-vue这样的轻量级替代品。

Treeshaking是一种通过清除多余代码方式来优化项目打包体积的技术

专业术语叫 Dead code elimination

简单来讲,就是在保持代码运行结果不变的前提下,去除无用的代码

如何做到

Tree shaking是基于ES6模板语法(import与exports),主要是借助ES6模块的静态编译思想,在编译时就能确定模块的依赖关系,以及输入和输出的变量

Tree shaking无非就是做了两件事:

1、编译阶段利用ES6 Module判断哪些模块已经加载

2、判断那些模块和变量未被使用或者引用,进而删除对应代码

包体积与 Tree-shaking 优化

一个最有效的提升页面加载速度的方法就是压缩 JavaScript 打包产物的体积。当使用 Vue 时有下面一些办法来减小打包产物体积:

  • 尽可能地采用构建步骤

* 如果使用的是相对现代的打包工具,许多 Vue 的 API 都是可以被 tree-shake 的。举例来说,如果你根本没有使用到内置的 <Transition> 组件,它将不会被打包进入最终的产物里。Tree-shaking 也可以移除你源代码中其他未使用到的模块。

*当使用了构建步骤时,模板会被预编译,因此我们无须在浏览器中载入 Vue 编译器。这在同样最小化加上 gzip 优化下会相对缩小 14kb 并避免运行时的编译开销

  • 在引入新的依赖项时要小心包体积膨胀!在现实的应用中,包体积膨胀通常因为无意识地引入了过重的依赖导致的

  • 如果你只在渐进式增强的场景下使用 Vue,并想要避免使用构建步骤,请考虑使用 petite-vue (只有 6kb) 来代替

webpack Treeshaking 的注意事项

因为 defineComponent() 是一个函数调用,所以它可能被某些构建工具认为会产生副作用,如 webpack。即使一个组件从未被使用,也有可能不被 tree-shake。

为了告诉 webpack 这个函数调用可以被安全地 tree-shake,我们可以在函数调用之前添加一个 /*#__PURE__*/ 形式的注释:

export default /*#__PURE__*/ defineComponent(/* ... */)

请注意,如果你的项目中使用的是 Vite,就不需要这么做,因为 Rollup (Vite 背后在生产环境使用的打包器) 可以智能地确定 defineComponent() 实际上并没有副作用,所以无需手动注释。

vue3中的作用

  • 减少程序体积(更小)

  • 减少程序执行时间(更快)

  • 便于将来对程序架构进行优化(更友好)

### Vue 3 中利用 Tree Shaking 优化打包体积 Vue 3 支持基于 ES 模块的 Tree Shaking 机制,通过现代打包工具(如 Vite、Webpack、Rollup)可以自动移除未使用的代码,从而显著减少最终构建包的体积[^2]。Tree Shaking 的核心原理是静态分析模块依赖关系,识别并剔除未被引用的导出内容,使最终输出的代码仅包含实际使用到的部分。 在 Vue 3 中,组件和 API 都是以模块化方式组织的,例如 `ref`、`reactive`、`computed` 等响应式 API 都作为独立函数导出。这种模块结构使得打包工具能够精确地识别哪些代码被使用,哪些可以安全剔除[^1]。例如,如果项目中只使用了 `ref` 而没有使用 `computed`,则打包时 `computed` 相关的代码将不会被包含在最终输出中。 此外,Vue 3 的 Composition API 和响应式系统都经过模块化重构,使得每个功能模块都可以独立导入和使用。开发者可以通过以下方式引入所需功能: ```javascript import { ref, reactive } from &#39;vue&#39;; ``` 这种方式不仅提高了代码的可维护性,也为 Tree Shaking 提供了更细粒度的优化空间。 为了进一步提升 Tree Shaking 的效率,建议使用自动按需加载插件,如 `unplugin-vue-components`。该插件可自动识别项目中使用的组件,并仅导入这些组件,避免手动导入整个库[^5]。以 Vite 为例,其配置方式如下: ```javascript import Components from &#39;unplugin-vue-components/vite&#39;; import { ElementPlusResolver } from &#39;unplugin-vue-components/resolvers&#39;; export default defineConfig({ plugins: [ Components({ resolvers: [ElementPlusResolver()], }), ], }); ``` 结合 Tree Shaking 和按需加载机制,Vue 3 应用可以在开发阶段保持代码的模块化结构,在构建阶段实现高效的代码剔除,从而显著优化包体积[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值