Vue App 环境变量可以在开发模式下读取,但不能在生产模式下读取

Posted

技术标签:

【中文标题】Vue App 环境变量可以在开发模式下读取,但不能在生产模式下读取【英文标题】:Vue App environment variables can be read in development mode but not in production mode 【发布时间】:2020-06-07 09:22:11 【问题描述】:

我正在使用 Vue cli 创建一个以 Firebase 作为后端的 Vue 应用程序。

我的应用程序中的一个文件通过引用.env 文件中定义的环境变量来初始化 Firebase 数据库。

.env

FIREBASE_API_KEY=#################################
FIREBASE_AUTH_DOMAIN=#################################
FIREBASE_DB_URL=https://#################################
FIREBASE_PROJECT_ID=#################################
FIREBASE_STORAGE_BUCKET=#################################
FIREBASE_MESSAGING_SENDER_ID=#################################
AUTH_API=https://#################################

.env.development.local.env.production.local 包含相同的数据。

在我的应用程序中,我有一个如下所示的文件:

凭据.js

导出默认值

config: 
apiKey: process.env.VUE_APP_FIREBASE_API_KEY,
authDomain: process.env.VUE_APP_FIREBASE_AUTH_DOMAIN,
storageBucket: process.env.VUE_APP_FIREBASE_STORAGE_BUCKET,
databaseURL: process.env.VUE_APP_FIREBASE_DB_URL,
projectId: process.env.VUE_APP_FIREBASE_PROJECT_ID,
messagingSenderId: process.env.VUE_APP_FIREBASE_MESSAGING_SENDER_ID

当我使用yarn serve 提供此应用程序的开发版本时,数据库已初始化,因此.env 变量显然可以毫无问题地读取。但是,当我使用yarn build 然后在dist 中提供结果文件时,控制台上出现错误:

 @firebase/database: FIREBASE FATAL ERROR: Can't determine Firebase Database URL.  Be sure to include databaseURL option when calling firebase.initializeApp().  

这基本上告诉我在生产模式下没有读取环境变量。

这是我的 package.json:


  "name": "web-app",
  "version": "0.1.0",
  "private": true,
  "scripts": 
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build",
    "lint": "vue-cli-service lint"
  ,
  "dependencies": 
    "@firebase/firestore": "^1.9.3",
    "axios": "^0.19.0",
    "core-js": "^3.3.2",
    "element-ui": "^2.12.0",
    "feather-icons": "^4.24.1",
    "firebase": "^7.2.3",
    "firebase-admin": "^8.9.2",
    "firebase-functions": "^3.3.0",
    "localforage": "^1.7.3",
    "node-ipc": "^9.1.1",
    "vue": "^2.6.10",
    "vue-feather": "^1.0.0",
    "vue-feather-icons": "^5.0.0",
    "vue-router": "^3.1.3",
    "vue2-animate": "^2.1.3",
    "vuedraggable": "^2.23.2",
    "vuefire": "^2.2.0",
    "vuex": "^3.1.1",
    "vuex-persist": "^2.1.1"
  ,
  "devDependencies": 
    "@vue/cli-plugin-babel": "^4.0.0",
    "@vue/cli-service": "^4.0.0",
    "babel-eslint": "^10.0.3",
    "eslint": "^5.16.0",
    "eslint-plugin-vue": "^5.0.0",
    "vue-template-compiler": "^2.6.10"
  ,
  "eslintConfig": 
    "root": true,
    "env": 
      "node": true
    ,
    "extends": [
      "plugin:vue/essential",
      "eslint:recommended"
    ],
    "rules": ,
    "parserOptions": 
      "parser": "babel-eslint"
    
  ,
  "postcss": 
    "plugins": 
      "autoprefixer": 
    
  ,
  "browserslist": [
    "> 1%",
    "last 2 versions"
  ]

谁能告诉我这是什么原因造成的?

【问题讨论】:

我认为您需要在 .env 文件中为变量添加前缀 VUE_APP_。来自 cli.vuejs.org/guide/mode-and-env.html#environment-variables :“请注意,只有以 VUE_APP_ 开头的变量才会使用 webpack.DefinePlugin 静态嵌入到客户端包中” @thibautg 这似乎是一个答案!您应该将其写为答案,而不仅仅是评论。 完成。我希望它会起作用。 【参考方案1】:

您需要在 .env 文件中为变量添加前缀 VUE_APP_

来自https://cli.vuejs.org/guide/mode-and-env.html#environment-variables:

请注意,只有以VUE_APP_ 开头的变量才会以webpack.DefinePlugin 静态嵌入到客户端包中。

【讨论】:

为什么这会是 build 命令的问题,而不是 serve 命令的问题? OP 似乎表明在使用 serve 命令时,环境变量在没有前缀的情况下工作 这可能是因为使用serve,变量保存在内置 Web 服务器的内存中,但不一定保存在用于为构建包提供服务的任何服务器中。如果 var 以 VUE_APP_ 为前缀,它们将在生成的包中硬编码。我是这么理解的,我可能错了。 嗯,确实有道理

以上是关于Vue App 环境变量可以在开发模式下读取,但不能在生产模式下读取的主要内容,如果未能解决你的问题,请参考以下文章

vue cli4.0 配置环境变量

Vue CLI中 模式和环境变量详解

Vue .env文件配置全局变量

vue-cli3.0 环境变量与模式

Vue 环境变量和模式(设置通用baseUrl)

vue项目使用.env文件配置全局环境变量