JavaScript 仍然无法交付一个全栈模块
本文剖析了 JavaScript 生态系统在构建和分发同时包含前端和后端代码的完整模块时面临的长期困境。尽管 Node.js 和浏览器环境都已支持 ES Modules,但实际开发中仍缺乏一种标准化的方式,让开发者能编写一个同时兼容客户端和服务器的模块,并可靠地在两者间共享逻辑、类型和配置。文章探讨了当前折衷方案的局限性,并呼吁社区解决这一阻碍全栈发展的根本问题。
背景速读
- 作者批评 JavaScript 生态系统至今没有一个标准方式让同一个 npm 模块同时可靠地在浏览器(前端)和 Node.js/服务器(后端)运行,每次发布跨环境包仍需手动配置。
- 文章从最早的“同构 JavaScript”(Isomorphic JavaScript)概念讲起,历数各代方案:打包器条件导出(Webpack等)、Node.js 的 package.json "exports" 字段、Deno 的 URL 导入、以及多方各自的 runtime 检测 hack。
- 核心痛点:不同运行时对 ES Modules (ESM) 和 CommonJS (CJS) 的支持碎片化,导致库作者被迫编写多层 shim 或维护多个入口文件。
- 文章提出缺乏“全栈模块”规范阻碍了 TypeScript 生态的复用效率,并对比了 Rust 的 crate 系统——后者从语言层面就统一了目标平台的条件编译。