aristolochic
2021-08-11 22:09:59 +08:00
有一部分原因应该和 Node 依照文件系统逐级查找,且一个包有很多种入口可能性,需要按照 Fallback 顺序检测直到完成加载的模块 Resolution 机制有关。这种模型包括 CommonJS 设计之初是基于文件系统的访问速度很快可以忽略不记的假设成立之上的。连它本身都这么设计,npm 也没有道理不一切从简,然后就出现了比黑洞更深,令 Windows 瑟瑟发抖的恐怖存在。谁能想到之后会如此复杂,npm 也不得不做出调整。包括 yarn PnP 设计的一大理由就是没有理由惯着 Node 这么粗放动态的模块 Resolution 机制。
如果你说的是充当前端构建工具的 Node,那个占硬盘、小文件多、慢也占不到用户头上,如果乐意的话构建前安装,每次构建完了就删,和 CI 的思路就一样了;前端需要解决的问题复杂度已经很多人说过了,这个实在是没办法。另外谁叫所有人都在写 SPA,或许是图方便大量程序员间的协调?不少人说前端卷,好像在想尽办法提升后来人的入门台阶。这个确实有,比如各种 KPI 开源项目,不过这顶帽子怎么也安不到 npm 和 node_modules 上。
如果你说的是当后端使的 Node,除了有很多框架原生支持 TypeScript 之外,似乎很少有听说过后端需要编译的。后端领域因为环境可控,不太可能会引入前端的那些 Polyfill/Shim, Transpiling, Purge 库和相关的 Bundle 工具链等等,node_modules 不会很夸张。所以 Node 作为所谓 Server Side JS,其实并没有后端生态( x
要说未来发展,听各位描述了一下 pnpm,似乎约等于 Node 版的 Bundler 啊。我还挺期待 yarn PnP 以后会是什么样子,毕竟 npm 抄过 yarn 的依赖扁平化,没道理不再抄一次。
不过私以为影响 Node (主要是前端)生态的最大问题是,再过几年可能所有人都去用 esbuild 这种压根不打包的工具( Elixir Phoenix 1.6 就已经决定把 Node 和 webpack 踢了,自己管理 esbuild 。这样用一个单一的二进制,所有进程都由 Erlang BEAM Port 管理还恰恰更加符合 Elixir Mix 的特色),除了老项目之外还有没有 Node 的事还不一定呢,所以干脆就别改了,现凑活凑活用过这几年算了吧(逃