Nuxt3 - 在運行時改變「環境變數」

更新於 發佈於 閱讀時間約 4 分鐘
raw-image
env 環境變數的設定,通常是為為了 server 而設定的,能快速的切換狀態,但現在的網頁開始,前端的範圍逐漸往後端靠近,所以在設定,也會有 client 的變數會想要在 .env 的情況。此篇就是以 nuxt 為實作,分享此內容


前端架構

最常見的 front 架構,就是把專案 build 出來之後放到,nginx 上,然後在設定上,特別聽一個 port ,讓 client request 到 server 的時候,可以 render 出你要的畫面。

raw-image


下列為一個簡單的 nginx 設定範例:

# 設定 server port 
upstream be_server {
server 127.0.0.1:9990;
}
# listen port
location / {
proxy_pass http://be_server/;
}


在這樣子的情況, .env 的 file 是放在 server 上,所以 client 要拿到,是沒有辦法的,如果說在專案中,把 env 放到 nuxt.config.js 中去作設定的話,在 build 完的時候,資料會被寫死在 .output/server/chunks/nitro/node-server.mjs 的 檔案中,可以在變數 _inlineRuntimeConfig 上看到你所設定的變數。

不過我們來看一下面提到的一種 build & deploy 的情況。

delopoy 多台機器

參考下面部署的示意圖,今天有三台機要部署放著同一個專案,如果讓每台都執行 run build 的 script ,那每台機器就會浪量的資源在 build 上面,但如果可以把 build 的這件事情,放到一台機器上,最後只要把 dist 的檔案放到 server 上就可以 work 了。但是…這也遇到了一個問題。

raw-image


如果說今天同樣的專案,但是它是只需要吃不同的 .env ,這樣子難道就真的一定要 build 到三次嗎?

所以如果可以在 run start 專案的時候,可以拿到最即時的 .env 就是一件很重要的事情。可以為你多爭取到一杯咖啡的時間。

Nuxt3 實作

其實這個解法很簡單,只要專案在 start 後,可以從 api 中或是 file 中,拿到最新的 env 的資料,而不是透過 runconfig 所設定的資料,這樣子靈活性也會變高需多。

所以我們實作的羅輯是在前端的專案中寫一個可以 get env 的 api ,在專案 init 的時候就向它發出 request 取得資料,放到 nuxt 中獨有的 useState 中,讓 client 能直接取得 env,如果 env 更新的情況下,也只需要 restart 就可以拿新的 env 資料。

raw-image


這邊我選擇在 middleware 的時候來發出 request


// src/middleware/env.global.ts
export default defineNuxtRouteMiddleware(async (to, from) => {
const { data: env } = await useFetch("/api/env");
useState("env", () => env);
});
<script setup lang="ts">
const env = useState('env')
</script>
// src/server/api/env.get.ts
import * as dotenv from "dotenv";
dotenv.config();

export default defineEventHandler(() => {
const env = { NUXT_PORT: process.env.NUXT_PORT };
return env;
});


Summary

寫程式寫的越久,就會發現一個好的網站,一個好的開發流程,是需要額外作需多的事情。實在沒有辦法透過一個人獨立完成。

未來還有多少的東西需要去學習呢?就讓我繼續學下去吧~~ (嘆氣)

留言0
查看全部
avatar-img
發表第一個留言支持創作者!
Thomas Chu 的沙龍 的其他內容
在充斥著各種筆記工具的時代,Notion和Obsidian無疑是其中兩大重要的代表。這兩款工具都提供了強大的筆記功能,但它們在設計理念和使用體驗上卻有著極大的差異。本文將對Notion和Obsidian進行全面的比較,幫助你選擇最適合自己的筆記工具。
5 分鐘用 Nestjs 接上 MySql。要實現這個需求,你需要先安裝 Node.js 和 Nest.js 框架,並確保你已經安裝了 MySQL 數據庫。
在開發 email 的過程,一定會有要寄信的需要,這時候 google script 可以快速的幫忙這段,透過簡單的 code 就可以完成
在充斥著各種筆記工具的時代,Notion和Obsidian無疑是其中兩大重要的代表。這兩款工具都提供了強大的筆記功能,但它們在設計理念和使用體驗上卻有著極大的差異。本文將對Notion和Obsidian進行全面的比較,幫助你選擇最適合自己的筆記工具。
5 分鐘用 Nestjs 接上 MySql。要實現這個需求,你需要先安裝 Node.js 和 Nest.js 框架,並確保你已經安裝了 MySQL 數據庫。
在開發 email 的過程,一定會有要寄信的需要,這時候 google script 可以快速的幫忙這段,透過簡單的 code 就可以完成
你可能也想看
Google News 追蹤
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
哈囉,大家好!本次介紹如何在 Nuxt 應用中使用 Axios 整合 Laravel 後端 API,實現動態資料渲染並搭建身份驗證機制。透過 Axios 配置與 Vuex 狀態管理,建立交易紀錄頁面並添加錯誤處理,提供更友善的使用者體驗。
※ 補充說明: ※ npm 常用指令: ◦ npm init–y:快速初始化一個新的 Node.js 並建立一個 package.json 文件的命令。 ◦ npm info 套件名稱 version:快速查詢指定 npm 套件的最新版本號。 ◦ npm install套件名稱:用來安裝
Thumbnail
Node.js是一個JavaScript運行環境。它使用了一個非阻塞、事件驅動的I/O模型,使其非常適合用於數據密集型的即時應用程序。簡單來說,Node.js允許你使用JavaScript來編寫伺服器端代碼。 nvm 安裝nvm Windows : 點擊 Releases · coreybut
Thumbnail
env 環境變數的設定,通常是為為了 server 而設定的,能快速的切換狀態,但現在的網頁開始,前端的範圍逐漸往後端靠近,所以在設定,也會有 client 的變數會想要在 .env 的情況。此篇就是以 nuxt 為實作,分享此內容 前端架構 最常見的 front 架構,就是把專案 buil
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
哈囉,大家好!本次介紹如何在 Nuxt 應用中使用 Axios 整合 Laravel 後端 API,實現動態資料渲染並搭建身份驗證機制。透過 Axios 配置與 Vuex 狀態管理,建立交易紀錄頁面並添加錯誤處理,提供更友善的使用者體驗。
※ 補充說明: ※ npm 常用指令: ◦ npm init–y:快速初始化一個新的 Node.js 並建立一個 package.json 文件的命令。 ◦ npm info 套件名稱 version:快速查詢指定 npm 套件的最新版本號。 ◦ npm install套件名稱:用來安裝
Thumbnail
Node.js是一個JavaScript運行環境。它使用了一個非阻塞、事件驅動的I/O模型,使其非常適合用於數據密集型的即時應用程序。簡單來說,Node.js允許你使用JavaScript來編寫伺服器端代碼。 nvm 安裝nvm Windows : 點擊 Releases · coreybut
Thumbnail
env 環境變數的設定,通常是為為了 server 而設定的,能快速的切換狀態,但現在的網頁開始,前端的範圍逐漸往後端靠近,所以在設定,也會有 client 的變數會想要在 .env 的情況。此篇就是以 nuxt 為實作,分享此內容 前端架構 最常見的 front 架構,就是把專案 buil