结合自己造的轮子实践按需加载
本文提供了按需加载了几种思路,并给出了相应实践。原文地址
为了探究按需加载的本质,选择了对先前造的轮子 diana 进行实验。
实验一:全量引用
import * as _ from 'diana'
打包体积结果如下:
测试的是 diana 0.4.1
实验二:部分引用
import { equal } from 'diana'
打包体积结果如下:
经过测试,发现两种方式打包后的体积都为 21 k,第二种方式仍然将整个包
引入项目中了。可是 lodash 就是这么玩的呀,这和说好的不一样呀,难道是忽视了什么细节么。
下文就来揭开面纱,并动手改造项目,最终目标是用第二种写法实现按需加载,减小打包体积。
按需加载的方案
按需加载的效果是最终打包的代码里没有未引入的模块,从而优化项目体积。下面给出 3 种可以按需加载的方案。
给每个函数单独发布 npm 模块
按需加载的方案一是将每个函数都单独发布一个包,可以在 npm 上查阅 lodash,这种引用方式如下:
import { isEqual } from 'lodash.isequal'
每一个函数都作为一个单一的模块导出
按需加载的方案二是将每一个函数都作为一个单一的模块导出,参照这种思路将 diana 的每个函数暴露在 lib 目录下,部分截图如下:
这时候再来测试下打包体积:
import equal from 'diana/lib/equal'
打包体积结果如下:
可以看到打包体积减小约为原来的 1/7 了,但是这种方案在写法上过于冗长,那要不借助下 babel ?
方案二 + babel
方案三是在方案二的基础上借助 babel 插件后,写法可以如下:
import { equal } from 'diana'
在 .babelrc
里进行如下配置:
// .babelrc
{
"plugins": [
["on-demand-loading", {"library": "diana"}]
]
}
此时打包体积如下:
实际上,babel 插件 的作用是将 import { equal } from 'diana'
编译成 import equal from 'diana/lib/equal'
。
babel 插件执行机制
babel 执行三部曲如下:
- 解析
使用 babel-parse 将 JS 代码解析成 AST 树
- 转换
配合 babel-traverse 进行 AST 树的遍历,同时使用 babel-core 对外暴露的 transform
来调用相应插件来转化 AST 树
babal.transform(code, {
plugins: { pluginA, pluginB }
})
- 生成
使用 babel-generator 将 AST 树转换回 JS 代码
值得阅读的文章
- babel 中文官网
- 剖析 Babel —— Babel 总览,这篇文章讲得比较透彻
- babel-handbook,babel 手册,推荐
- Babel 插件开发一些示例,这篇文章 bug 比较多,可以作为上面文章的补充
- AST explore,可以在这个网站上看到 JS 代码对应的 AST
作者:牧云云
出处:http://www.cnblogs.com/MuYunyun/"
本文版权归作者和博客园所有,欢迎转载,转载请标明出处。
如果您觉得本篇博文对您有所收获,请点击右下角的 [推荐],谢谢!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构