每周轮子之 server-only:一个空包背后的“毒药”

每周轮子之 server-only:一个空包背后的“毒药”

💡 原文中文,约2700字,阅读约需7分钟。
📝

内容提要

本文探讨了 React Server Components 中的 server-only 模块,强调其安全性和构建时检查的重要性,分析了 npm 包的实现,指出如何防止源码泄露及构建工具的处理,确保服务端代码不被客户端访问。

🎯

关键要点

  • 本文探讨了 React Server Components 中的 server-only 模块,强调其安全性和构建时检查的重要性。
  • 提到 CVE-2025-55182 和 CVE-2025-55183 漏洞,强调源码泄露的风险。
  • 最佳实践建议在服务端代码顶部加上 import 'server-only' 来避免源码泄露。
  • 运行时检查方法不够安全,构建工具会将代码打包进浏览器,导致源码泄露。
  • server-only 模块通过构建时拦截实现安全,使用条件导出模式。
  • server-only 模块的 npm 页面极简,利用 Node.js 的条件导出实现精分 npm 包。
  • 在构建时,server-only 模块被服务端引入时为空文件,客户端引入时则报错。
  • 现代构建工具能处理类型引入,避免触发 server-only 的解析逻辑。
  • 开发 npm 包时需注意 react-server 的导出条件,以防止误用到前端。

延伸问答

什么是 React Server Components 中的 server-only 模块?

server-only 模块是一个用于确保服务端代码不被客户端访问的模块,通过构建时拦截实现安全性。

如何防止源码泄露?

最佳实践是在服务端代码顶部加上 import 'server-only',以避免源码泄露。

CVE-2025-55182 和 CVE-2025-55183 漏洞的影响是什么?

这两个漏洞会导致源码泄露,影响应用的安全性。

server-only 模块是如何实现安全性的?

server-only 模块通过构建时拦截和条件导出模式实现安全,确保服务端引入时为空文件,客户端引入时报错。

现代构建工具如何处理类型引入?

现代构建工具能够在编译阶段移除类型引入,避免触发 server-only 的解析逻辑。

开发 npm 包时需要注意什么?

开发 npm 包时,需手动添加 react-server 的导出条件,以防止误用到前端。

➡️

继续阅读