ChatGPT解决这个技术问题 Extra ChatGPT

在 Vue.js 中使用环境变量

我一直在阅读官方文档,但在环境变量中找不到任何内容。显然有一些支持环境变量的社区项目,但这对我来说可能有点矫枉过正。所以我想知道在处理已经使用 Vue CLI 创建的项目时,是否有一些简单的开箱即用的东西可以在本地工作。

例如,我可以看到,如果我执行以下操作,打印出正确的环境意味着这已经设置了吗?

mounted() {
  console.log(process.env.ROOT_API)
}

我对 env 变量和 Node.js 有点陌生。

仅供参考,使用 Vue CLI 3.0 beta。

您使用的是哪个 vue-cli 模板?如果是 Webpack,请参阅 vuejs-templates.github.io/webpack/env.html
另外,不清楚你在问什么。你有一个实际的问题吗?
如果您使用的是 Webpack。是 process.env 用于获取环境变量。
我使用 vue create my-appenv 变量创建了我的项目,但没有按照您发布 @Phil 的文档工作
您必须在变量前面加上“VUE_APP_”cli.vuejs.org/guide/mode-and-env.html#example-staging-mode

R
RAH

带有 Webpack 的 Vue.js

如果您将 vue cli 与 Webpack 模板(默认配置)一起使用,您可以创建环境变量并将其添加到 .env 文件中。

这些变量将在您的项目中的 process.env.variableName 下自动访问。加载的变量也可用于所有 vue-cli-service 命令、插件和依赖项。

您有几个选项,这是来自 Environment Variables and Modes documentation

.env                # loaded in all cases
.env.local          # loaded in all cases, ignored by git
.env.[mode]         # only loaded in specified mode
.env.[mode].local   # only loaded in specified mode, ignored by git

您的 .env 文件应如下所示:

VUE_APP_MY_ENV_VARIABLE=value
VUE_APP_ANOTHER_VARIABLE=value

如下评论所述:如果您使用的是 Vue cli 3,则只会加载以 VUE_APP_ 开头的变量。

如果它当前正在运行,请不要忘记重新启动服务。

Vue.js 与 Vite

Vite 在特殊的 import.meta.env 对象上公开以 VITE_ 开头的 env 变量。

您的 .env 应如下所示:

VITE_API_ENDPOINT=value
VITE_API_KEY=value

这些变量可以在 import.meta.env.VITE_API_ENDPOINTimport.meta.env.VITE_API_KEY 下的 Vue.js 组件或 JavaScript 文件中访问。

提示:当您在 .env 文件中更改或添加变量(如果它正在运行)时,请记住重新启动您的开发服务器。

有关详细信息,请参阅 Vite documentation for env variables


谢谢会试一试。是的,根据文档,我的项目是使用本机 Vue CLI 创建的。
需要注意的重要一点:只有以 VUE_APP_ 开头的变量才会使用 webpack.DefinePlugin 静态嵌入到客户端包中。
只有以 VUE_APP_ 开头的变量会被静态嵌入,这意味着如果您想在客户端代码上访问 env-var,那么您必须使用 VUE_APP_ 作为 VUE_APP_ 中键的前缀3} 个文件
如果它当前正在运行,请不要忘记重新启动服务。
需要注意的重要一点:除了 NODE_ENVBASE_URL 之外,我们需要为所有 env 变量添加 VUE_APP_ 前缀。
P
Pedro Silva

如果您使用的是 Vue cli 3,则只会加载以 VUE_APP_ 开头的变量。

在根目录中创建一个 .env 文件,其中包含:

VUE_APP_ENV_VARIABLE=value

而且,如果它正在运行,您需要重新启动服务,以便可以加载新的环境变量。

有了这个,您将能够在您的项目(.js 和 .vue 文件)中使用 process.env.VUE_APP_ENV_VARIABLE。

更新

根据@ali6p,使用 Vue Cli 3,不需要安装 dotenv 依赖项。


不需要在 main.js 中添加任何代码,只需使用 process.env.VUE_APP_ENV_VARIABLE 不是吗?
如果没有,则需要安装 dotenv,然后就这样使用它。
如果项目是使用 Vue CLI 3 创建的,则无需使用 dotenv 获取环境变量。也许您想将此案例添加到您的答案中。
只需要使用process.env.VUE_APP_ENV_VARIABLE?真的吗?
是的。在 CLI 3 之后
a
ali6p

在根文件夹(靠近 package.json)创建两个文件 .env 和 .env.production 将变量添加到带有 VUE_APP_ 前缀的文件中,例如:VUE_APP_WHATEVERYOUWANT 服务使用 .env 和构建使用 .env.production 在你的组件中(vue 或 js) , 使用 process.env.VUE_APP_WHATEVERYOUWANT 调用 value 如果当前正在运行不要忘记重新启动服务 清除浏览器缓存

确保您使用的是 vue-cli 版本 3 或更高版本

有关详细信息:https://cli.vuejs.org/guide/mode-and-env.html


这应该是这个真正令人讨厌的问题的唯一答案。谢谢!指出根文件夹的位置,第 5 点和第 6 点将其与其他答案区分开来。你还需要安装 dotenv:我认为 npm install dotenv。做得好。
总是忘记重启服务器!
当您说“重新启动服务”时,您指的是网络服务器吗?
@Nguaial 我的意思是,重新运行服务脚本 npm run serve... 或取决于您的设置的不同 cmd。
老实说,这是最好的答案。我什至不需要像这里推荐的其他 .env.development,只需使用 .env 作为我的开发配置文件。
b
benscabbia

在项目的根目录中创建环境文件:

.env

.env.someEnvironment1

.env.SomeEnvironment2

然后加载这些配置,您可以通过 mode 指定环境,即

npm run serve --mode development //default mode
npm run serve --mode someEnvironment1

在您的 env 文件中,您只需将配置声明为键值对,但如果您使用的是 vue 3,则必须VUE_APP_ 为前缀:

在您的 .env 中:

VUE_APP_TITLE=This will get overwritten if more specific available

.env.someEnvironment1:

VUE_APP_TITLE=My App (someEnvironment1)

然后,您可以通过以下方式在任何组件中使用它:

我的组件.vue:

<template>
  <div> 
    {{title}}
  </div>
</template>

<script>
export default {
  name: "MyComponent",
  data() {
    return {
      title: process.env.VUE_APP_TITLE
    };
  }
};
</script>

现在,如果您在没有 mode 的情况下运行应用程序,它将显示“This will get...”,但如果您将 someEnvironment1 指定为 mode,那么您将从那里获得标题。

您可以通过将 .local 附加到您的文件中来创建从 git 中“隐藏”的配置:.env.someEnvironment1.local - 当您有秘密时非常有用。

阅读 the docs 了解更多信息。


这是唯一对我有用的答案。我们使用完整的变量名 ...` 标题:process.env.VUE_APP_API_URL `
同样,这是我可以让它工作的唯一方法。添加文件后,在我的项目目录的根目录中运行 npm run serve ,我就能够引用环境变量。
这很棒,要记住的一件事是“构建”模式与 webpack NODE_ENV 模式不同,因此您可以使用它来设置像 staging 这样的模式,甚至是不同的“版本”或“部署”您的应用程序 medium.com/rangle-io/…
A
Aaron McKeehan

我遇到的一个问题是我正在使用 VueJS 的 webpack-simple 安装,它似乎不包含环境变量配置文件夹。所以我无法编辑 env.test、development 和 production.js 配置文件。创建它们也无济于事。

其他答案对我来说不够详细,所以我只是“摆弄”了 webpack.config.js。以下工作得很好。

所以要让环境变量工作,webpack.config.js 的底部应该有以下内容:

if (process.env.NODE_ENV === 'production') {
  module.exports.devtool = '#source-map'
  // http://vue-loader.vuejs.org/en/workflow/production.html
  module.exports.plugins = (module.exports.plugins || []).concat([
    new webpack.DefinePlugin({
      'process.env': {
        NODE_ENV: '"production"'
      }
    }),
    new webpack.optimize.UglifyJsPlugin({
      sourceMap: true,
      compress: {
        warnings: false
      }
    }),
    new webpack.LoaderOptionsPlugin({
      minimize: true
    })
  ])
}

基于上述,在生产中,您将能够获得 NODE_ENV 变量

mounted() {
  console.log(process.env.NODE_ENV)
}

现在可能有更好的方法来做到这一点,但如果你想在开发中使用环境变量,你可以这样做:

if (process.env.NODE_ENV === 'development') {

  module.exports.plugins = (module.exports.plugins || []).concat([
    new webpack.DefinePlugin({
      'process.env': {
        NODE_ENV: '"development"'
      }
    })
  ]);

} 

现在,如果您想添加其他变量,那么简单如下:

if (process.env.NODE_ENV === 'development') {

  module.exports.plugins = (module.exports.plugins || []).concat([
    new webpack.DefinePlugin({
      'process.env': {
        NODE_ENV: '"development"',
        ENDPOINT: '"http://localhost:3000"',
        FOO: "'BAR'"
      }
    })
  ]);
}

我还应该注意,出于某种原因,您似乎需要“''”双引号。

因此,在开发中,我现在可以访问这些环境变量:

mounted() {
  console.log(process.env.ENDPOINT)
  console.log(process.env.FOO)
}

这是整个 webpack.config.js 只是为了一些上下文:

var path = require('path')
var webpack = require('webpack')

module.exports = {
  entry: './src/main.js',
  output: {
    path: path.resolve(__dirname, './dist'),
    publicPath: '/dist/',
    filename: 'build.js'
  },
  module: {
    rules: [
      {
        test: /\.css$/,
        use: [
          'vue-style-loader',
          'css-loader'
        ],
      },      {
        test: /\.vue$/,
        loader: 'vue-loader',
        options: {
          loaders: {
          }
          // other vue-loader options go here
        }
      },
      {
        test: /\.js$/,
        loader: 'babel-loader',
        exclude: /node_modules/
      },
      {
        test: /\.(png|jpg|gif|svg)$/,
        loader: 'file-loader',
        options: {
          name: '[name].[ext]?[hash]'
        }
      }
    ]
  },
  resolve: {
    alias: {
      'vue$': 'vue/dist/vue.esm.js'
    },
    extensions: ['*', '.js', '.vue', '.json']
  },
  devServer: {
    historyApiFallback: true,
    noInfo: true,
    overlay: true
  },
  performance: {
    hints: false
  },
  devtool: '#eval-source-map'
}

if (process.env.NODE_ENV === 'production') {
  module.exports.devtool = '#source-map'
  // http://vue-loader.vuejs.org/en/workflow/production.html
  module.exports.plugins = (module.exports.plugins || []).concat([
    new webpack.DefinePlugin({
      'process.env': {
        NODE_ENV: '"production"'
      }
    }),
    new webpack.optimize.UglifyJsPlugin({
      sourceMap: true,
      compress: {
        warnings: false
      }
    }),
    new webpack.LoaderOptionsPlugin({
      minimize: true
    })
  ])
}

if (process.env.NODE_ENV === 'development') {

  module.exports.plugins = (module.exports.plugins || []).concat([
    new webpack.DefinePlugin({
      'process.env': {
        NODE_ENV: '"development"',
        ENDPOINT: '"http://localhost:3000"',
        FOO: "'BAR'"
      }
    })
  ]);

}

我正在为未来的项目使用 Vue CLI 3,但在我使用 webpack-simple 安装构建的应用程序上遇到了同样的问题。我在这里稍微扩展了您的逻辑,并创建了一个“else”条件,其中我只是将 process.env.NODE_ENV 值传递给 DefinePlugin args。
Aaron McKeehan,我按照您的建议对 webpack.config 做了同样的添加。但是,如何使用我在 vue 组件中编写的用于开发的变量来开始请求?
@Aaron McKeehan 例如,我添加了 if (process.env.NODE_ENV === 'development') { module.exports.plugins = (module.exports.plugins || []).concat([ new webpack.DefinePlugin({ 'process.env': { NODE_ENV: '"development"', DEBUG_MODE: true, ROOT_API: '"http://localhost:8080/"' } }) ]); } 并且在 Setting.vue 中我想在我的发布请求中添加这个 ROOT_API 变量:axios .post(ENVIRONMENT_VARIABLE_HERE??/api/users/me/change-password){...}。请给我建议,我不是 webpack 工作原理的专家
对我来说,关键是在 .envfile.vue 中都以 VUE_APP_ 为前缀
"请注意,由于插件执行直接文本替换,因此赋予它的值必须包括字符串本身内的实际引号。通常,这可以使用备用引号,例如 '"production"',或使用 JSON。字符串化('生产')。” webpack.js.org/plugins/define-plugin/#usage
Y
Yashwardhan Pauranik

这就是我编辑 vue.config.js 的方式,以便可以将 NODE_ENV 暴露给前端(我使用的是 Vue-CLI):

vue.config.js

const webpack = require('webpack');

// options: https://github.com/vuejs/vue-cli/blob/dev/docs/config.md
module.exports = {
    // default baseUrl of '/' won't resolve properly when app js is being served from non-root location
    baseUrl: './',
    outputDir: 'dist',
    configureWebpack: {
        plugins: [
            new webpack.DefinePlugin({
                // allow access to process.env from within the vue app
                'process.env': {
                    NODE_ENV: JSON.stringify(process.env.NODE_ENV)
                }
            })
        ]
    }
};

这是我一直在寻找的东西。在启动时从命令行将值放入变量中是简单易懂的,以后可以在应用程序中使用。没有额外的库和困难。非常感谢!和我一样添加:1. CUSTOM_VAR: JSON.stringify (process.env.CUSTOM_VAR) || "default value" 2. 在运行时设置变量值:set CUSTOM_VAR=value && npm run serve 3. 在应用程序中使用变量:console.log (process.env.CUSTOM_VAR)
f
frlzjosh

在 vue-cli 版本 3 中:

.env 文件有三个选项:您可以使用 .env 或:

.env.test

.env.development

.env.production

您可以通过将前缀正则表达式用作 /^/ 而不是 /node_modules/@vue/cli-service/lib/util/resolveClientEnv.js:prefixRE 中的 /^VUE_APP_/ 来使用自定义 .env 变量

为了在不同模式下(例如测试、开发和生产 .env 文件)开发开源应用程序,当然不建议这样做。因为每次你 npm install .. ,它都会被覆盖。


M
Matt Parkins

除了前面的答案之外,如果您希望访问 sass 中的 VUE_APP_* 环境变量(vue 组件的 sass 部分或 scss 文件),那么您可以将以下内容添加到您的 vue.config.js (如果您没有,您可能需要创建):

let sav = "";
for (let e in process.env) {
    if (/VUE_APP_/i.test(e)) {
        sav += `$${e}: "${process.env[e]}";`;
    }
}

module.exports = {
    css: {
        loaderOptions: {
            sass: {
                data: sav,
            },
        },
    },
}

字符串 sav 似乎被添加到处理之前的每个 sass 文件中,这对于变量来说很好。您还可以在此阶段导入 mixins,以使它们可用于每个 vue 组件的 sass 部分。

然后,您可以在 vue 文件的 sass 部分中使用这些变量:

<style lang="scss">
.MyDiv {
    margin: 1em 0 0 0;
    background-image: url($VUE_APP_CDN+"/MyImg.png");
}
</style>

或在 .scss 文件中:

.MyDiv {
    margin: 1em 0 0 0;
    background-image: url($VUE_APP_CDN+"/MyImg.png");
}

来自https://www.matt-helps.com/post/expose-env-variables-vue-cli-sass/


这适用于 vue 组件中的 scss 文件。但我正在使用 Vuetify 和它的 variables.scss 文件(vuetifyjs.com/en/customization/sass-variables),只是无法正常工作。我得到 SassError:未定义的变量。和想法?
请注意,这一切都取决于您使用的加载程序版本。例如,在 v8 中,您需要使用 prependData 而不是 data
此外,如果您遇到问题,请确保您使用的是 scss 而不是 sass (或者只是将它们都添加)@dari0h
w
willjfield

重要(在 Vue 4 和可能的 Vue 3+ 中!):我设置了 VUE_APP_VAR 但无法通过控制台日志记录过程和打开 env 对象看到它。我可以通过记录或引用 process.env.VUE_APP_VAR 来查看它。我不确定为什么会这样,但请注意您必须直接访问该变量!


有同样的问题 -> 在我的情况下,这是因为我将 .env 文件放在 /src 文件夹中而不是项目根文件夹中!
j
jamesbellnet

对于那些使用 Vue CLI 3 和 webpack-simple 安装的用户,Aaron's answer 确实对我有用,但我并不热衷于将环境变量添加到我的 webpack.config.js,因为我想将它提交到 GitHub。相反,我安装了 dotenv-webpack 插件,这似乎可以很好地从项目根目录的 .env 文件加载环境变量,而无需将 VUE_APP_ 添加到环境变量中。


f
fredrivett

使用不同的 .env 文件运行多个构建🏭

在我的应用程序中,我希望有多个生产版本,一个用于 Web 应用程序,另一个用于浏览器扩展。

根据我的经验,更改 build modes 可能会产生副作用,因为例如构建过程的其他部分可能依赖于 production,因此这是提供自定义 env 文件 (based on @GrayedFox's answer) 的另一种方法:

包.json

{
  "scripts": {
    "build": "vue-cli-service build",
    "build:custom": "VUE_CLI_SERVICE_CONFIG_PATH=$PWD/vue.config.custom.js vue-cli-service build",
  }
}

vue.config.custom.js

// install `dotenv` with `yarn add -D dotenv`
const webpack = require("webpack");
require("dotenv").config({ override: true, path: "./.env.custom" });

module.exports = {
  plugins: [new webpack.EnvironmentPlugin({ ...process.env })],
};

注意 1:VUE_CLI_SERVICE_CONFIG_PATH swaps out the config from the default of vue.config.js,因此其中设置的任何设置都不适用于 custom 构建。

注意 2:这将在 .env.custom 之前加载 .env.production,因此如果您不希望在 custom 构建中设置在 .env.production 中的任何环境变量,您需要将它们设置为.env.custom 中的空白字符串。

注 3:If you don't set override: true then environment variables in .env.production will take precedence over .env.custom

注意 4:如果您希望使用 vue-cli 进行多个不同的构建,the --skip-plugins option is very useful


M
Md Al-Mahmud

我在 vuecli@5 中遇到了同样的问题。试图通过阅读官方文档来解决,但无法得到正确的解决方案。很长一段时间后,我得到了解决方案,它工作正常。

在根目录上创建 .env 文件。 touch .env 在其上设置值,即 APP_NAME=name vue.config.js 文件通过它 process.env.VUE_APP_VERSION = require('./package.json').version 记录到任何方法 console.log(process.env.APP_NAME );