【问题标题】:Getting environment variables at runtime in a compiled VueJS app在已编译的 VueJS 应用程序中在运行时获取环境变量
【发布时间】:2021-03-10 10:12:27
【问题描述】:

我正在开发一个在多个地方使用环境变量的 VueJS 应用程序。它在 GCloud 上运行,nginx 为使用vue-cli-service build 编译的文件提供服务。

在开发时,一切都适用于在 .env.development.env.development.local 文件中设置的环境变量,并在 JS 中使用 process.env.VUE_APP_FOO。我没有使用.env.production,因为其中一些环境变量不应该提交到我们的存储库。

对于我们所有项目的 staging 和 prod 环境,我们使用 GCloud 的配置映射,它允许我们为 pod 提供环境变量。这个项目中的问题是vue-cli-service build 要求环境变量在构建时可用,而我们的设置中并非如此。配置映射仅在运行映像的 pod 中可用。

出于好奇,我检查了编译后的代码,process.env 的所有用法都被一个带有所有 vue 环境变量的对象(基本的 + VUE_APP_* 的)简单地替换了。比如,

console.log(process.env.VUE_APP_FOO);

编译成

console.log(Object({NODE_ENV: "production", BASE_URL: "/", VUE_APP_FOO: "bar"}).VUE_APP_FOO);

除了在我们的例子中,VUE_APP_FOO 从对象中丢失,因为在构建应用程序时它在环境中不可用。

因此,在启动服务器或提供 JS 文件时似乎无法提供环境变量。有没有办法告诉vue-cli-service 不要那样编译环境?还是有其他选择?

目前我发现的唯一一种方法是,当 pod 开始使用 sed 时,直接在编译的 JS 文件中将 env vars 的使用替换为其实际值,但这非常难看,而且很容易损坏。

【问题讨论】:

  • 是的,docker 镜像是使用 Drone 构建的(编译后将 dist 文件复制到镜像中),然后推送到 GCloud。
  • 是的,但是鉴于我们当前的设置,这将要求我们将环境存储在我们不想做的 repo 中。同样正如下面另一条评论中提到的,这会将“env vars”变成“build params”,这也有点破坏了我们的常规设置。更新 env var 应该只需要重新启动 pod,而不是完全重建。
  • "pod 重启如何更新引用 VUE_APP_FOO 的编译资源" => 我们还有其他项目引用 env vars(例如 Python 中的 os.getenv)。更改这些只需要使用更新的配置映射启动一个新容器,无需重建。即使在构建项目时,也可能会出现 URL 或 API 密钥中的拼写错误,如果我们必须进行完全重建而不是简单地重新启动 pod,那就更烦人了。

标签: vue.js environment-variables


【解决方案1】:

您可以采用的一种方法是在本地构建时提供生产值。另一种方法是设置一个持续集成工作流,从存储的任何地方获取环境变量,构建应用程序并推送到生产服务器。我个人使用方法2。 设置一个 github 工作流相对容易,只要你的代码被推送到特定的分支就会运行

【讨论】:

  • 困扰我的是这些变量实际上是环境变量而不是真正的构建参数。更改它们只需要重新启动容器而不是完全重建,这就是我们其他项目的工作方式。这就是我寻找“运行时”选项的原因。
  • 您有一个 Web 应用程序,但没有运行服务器。所有环境变量都需要在构建时捆绑到应用程序中。因此,当其中任何一个发生更改时,都需要进行完整的重建
  • 您不能为 Web 应用程序提供运行时选项,因为运行时环境是用户的浏览器。现在,您不能在其他用户的计算机中设置环境变量,可以吗?
  • “所有环境变量都需要在构建时捆绑到应用程序中......”。他们为什么会?我们有另一个网站和一个 API,在提供 JS 时填充了许多变量。例如在使用const foo = <%= Rails.appilcation.config.bar %> 的rails ERB 模板中,bar 本身是在服务器启动时根据环境变量定义的。
  • 我对rails中的ruby了解不多,但我相信它应该是一个服务端渲染解决方案。使用 Vuejs 之类的 javascript 框架构建应用程序通常包括构建过程来捆绑运行应用程序所需的所有内容,因此它不需要与服务器联系获得任何信息,除了静态构建文件
猜你喜欢
  • 2019-01-20
  • 1970-01-01
  • 2017-06-06
  • 1970-01-01
  • 1970-01-01
  • 2010-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多