Next.js 公共變數
Next.js 因其對環境變數的處理而受到臭名昭著的批評。儘管多年來它已經得到了改進,但它仍然存在一些可能令人困惑的怪癖,特別是當涉及到透過 process.env 物件公開的公共變數時。
所有 NEXT_PUBLIC_ 前綴的變數都是客戶端可存取的,但正如官方文件中提到的,它們僅在建置時可用,因此與 Docker 一起使用時無法在執行時間變更。
雖然我過去已經討論過這個問題,但我發現了另一種可能有趣的探索方法,即使用可以在運行時更改的全域共享變數。
設定 Polyfill
Next.js 部分支援全域變量,但我們可以透過一個小的注入腳本使用 polyfill 來使它們可用。
// app/layout.tsx <script dangerouslySetInnerHTML={{ __html: `!function(t){function e(){var e=this||self;e.globalThis=e,delete t.prototype._T_}"object"!=typeof globalThis&&(this?e():(t.defineProperty(t.prototype,"_T_",{configurable:!0,get:e}),_T_))}(Object);`, }} />
原始程式碼取自GitHub上的這個評論,它基本上創建了一個全域的globalThis對象,可用於在客戶端和伺服器之間共用變數。 Polyfill 隨 Next.js 14.x 一起提供,但它似乎破壞了某些瀏覽器中的 globalThis 對象,這就是我們使用 __html 屬性將程式碼直接注入頁面的原因。
使用 Zod 驗證變量
接下來,我們可以使用 Zod 在運行時驗證變量,如果變量無效則拋出錯誤。此步驟對於確保變數始終可用且有效、避免執行時間錯誤以及使應用程式面臨安全問題至關重要。
npm install zod
然後我們建立一個變數.ts 文件,其中包含一些實用函數,用於從 process.env 中獲取變數並將它們安全地轉換為預期類型。
// lib/env.ts import { z } from 'zod'; // Load the variables export const load = () => { return process.env; }; // Parse or throw the variables export function parseOrThrow(schema: z.Schema, data: unknown, error: Error) { const parsed = schema.safeParse(data); // Log the errror if (parsed.success) return parsed.data; console.error(parsed.error); throw error; } // Some zod helpers to use export const port = z .string() .refine( (port) => parseInt(port) > 0 && parseInt(port) < 65536, 'Invalid port number' ); export const str = z.string(); export const url = z.string().url(); export const num = z.coerce.number(); export const bool = z.coerce.boolean();
load 是一個傳回 process.env 物件的簡單函數,而 parseOrThrow 是一個實用函數,它使用 Zod 模式解析變量,並在變數無效時拋出錯誤。
最後,我們可以建立一個變數.ts 文件,其中包含變數架構以及用於載入和解析變數的實用函數。
// lib/vars.ts import { z } from 'zod'; import { load, parseOrThrow } from './env'; import { parseOrThrow, load, str, num, bool, port } from './env'; // Define the variables schema const schema = z.object({ PUBLIC_VARIABLE: str.optional(), PUBLIC_MY_NUM: num, PUBLIC_BOOL: bool, PUBLIC_PORT: port, }); export const loadEnv = () => { const env = load(); const parsed = parseOrThrow(schema, env, new Error('Invalid variables')); for (const key of Object.keys(parsed)) { if (!globalThis[key]) { globalThis[key] = parsed[key]; } } };
使用變數
為了使用變量,我們需要先載入它們。我們可以在 app/layout.tsx 檔案或任何其他佈局檔案中執行此操作,以逐漸將它們暴露給應用程式的其餘部分,無論是在客戶端還是在伺服器上。
// app/layout.tsx import { loadEnv } from '@/lib/vars'; loadEnv(); export default function RootLayout({ children, }: { children: React.ReactNode; }) { return ( <html lang="en"> <body>{children}</body> </html> ); }
參考
- Next.js 環境變數
- Next.js GitHub 討論
以上是Next.js 公共變數的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

從C/C 轉向JavaScript需要適應動態類型、垃圾回收和異步編程等特點。 1)C/C 是靜態類型語言,需手動管理內存,而JavaScript是動態類型,垃圾回收自動處理。 2)C/C 需編譯成機器碼,JavaScript則為解釋型語言。 3)JavaScript引入閉包、原型鍊和Promise等概念,增強了靈活性和異步編程能力。

JavaScript在Web開發中的主要用途包括客戶端交互、表單驗證和異步通信。 1)通過DOM操作實現動態內容更新和用戶交互;2)在用戶提交數據前進行客戶端驗證,提高用戶體驗;3)通過AJAX技術實現與服務器的無刷新通信。

JavaScript在現實世界中的應用包括前端和後端開發。 1)通過構建TODO列表應用展示前端應用,涉及DOM操作和事件處理。 2)通過Node.js和Express構建RESTfulAPI展示後端應用。

理解JavaScript引擎內部工作原理對開發者重要,因為它能幫助編寫更高效的代碼並理解性能瓶頸和優化策略。 1)引擎的工作流程包括解析、編譯和執行三個階段;2)執行過程中,引擎會進行動態優化,如內聯緩存和隱藏類;3)最佳實踐包括避免全局變量、優化循環、使用const和let,以及避免過度使用閉包。

Python和JavaScript在社區、庫和資源方面的對比各有優劣。 1)Python社區友好,適合初學者,但前端開發資源不如JavaScript豐富。 2)Python在數據科學和機器學習庫方面強大,JavaScript則在前端開發庫和框架上更勝一籌。 3)兩者的學習資源都豐富,但Python適合從官方文檔開始,JavaScript則以MDNWebDocs為佳。選擇應基於項目需求和個人興趣。

Python和JavaScript在開發環境上的選擇都很重要。 1)Python的開發環境包括PyCharm、JupyterNotebook和Anaconda,適合數據科學和快速原型開發。 2)JavaScript的開發環境包括Node.js、VSCode和Webpack,適用於前端和後端開發。根據項目需求選擇合適的工具可以提高開發效率和項目成功率。

C和C 在JavaScript引擎中扮演了至关重要的角色,主要用于实现解释器和JIT编译器。1)C 用于解析JavaScript源码并生成抽象语法树。2)C 负责生成和执行字节码。3)C 实现JIT编译器,在运行时优化和编译热点代码,显著提高JavaScript的执行效率。
