在运行时将环境变量传递到 Vue 应用程序

2023-12-02

如何访问 Vue 中的环境变量,这些变量在运行时而不是在构建期间传递给容器?

堆栈如下:

  • Vue CLI 3.0.5
  • Docker
  • 库伯内斯

stackoverflow 和其他地方建议使用 .env 文件传递​​变量(和使用模式)的解决方案,但这是在构建时并被烘焙到 docker 映像中。

我想在运行时将变量传递到 Vue 中,如下所示:

  • 创建 Kubernetes ConfigMap(我是对的)
  • 运行部署 yaml 文件时将 ConfigMap 值传递到 K8s pod env 变量(我明白了)
  • 从上面创建的 env 变量读取,例如。 VUE_APP_MyURL 并在我的 Vue 应用程序中使用该值执行某些操作(我没有做对)

我在 helloworld.vue 中尝试了以下操作:

<template>
<div>{{displayURL}}
  <p>Hello World</p>
</div>
</template>
<script>
export default {  
    data() {
        return {
            displayURL: ""
        }
    },
    mounted() {
        console.log("check 1")
        this.displayURL=process.env.VUE_APP_ENV_MyURL
        console.log(process.env.VUE_APP_ENV_MyURL)
        console.log("check 3")
    }
}
</script>

我在控制台日志中返回“未定义”,并且 helloworld 页面上没有显示任何内容。

我还尝试将值传递到 vue.config 文件并从那里读取它。 console.log 中出现相同的“未定义”结果

<template>
<div>{{displayURL}}
  <p>Hello World</p>
</div>
</template>
<script>
const vueconfig = require('../../vue.config');
export default {  
    data() {
        return {
            displayURL: ""
        }
    },
    mounted() {
        console.log("check 1")
        this.displayURL=vueconfig.VUE_APP_MyURL
        console.log(vueconfig.VUE_APP_MyURL)
        console.log("check 3")
    }
}
</script>

vue.config 看起来像这样:

module.exports = {
    VUE_APP_MyURL: process.env.VUE_APP_ENV_MyURL
}

如果我将一个值硬编码到 vue.config 文件中的 VUE_APP_MyURL 中,它将成功显示在 helloworld 页面上。

当我询问 VUE_APP_ENV_MyURL 时,它已成功填充正确的值:kubectl描述pod

process.env.VUE_APP_MyURL 似乎没有成功检索该值。

对于它的价值...我能够成功使用 process.env.VUE_APP_3rdURL 在运行时将值传递到 Node.js 应用程序。


创建文件config.js与您想要的配置。稍后我们将使用它来创建部署到 Kubernetes 的配置映射。将其放入其他 JavaScript 文件所在的 Vue.js 项目中。尽管我们稍后会将其排除在缩小之外,但将其放在那里很有用,以便 IDE 工具可以使用它。

const config = (() => {
  return {
    "VUE_APP_ENV_MyURL": "...",
  };
})();

现在确保您的脚本被排除在缩小之外。为此,请创建一个包含以下内容的文件 vue.config.js 来保留我们的配置文件。

const path = require("path");
module.exports = {
  publicPath: '/',
  configureWebpack: {
    module: {
      rules: [
        {
          test: /config.*config\.js$/,
          use: [
            {
              loader: 'file-loader',
              options: {
                name: 'config.js'
              },
            }
          ]
        }
      ]
    }
  }
}

在您的index.html 中,添加一个脚本块来手动加载配置文件。请注意,配置文件不会在那里,因为我们刚刚排除了它。稍后,我们将从ConfigMap进入我们的容器。在此示例中,我们假设将其安装到与 HTML 文档相同的目录中。

<script src="<%= BASE_URL %>config.js"></script>

更改您的代码以使用我们的运行时配置:

this.displayURL = config.VUE_APP_ENV_MyURL || process.env.VUE_APP_ENV_MyURL 

在 Kubernetes 中,创建一个使用配置文件内容的配置映射。当然,您想从配置文件中读取内容。

apiVersion: v1
kind: ConfigMap
metadata:
  ...
data:
  config.js: |
    var config = (() => {
      return {
        "VUE_APP_ENV_MyURL": "...",
      };
    })();

在您的部署中引用配置映射。这会将配置映射作为文件安装到容器中。这mountPath已经包含我们缩小的index.html。我们挂载之前引用的配置文件。

apiVersion: apps/v1
kind: Deployment
metadata:
  ...
spec:
  ...
  template:
    ...
    spec:
      volumes:
        - name: config-volume
          configMap:
            name: ...
      containers:
        - ...
          volumeMounts:
                - name: config-volume
                  mountPath: /usr/share/nginx/html/config.js
                  subPath: config.js

现在您可以访问配置文件<Base URL>/config.js您应该会看到放入 ConfigMap 条目中的确切内容。您的 HTML 文档在加载缩小的 Vue.js 代码的其余部分时加载该配置映射。瞧!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在运行时将环境变量传递到 Vue 应用程序 的相关文章

随机推荐

  • static const(非整数)成员初始化语法背后的基本原理?

    我知道如何初始化不是整数的静态成员 但我想知道这种语法背后的基本原理是什么 我希望能够将值放入类中 就像使用整数成员一样 class A static const int i 3 我意识到 如果我更改该值 这可能意味着更多的重建 因为它是标
  • Rails 3 电子邮件中的 CSS 图像

    我正在尝试使用 Rails 3 和 Action Mailer 发送一封电子邮件 电子邮件发送得很好 但我希望它采用 HTML 格式 并带有一些基本样式 其中包括背景图像 我知道图像可能会被阻止 直到用户允许显示它们 但我仍然认为最好链接到
  • 宽松的原子规则有什么(轻微)差异?

    看到赫伯 萨特斯表现出色后talk about 原子武器 我有点困惑轻松原子例子 我随身携带了一个atomic in the C 内存模型 SC DRF 无数据竞争的顺序一致 在加载 读取时执行 获取 据我所知 对于负载 和存储 默认值是s
  • 从 Drupal 网站创建 Iframe

    我有一个 drupal 网站 我想生成一个包含我的 drupal 站点内容的 Iframe 其他站点可以嵌入该内容 我认为如何实现这一目标 Method 1 创建一个独立于 drupal 引擎的 php 脚本 导入配置文件 从而获得对数据库
  • 使用 http.NewRequest POST 数据失败

    我正在尝试使用以下命令将数据从一个 golang 服务传递到另一个 golang 服务http NewRequest 为此 我使用了以下代码 httpClient http Client userserviceUrl http user 7
  • 如何从 BroadcastReceiver 向 Activity 或 Fragment 发送消息

    我有一个接收器 它执行呼叫详细信息保存任务 例如存储来电 去电等 所有这些详细信息都会保存到 sqlite DB 中 如果我的活动没有运行 那就没问题了 有时 当我的活动正在运行时 我会接到一些来电 接收器运行并将数据存储到数据库 UI 不
  • 使用ant删除重复文件?

    有没有办法使用ant删除重复文件 具体来说 如果我在两个不同的输出目录中有相同的文件名 我想从第二个目录中删除它 我想我想出了一个解决方案
  • dplyr r:选择名称位于外部向量中的列[重复]

    这个问题在这里已经有答案了 Purpose 我可以使用选择列dplyr条件是列名位于外部向量中 我发现一些帖子解释了如何使用名称向量对数据框进行子集化 但当向量中的某些名称在数据框中不存在时 我找不到帖子 示例数据集 library tid
  • 如何停止张量流中张量某些条目的梯度

    我正在尝试实现一个嵌入层 将使用预先训练的手套嵌入来初始化嵌入 对于可以在手套中找到的单词 它将被修复 对于那些没有出现在手套中的单词 它会被随机初始化 并且是可训练的 我如何在张量流中做到这一点 我知道整个张量有一个 tf stop gr
  • 带有表达式不需要的结果的 C 宏

    我正在运行以下程序并得到结果为 9 7 我理解为什么输出是 9 但我不明白为什么我得到 7 作为输出 include
  • 从登录参数创建用户对象

    我试图在用户登录后创建一个包含所有用户字段的用户对象 以便我可以从用户的类中检索任何给定的属性 这是用户类 public class User private String username private String password
  • 运行时错误“9”下标超出条件格式代码范围

    我对 VBA 以及一般的任何类型的编程 非常陌生 所以我不确定如何继续 我猜我的错误与条件格式的重叠范围有关 因为当代码以不同的方式设置时 我也会遇到错误 一旦范围不再重叠 这些错误就会得到解决 这里的情况可能并非如此 但我认为了解一下会有
  • 自签名证书可以保护多个 CN / FQDN 吗?

    这是一个有点愚蠢的设置 但这就是我现在正在查看的内容 我正在学习 Kubernetes 我想将自定义代码推送到我的 Kubernetes 集群 这意味着该代码必须作为 Docker 映像提供 可从someDocker 存储库 默认为 Doc
  • 重复调用 Ng-Options 表达式

    我的设备有多个问题
  • 配置 Eclipse 以与 MSYS2 一起使用

    我使用 Eclipse Mars 和 MSYS2 Eclipse 无法识别我的 MSYS2 安装 它包含用于 32 位编译的 Mingw w64 我在互联网上找到的东西不起作用 我应该怎么办 好吧 聚会有点晚了 但看起来还有没什么特别的关于
  • ASP.NET-发送电子邮件

    我正在做一个航班预订系统 我想向用户发送一封电子邮件 其中包含他的旅行的电子机票 电子机票是使用从数据库中获取的预订 ID 以及前面页面中的其他详细信息 例如乘客姓名等 动态生成的 那么我怎样才能将动态生成的电子客票发送到他的电子邮件 ID
  • 与视频同步播放多个音轨之一

    我正在尝试在网络浏览器中播放视频 原始视频带有两个或多个音频流 每个音频流都采用不同的语言 我想让用户可以选择切换他们正在收听的音轨 我尝试使用audioTracks在视频元素上 但尽管说它在大多数浏览器中都支持在标志后面 至少在 Fire
  • req.body 是未定义的意思是应用程序

    我的应用程序有问题 告诉您问题所在的简单方法让我向您展示我的代码 var Meetup require models meetup module exports create function req res var meetup new
  • Mongodb和排序子数组

    不确定这是否可以做到 所以我想问一下 我有以下 mongodb s store abc offers spend 100 00 cashback 10 00 percentage 0 10 spend 50 00 cashback 5 00
  • 在运行时将环境变量传递到 Vue 应用程序

    如何访问 Vue 中的环境变量 这些变量在运行时而不是在构建期间传递给容器 堆栈如下 Vue CLI 3 0 5 Docker 库伯内斯 stackoverflow 和其他地方建议使用 env 文件传递 变量 和使用模式 的解决方案 但这是