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
查看全部
發表第一個留言支持創作者!
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
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
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
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
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) 網站。