编写小于1TB大小的JS库

创建额外的小型的小指南

不再有趣,但仍然是当前图片

该帖子的灵感来自于安德烈·西特尼克(Andrey Sitnik)创建的纳米图书馆的想法(例如nanoid,nanoevents和nanodelay)

介绍

上次,我真的为NPM中的库大小感到疯狂。 你觉得还可以吗 让我摘下你的玫瑰色眼镜。

只需查看最流行的软件包的统计信息即可创建对象的深层克隆。 你可以在这里找到它。

它的大小在这里。 对于只有一个功能的软件包来说,这确实是一个巨大的选择。 这就是为什么我将nanoclone做到相同的原因(除了克隆圆形对象,我将在以后完成)。 看一下纳米克隆的大小:

它的体积缩小了51倍,而且没有任何问题。

我想分享我在创建额外的小型库方面的经验,并告诉您如何加入我们的nanohype😎

最小化,控制或不使用所有外部依赖项

如果要创建纳米库,则仅在以下两种情况下才应使用外部依赖项:

  • 如果没有特定的软件包(例如,路径到正则表达式)或任何其他可以正常工作,经过良好测试且尺寸较小的软件包,您将无法应对
  • 这是另一个不会大大增加库大小的纳米库。

如果您没有发现轻量级的类似物应该由您编写,则可以使用另一个助手,例如clone / deepmerge / etc(顺便说一下,我的朋友尼古拉也做了nanomerge,很喜欢)。

有人会说“ utils.js是邪恶的”,但这种主张不适用于纳米图书馆

没有建设者和翻译者

等等,什么? 是的,如果您想拥有一个很小的库,则不应使用webpack,汇总,babel和其他修改代码的工具。 因为您捆包尺寸的大部分将被特定的捆扎机功能,通货膨胀填料和其他垃圾填充。

仅当您具有外部依赖项并希望将您的库作为CDN中的包括在内时,才使用汇总。 但是,如果没有依赖性,则可以将所有代码存储在一个文件中,而无需使用更多汇总。

那么,如何丑化呢? Uglify对于额外的小型库不会给您带来很大的影响。 当我编写nanoclone时,仅使用uglify插件进行汇总甚至增加了文件大小。

文件大小比较。 丑陋的有额外的9B

雅各布·格罗斯(JacobGroß)的笔记

使用ES6 +功能

答案是不。 为了保存最大的浏览器兼容性,并且不使用会增加库大小的编译器,您应该编写仅ES5的代码。

我知道ES6的功能很棒,但是IE不支持诸如散布运算符或异步/等待之类的语法糖。 使用转译器是如此昂贵。

它还适用于imports/exports用法。 使用require代替ES6模块。 它还将使人们使用不支持imports Node.js使用您的库(仅在v9.0 +中带有— experimental-modules标志,但有多少人使用它?Node v4 LTS仅在2018年8月到期) 。

使用特殊工具控制尺寸

我使用大小限制来控制我的库大小。 这是一个小型实用程序,可以检查所有依赖项和gzip的文件大小,并在超出设置的限制时引发错误。 它还具有— why标记以显示库零件的大小

大小限制示例

有时我会在安装软件包之前使用bundlephobia检查软件包的大小。

您可以查看其他版本的捆绑包大小和下载时间

如果您使用的是VSCode,我还建议您导入费用插件。 显示导入代码的大小

进口成本演示

结论

因此,制作超小型库的规则:

  • 没有外部依赖关系(非常重要的程序包或其他纳米库除外)
  • 没有使用捆绑器和编译器(但是您可以使用汇总来将您的库作为包括在内)
  • 没有使用ES6功能( imports/exports也是ES6的一部分!)

希望这篇帖子对您有用并且有趣interesting

特别感谢Andrey Sitnik的想法和动力。

投稿后

发起了一个挑战—写我自己的lodash ,其中没有一种方法的大小超过1KB。 如果你感兴趣:

  • Github仓库:这里
  • Twitter:这里