新闻详情

新闻详情

首页 / 资讯中心 / 详情

next-runtime-env核心API env()全解析:一个函数打通浏览器与服务器环境变量读取

发布时间:2026/9/6 10:09:46来源:尧图网络
next-runtime-env核心API env()全解析:一个函数打通浏览器与服务器环境变量读取
next-runtime-env核心API env()全解析一个函数打通浏览器与服务器环境变量读取【免费下载链接】next-runtime-envNext.js Runtime Environment Configuration - Populates your environment at runtime rather than build time.项目地址: https://gitcode.com/gh_mirrors/ne/next-runtime-envnext-runtime-env 是一个 Next.js 运行时环境变量配置库核心 APIenv()函数让你不再受限于构建时注入——同一个函数调用浏览器里读NEXT_PUBLIC_前缀的公开变量服务器端读process.env中的任意变量真正实现「一次构建多环境部署」。为什么需要 next-runtime-env 的 env() 函数 Next.js 默认在构建时就把NEXT_PUBLIC_变量的值「烧录」进 JS 包。这意味着换个环境测试/生产就得重新构建一次违反「构建一次部署多处」Build once, deploy many的持续交付原则服务器变量改了值浏览器里的包不会变next-runtime-env的思路是把环境变量注入时机从构建时推迟到运行时——服务器每次请求时读取最新的process.env并通过内联脚本塞进页面浏览器随取随用。而env()就是这一切的统一读取入口。快速上手3 步在 Next.js 项目中启用 env() 第 1 步安装npm install next-runtime-env第 2 步在根布局的head中挂载PublicEnvScript// src/app/layout.tsx import { PublicEnvScript } from next-runtime-env; export default function RootLayout({ children }) { return ( html langzh-CN head PublicEnvScript / /head body{children}/body /html ); }第 3 步在任何位置用env()读取变量import { env } from next-runtime-env; export function MyComponent() { const NEXT_PUBLIC_FOO env(NEXT_PUBLIC_FOO); return div{NEXT_PUBLIC_FOO}/div; }官方推荐Script 方案因为env()可以脱离 React 上下文使用如useEffect里发请求、工具函数里读配置如果你只待在 React 组件内也可以选 Context 方案PublicEnvProvideruseEnvContextHook。完整步骤见 GETTING_STARTED.md。源码级解析env() 的浏览器 / 服务器双路机制 env()的完整实现只有 20 多行核心逻辑在src/script/env.tsexport function env(key: string): string | undefined { if (isBrowser()) { if (!key.startsWith(NEXT_PUBLIC_)) { throw new Error( Environment variable ${key} is not public and cannot be accessed in the browser., ); } return window.__ENV[key]; } noStore(); return process.env[key]; }它内部按运行环境走了两条完全不同的路运行环境数据来源安全约束 浏览器全局对象window.__ENV仅允许NEXT_PUBLIC_前缀否则直接抛错️ 服务器Node 的process.env无限制可读取任意变量浏览器路径的幕后细节isBrowser()src/helpers/is-browser.ts通过检测window.__ENV是否存在来判断是否在浏览器中PublicEnvScriptsrc/script/public-env-script.tsx在页面渲染时把运行时的最新环境变量序列化为内联脚本window[__ENV] {...}写入head见src/script/env-script.tsx变量统一挂载在__ENV键上键名定义在src/script/constants.ts。服务器路径的关键一行noStore()它调用 Next.js 的unstable_noStore取消响应缓存确保每次请求都拿到最新的环境变量——这正是「运行时」而非「构建时」的核心保障。常见坑位使用 env() 前必看的 3 个要点 ⚠️1. 在浏览器里读非公开变量会直接抛错env(DB_PASSWORD); // ❌ 浏览器中抛错not public and cannot be accessed in the browser这是故意的安全设计。如果你确实要把某个无前缀变量暴露给浏览器用工具函数makeEnvPublicsrc/utils/make-env-public.ts给它自动加NEXT_PUBLIC_前缀makeEnvPublic(API_URL); // process.env.API_URL → process.env.NEXT_PUBLIC_API_URL2. 敏感信息永远不要加NEXT_PUBLIC_前缀凡是NEXT_PUBLIC_开头的变量最终都会出现在浏览器页面的 HTML 里任何人都能看到。密钥、Token 类变量只应留在服务器端通过env()的服务器路径读取。3. 自定义暴露哪些变量默认只暴露NEXT_PUBLIC_前缀的变量。想精细控制暴露范围参考 EXPOSING_CUSTOM_ENV.md想批量公开无前缀变量参考 MAKING_ENV_PUBLIC.md。版本怎么选next-runtime-env 与 Next.js 版本对照 next-runtime-env 版本适配的 Next.js1.xNext.js 12/13Pages Router2.xNext.js 13App Router3.xNext.js 14含高级缓存支持✅ 推荐开发时仍可直接使用.env文件与标准 Next.js 开发体验保持一致。小结 env()用一个极简的函数签名抹平了 Next.js 客户端与服务端的环境变量读取差异✅ 浏览器读window.__ENV服务端读process.env同一份代码两端通用✅ 运行时注入 noStore()保证「一次构建到处部署」✅ 强制NEXT_PUBLIC_前缀校验把安全边界写进了 API 本身如果你的项目还在为「改个环境变量就要重新构建」头疼next-runtime-env值得一试。【免费下载链接】next-runtime-envNext.js Runtime Environment Configuration - Populates your environment at runtime rather than build time.项目地址: https://gitcode.com/gh_mirrors/ne/next-runtime-env创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

sprint boot 使用XML方式实现操作数据库 2026/9/6 10:08:43

sprint boot 使用XML方式实现操作数据库

前面我们已经学习使用MyBatis-Plus依赖实现操作数据库,MyBatis-Plus还支持XML文件来操作数据库,一般适合于复杂的SQL操作 spring boot使用MyBatis-Plus依赖实现操作数据库-CSDN博客 spring boot 实现数据库分页操作-CSDN博客 前期的基础配置信息参考上…

阅读更多 →
广角镜头光学设计实战:像差控制与Zemax优化流程 2026/9/6 10:08:43

广角镜头光学设计实战:像差控制与Zemax优化流程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
STM32F407移植lwIP协议栈搭建HTTPD服务器实战指南 2026/9/6 10:08:43

STM32F407移植lwIP协议栈搭建HTTPD服务器实战指南

做嵌入式网络开发,你迟早会遇到 lwIP 这个轻量级协议栈。我手头正好在用 STM32F407 跑带 MAC 控制器的方案,配合外置 PHY 芯片做以太网通信,前后调了大概两周时间,把 lwIP 协议栈从零移植到位,又在上面搭了一个 HTTPD …

阅读更多 →
CMSIS-5深度评测:从库到Cortex-M软件生态标准,嵌入式必懂 2026/9/6 10:08:43

CMSIS-5深度评测:从库到Cortex-M软件生态标准,嵌入式必懂

很多做嵌入式的人一提到 ARM 加 CMSIS-5,第一反应是“哦,Keil 里自带的那个库”。这个理解不能说错,但它把一个原本应该被认真对待的软件架构标准,压缩成了一个“顺手能用就行”的存在。我自己早年在项目中直接复制 CMSIS 目录进工…

阅读更多 →
世界模型Atlas深度解析:从3D空间智能到具身智能应用边界 2026/9/6 10:08:43

世界模型Atlas深度解析:从3D空间智能到具身智能应用边界

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
2026新版51单片机入门教程推荐:底层逻辑与工程实践详解 2026/9/6 10:05:42

2026新版51单片机入门教程推荐:底层逻辑与工程实践详解

很多刚入门的同学问我,2026年学单片机,是不是应该直接上32位ARM,51单片机是不是已经过时了。我在嵌入式这个圈子里待了十几年,带过的实习生也不少,每次听到这种问题都想多说几句。51单片机确实老,但它“老”…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞