全宇宙最重物体竟是...

小麦2024年06月17日921 字

今天我想告诉你一个关于 node_modules 的梗,它为什么被前端程序员调侃为全宇宙最重的物体,这期就让我们来一探究竟。

在介绍 node_modules 之前,我们先要了解伴随现代软件工程化开发的一个很重要的工具,包管理器(Package Manager)。这里的 “包” 是指包含程序代码、软件、资源的共享单元,而 “管理器” 则是管理这些 “包” 的工具,比如负责存储和分发。

例如,JS 使用 npm 和 yarn,Python 使用 pip,Rust 使用 Cargo 等等,这些包管理器通常服务于软件开发者,普通用户很少接触。

今天我们的故事就要从 npm 说起。

npm 的全程是 Node Package Manager,这里的 Node 代表 Node.js,Node.js 是 JavaScript 的运行器之一,它掌管着服务器 JS 程序的执行。

npm 几乎管理着世界上大多数 JS 程序包,这些程序包通过 npm 分发到服务器,最终在浏览器、桌面应用、手机 APP、小程序中为你呈现出丰富多彩的交互界面。

可见 npm 在整个前端工具链上的重要性不言而喻。

那 node_modules 是什么呢?

npm 通过网络将软件包(也叫依赖包)下载到磁盘,然后按照特定的组织方式,统一存放到 node_modules 文件夹中。

由于依赖包本身也会有依赖包,因此早期的 node_modules 按照非常简单且符合直觉的树形目录存放这些依赖包,例如:

这样的组织方式可以很好地满足那时的需求,但随着越来越多的开发者加入,软件包不断增多,如今 npmjs.com 上已经托管了多达 300 多万个软件包 。

这种无止境的套娃方案无法有效处理重复(deduped)的软件包,导致 node_modules 越来越深,出现了依赖地狱(Dependency Hell)问题,这不仅拖慢了安装、还造成了存储资源浪费,也就是这张图想要表达的意思。

那么有没有什么办法可以化解这个问题呢?

后人的智慧是无穷的,得益于活跃的开发者社区,目前已经存在诸多解决此问题的办法,比如:

npm 的扁平化依赖升级,它将原来的套娃结构优化为扁平结构,大大减少了目录深度。

后来为了进一步提升安装速度和优化空间占用,yarn 提出了 PnP 模式和工作空间 Workspaces。

再后来,后起之秀 pnpm 提出了全新的共享依赖模型,几乎解决了前人遇到的所有问题。

以前 node_modules 的设计常被人诟病,但在它背后,恰恰也说明了前端拥有一个极其活跃且强大的开源生态系统,这是其他编程语言和软件望尘莫及的,也正是这样的生态系统,造就了如今异彩纷呈的互联网。

软件和工具都是为了解决实际问题而存在,不可能一步到位,尽善尽美。node_modules 的庞大体积促使工具和技术不断进步,就像生物为了适应新环境不断进化一样。

我们在享受互联网给与我们便利生活的同时,也请不要忘记它背后千千万万勤劳的开源工作者们。

评论

你需要先登录才能发表评论
Made by 捣鼓键盘的小麦 / © 2025 Front Talk 版权所有