👆建議你可以使用影片子母畫面功能或全螢幕播放來獲得最佳的觀賞體驗,👇下方是本篇教學的相關筆記。
開啟專案下 nuxt.config.ts 檔案,添加 Runtime Config
export default defineNuxtConfig({
runtimeConfig: {
apiSecret: '怎麼可以讓你知道呢 :P', // 會被 NUXT_API_SECRET 環境變數覆蓋
public: {
apiBase: '/api' // 會被 NUXT_PUBLIC_API_BASE 環境變數覆蓋
}
}
})
建立 Server API 來使用 Runtime Config,在 server/api 目錄下建立一個檔案 ./server/api/hello.get.js:
const runtimeConfig = useRuntimeConfig()
export default defineEventHandler((event) => {
const { apiSecret } = runtimeConfig
console.log(`接收到了一個 Server API 請求: ${event.path}`)
console.log(`執行時的設定 [apiSecret]: ${apiSecret}`)
return 'ok'
})
在 pages 目錄下建立一個檔案 ./pages/hello.vue:
<template>
<div class="my-24 flex flex-col items-center">
<span class="mt-4 text-2xl text-gray-600">回傳資料:</span>
<p class="mt-4 text-3xl font-semibold text-blue-500">{{ data }}</p>
</div>
</template>
<script setup>
const runtimeConfig = useRuntimeConfig()
const { apiBase } = runtimeConfig.public
console.log('runtimeConfig:', toRaw(runtimeConfig))
console.log(
`嘗試在 ${process.client ? 'Client' : 'Server'} 取得 [apiSecret]: ${runtimeConfig.apiSecret}`
)
const { data } = await useFetch(`${apiBase}/hello`)
</script>
建立 .env 檔案,來覆蓋 Runtime Config
NUXT_API_SECRET=api_secret_nuxt3
NUXT_PUBLIC_API_BASE=http://localhost:3000/api
在專案目錄下建立一個檔案 ./app.config.ts:
export default defineAppConfig({
theme: {
primaryColor: '#00dc82',
darkMode: false
}
})
在 pages 目錄下建立一個檔案 ./pages/config.vue:
<template>
<div class="my-24 flex flex-col items-center">
<p class="mt-4 text-2xl text-gray-600">theme.primaryColor:</p>
<span class="mt-4 text-3xl font-semibold text-blue-500">{{ theme.primaryColor }}</span>
<p class="mt-4 text-2xl text-gray-600">theme.darkMode:</p>
<span class="mt-4 text-3xl font-semibold text-blue-500">{{ theme.darkMode }}</span>
<button
class="mt-6 rounded-sm bg-blue-500 px-4 py-2 text-base font-medium text-white hover:bg-blue-600 focus:outline-none focus:ring-2 focus:ring-blue-400 focus:ring-offset-2"
@click="theme.darkMode = !theme.darkMode"
>
{{ `${theme.darkMode ? '取消' : '啟用'}深色模式` }}
</button>
<div class="mt-8">
<NuxtLink to="/">回首頁</NuxtLink>
</div>
</div>
</template>
<script setup>
const appConfig = useAppConfig()
const { theme } = appConfig
</script>
在 pages 目錄下建立一個檔案 ./pages/index.vue:
<template>
<div class="bg-white py-24">
<div class="flex flex-col items-center">
<h1 class="text-6xl font-semibold text-gray-800">這裡是首頁</h1>
<div class="my-4 flex flex-col space-y-4">
<NuxtLink to="/config">前往 /config</NuxtLink>
</div>
<p class="mt-4 text-2xl text-gray-600">theme.darkMode:</p>
<span class="mt-4 text-3xl font-semibold text-blue-500">{{ theme.darkMode }}</span>
</div>
</div>
</template>
<script setup>
const appConfig = useAppConfig()
const { theme } = appConfig
</script>
修改 app.vue 頁面:
<template>
<div>
<NuxtPage />
</div>
</template>
特性 | Runtime Config | App Config |
---|---|---|
客戶端載入方式 | Hydrated | Bundled |
.env 環境變數 | ✅ 是 | ❌ 否 |
響應式更新 | ✅ 是 | ✅ 是 |
類型支援 | 🚧 部分 | ✅ 是 |
每個請求獨立配置 | ❌ 否 | ✅ 是 |
HMR 熱更新 | ❌ 否 | ✅ 是 |
非原始 JS 類型 | ❌ 否 | ✅ 是 |
感謝大家的閱讀,歡迎大家給予建議與討論,也請各位大大鞭小力一些:)
如果對這個 Nuxt 3 系列感興趣,可以訂閱
接收通知,也歡迎分享給喜歡或正在學習 Nuxt 3 的夥伴。
範例程式碼
參考資料