vue.js - 如何在生产中将环境变量传递给 nuxt?
问题描述
nuxt.config.js
modules: [
'@nuxtjs/dotenv'
],
服务器/index.js
const express = require('express')
const consola = require('consola')
const { Nuxt, Builder } = require('nuxt')
const app = express()
const host = process.env.HOST || '0.0.0.0'
const port = 8080
app.set('port', port)
// Import and Set Nuxt.js options
let config = require('../nuxt.config.js')
config.dev = !(process.env.NODE_ENV === 'production')
const Storage = require('@google-cloud/storage')
const dotenv = require('dotenv')
async function getEnv() {
if (config.dev) {
dotenv.config({ path: '.env' })
console.log('Environment local .env file loaded.')
console.log(process.env.LOCALE)
return
}
try {
const bucketName = 'env-var'
const dotEnvSourcePath = `.env`
const dotEnvDestinationPath = `/tmp/${dotEnvSourcePath}`
const storage = new Storage({})
await storage
.bucket(bucketName)
.file(dotEnvSourcePath)
.download({ destination: dotEnvDestinationPath })
console.log(
`gs://${bucketName}/${dotEnvSourcePath} downloaded to ${dotEnvDestinationPath}.`
)
dotenv.config({ path: dotEnvDestinationPath })
} catch (err) {
console.error('ERROR:', err)
}
}
async function afterEnvProcess() {
// Init Nuxt.js
const nuxt = new Nuxt(config)
// Build only in dev mode
if (config.dev) {
const builder = new Builder(nuxt)
await builder.build()
}
// Give nuxt middleware to express
app.use(nuxt.render)
// Listen the server
app.listen(port, host)
consola.ready({
message: `Server listening on http://${host}:${port}`,
badge: true
})
const fs = require('fs')
const dotEnvExists = fs.existsSync('.env')
}
getEnv()
.then(r => afterEnvProcess())
.catch(e => console.log(e))
我得到了在生产中运行应用程序时process.env.<variable>
的值。undefined
在开发中运行时,我得到了正确的值。似乎 env 变量没有被传递给 nuxt env 属性。
编辑 1:当我使用 process.env 控制台记录环境变量时,我可以在谷歌云日志中看到正确的值。但同时这些控制台日志语句在浏览器控制台中显示未定义
解决方案
大多数人都使用dotenv
包,但我不喜欢这个解决方案,因为它增加了为生产和开发管理不同的额外文件的需要,而您可以自动化 webpack 以使用正确的值而无需额外的麻烦。
更简单的方法:
//package.json
"scripts": {
"dev": "NODE_ENV=dev nuxt"
}
//nuxt.config.js
env: {
baseUrl:
process.env.NODE_ENV === 'dev'
? 'http://localhost:3000'
: 'https://my-domain.com'
}
这将允许您通过调用来使用正确的值process.env.baseUrl
。请注意,您可以使用console.log(process.env.baseUrl)
但不能验证这一点console.log(process.env)
,至少在 Chrome 中是这样。
推荐阅读
- azure - Azure Function App 中的文件写入权限
- r - 查找字符串数包含在列中
- mongodb - 具有 Atomic Sink 功能的 Flink
- unity3d - 播放跳跃动画时移动
- mysql - 将 mysql join 转换为 django orm
- ruby-on-rails - Sidekiq 延迟扩展没有为 *一些 * 工作生成电子邮件
- javascript - 如何等待创建/编辑实体模式窗口完成渲染并在 2sxc 模块中执行我的自定义 js 代码?
- python - 所以我想为我的不和谐制作一个机器人,如果我在我的 Instagram 上发布新帖子并运行该机器人,它将获得新帖子的链接并在那里分享
- swift - 将信息从 CKRecord 传递到用户定义的类类型
- android - 在撰写中单击时,DropDownMenu 不显示