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

更新於 2024/03/06閱讀時間約 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
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
前言 近期用 Nuxt3 開發內嵌於 iOS、Android App 的網頁,並且要支援到 iOS13 版本。 測試時發現 Nuxt3 在 iOS13 功能會無法正常執行,因此順手記錄這個踩坑過程…XD 第一坑 Nuxt3 Announcing Nuxt 3 officially suppo
Thumbnail
你是否會每週五安排時間讀新書或者嘗試新的工具,以提升自己工作或創作的效率呢? 這週我發現,AI的助攻,可能可以讓能讓待辦事項管理更簡單,快速找到事情的秩序,進一步增加專心做事的時間,提高生產力。 不論你是熱衷於探索新科技,或是希望找到更優秀的任務管理工具,這篇文章都能給你寶貴的啟示! 以下是我在每週
Thumbnail
【李婉如/ 報導】《今周刊》與中華汽車合作綠色運輸轉型調查,針對台灣中小企業在迎接淨零時代之下,運輸減碳的策略布局,並於今天(14日)舉辦記者會公布調查結果。本次調查主要發現,超過九成的中小企業已意識到未來將面對運輸碳中和的挑戰,並有五成以上企業認為綠色運輸具有急迫性,尤其是已被客戶要求碳盤查的企業
Nuxt3中可使用useFetch來獲取數據,不須再引用axios,相當方便: 本筆記參考: https://juejin.cn/post/7104071421160063012 https://juejin.cn/post/7086472647575339045
Thumbnail
比如點了商品詳細資料,會導到商品詳細資料頁面並帶上id,或者點了商品分類,將類別id帶過去抓出該類別的商品資料等等。 巢狀路由用法: 同一層page帶動態參數用法: 跳轉頁面可直接使用nuxt-link 若是要用類似v-to的用法來存取v-for的變數,要用:to 本筆記參考: https://it
Thumbnail
安裝Node.js 使用nuxi建立nuxt 3 專案: 3. 進入專案目錄後,安裝相關套件: 4. 啟動nuxt: 跟Nuxt 2用法一樣,新增一個元件放到components資料夾中,可以直接引用: pages用法也一樣,這邊把app.vue改放到pages下,改成index.vue,然後新增一
Thumbnail
1. 安裝node.js 2. 建立專案: 接著會詢問一些初始化設定的東西,按照需求選擇即可: 3. 執行 打開http://localhost:3000/ 即可看到畫面。 pages Nuxt.js會自動配置pages中每一個.vue檔案的route。 假設在pages資料夾下新增一個如下內容的a
Thumbnail
Nuxt.js 是以 Vue 為基底所建構的框架,透過 Nuxt.js,我們能夠更輕鬆地開發靜態頁面 (Static Site)、操作體驗良好的單頁式網站 (SPA)、甚至是顧及 SEO 的伺服器端渲染 (SSR) 網站。
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
前言 近期用 Nuxt3 開發內嵌於 iOS、Android App 的網頁,並且要支援到 iOS13 版本。 測試時發現 Nuxt3 在 iOS13 功能會無法正常執行,因此順手記錄這個踩坑過程…XD 第一坑 Nuxt3 Announcing Nuxt 3 officially suppo
Thumbnail
你是否會每週五安排時間讀新書或者嘗試新的工具,以提升自己工作或創作的效率呢? 這週我發現,AI的助攻,可能可以讓能讓待辦事項管理更簡單,快速找到事情的秩序,進一步增加專心做事的時間,提高生產力。 不論你是熱衷於探索新科技,或是希望找到更優秀的任務管理工具,這篇文章都能給你寶貴的啟示! 以下是我在每週
Thumbnail
【李婉如/ 報導】《今周刊》與中華汽車合作綠色運輸轉型調查,針對台灣中小企業在迎接淨零時代之下,運輸減碳的策略布局,並於今天(14日)舉辦記者會公布調查結果。本次調查主要發現,超過九成的中小企業已意識到未來將面對運輸碳中和的挑戰,並有五成以上企業認為綠色運輸具有急迫性,尤其是已被客戶要求碳盤查的企業
Nuxt3中可使用useFetch來獲取數據,不須再引用axios,相當方便: 本筆記參考: https://juejin.cn/post/7104071421160063012 https://juejin.cn/post/7086472647575339045
Thumbnail
比如點了商品詳細資料,會導到商品詳細資料頁面並帶上id,或者點了商品分類,將類別id帶過去抓出該類別的商品資料等等。 巢狀路由用法: 同一層page帶動態參數用法: 跳轉頁面可直接使用nuxt-link 若是要用類似v-to的用法來存取v-for的變數,要用:to 本筆記參考: https://it
Thumbnail
安裝Node.js 使用nuxi建立nuxt 3 專案: 3. 進入專案目錄後,安裝相關套件: 4. 啟動nuxt: 跟Nuxt 2用法一樣,新增一個元件放到components資料夾中,可以直接引用: pages用法也一樣,這邊把app.vue改放到pages下,改成index.vue,然後新增一
Thumbnail
1. 安裝node.js 2. 建立專案: 接著會詢問一些初始化設定的東西,按照需求選擇即可: 3. 執行 打開http://localhost:3000/ 即可看到畫面。 pages Nuxt.js會自動配置pages中每一個.vue檔案的route。 假設在pages資料夾下新增一個如下內容的a
Thumbnail
Nuxt.js 是以 Vue 為基底所建構的框架,透過 Nuxt.js,我們能夠更輕鬆地開發靜態頁面 (Static Site)、操作體驗良好的單頁式網站 (SPA)、甚至是顧及 SEO 的伺服器端渲染 (SSR) 網站。