开源项目为了做性能优化都这样干了

前几天看到 Parcel 发布了 2.3 版本,其中一个 feature 挺有意思

04ec73f0c30ef4a8840f1b4cecebc3e6.png

NZo8NN

大概意思是这次版本 Parcel 减少了 70% 的依赖,具体做法为:

•预编译一些依赖到 Parcel 中而不是从 npm 下载•使用时才去安装 Node 内置的一些 polyfill•Babel 及 PostCSS 使用时才去安装

Parcel 通过以上几种办法实现了减少依赖的需求,笔者对于这块还是挺好奇他们怎么实现的(当然差不多能猜出来是通过包加载策略去做的),所以去阅读了一些代码。

首先是预编译。这块其实很简单,就是把一些包直接打包进 Parcel 了,这样也就省了用户本地再安装了。

这种做法减少依赖在笔者看来其实还是其次,最主要的还是固化了这些包的版本。这个怎么理解呢?

简单来说,当我们安装 dependencies 里的东西时,包管理器会根据版本规则去下载这个规则下所允许的最新版本。那么就会导致用户本地安装的 dependencies 中的包版本并不都是相同的。万一这些包其中一个的新版本做了一些破坏性修改的话(这个其实在开源社区很常见),就很可能导致用户跑不起来了。

但是通过预编译的做法我们可以固化版本,自然就不会遇到这类问题,并且预编译的做法其实在挺多库中已被广泛使用,比如说 umi。

另外两种优化做法总结一下都是按需安装。大家应该都知道 Webpack 有模块解析的功能,它能够解析几种规则。实际上每个 builder 都有类似的功能,具体实现都是自己在内部实现了 resolve 的功能。如果你有兴趣了解下 Parcel 中是如何做的话,可以具体阅读链接[1]中的代码及被引用到的地方。

笔者简单概括下做法。当 Parcel 解析到用户的引用代码时,会通过内部的 Resolver 去处理。假如能找到这个包就没啥问题,如果找不到这个包且该包是一个按需安装的包的话,就自动去安装并再次 resolve。大家也可以直接阅读下以下代码,其实也写的听清楚了:

6b825f95cb3917bcec7868d4e822252d.png
image-20220214213148339

Parcel 的做法其实还是挺值得借鉴的,尤其是对于做公司内部工具链的同学。因为很多时候一个工具链用户只会经常使用其中一部分功能,另外的功能可能不使用或者次数很少,那么实际上就没必要在最初安装的时候就需要用户一股脑的把所有依赖都下载一遍,完成可以通过按需的方式来做。

引用链接

[1] 链接: https://github.com/parcel-bundler/parcel/blob/v2/packages/utils/node-resolver-core/src/NodeResolver.js#L78

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值