在Vue.js中使用环境变量


78

我一直在阅读官方文档,但无法找到有关环境变量的任何信息。显然,有一些社区项目支持环境变量,但这对我来说可能是过大了。所以我想知道在使用Vue CLI创建的项目上是否有一些简单的开箱即用的功能可以正常工作。

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

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

我对环境变量和Node有点陌生。

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


您正在使用哪个vue-cli模板?如果是Webpack,请参见vuejs-templates.github.io/webpack/env.html
Phil

另外,不清楚您要问什么。您有实际问题吗?
菲尔(Phil)

1
如果您使用的是Webpack。yesprocess.env可用于获取环境变量。
朱利安·保罗·达亚格

我使用创建了我的项目,vue create my-app并且env变量未按照您发布的文档工作@Phil
Edgar Quintero

3
您必须在变量前加上'VUE_APP_'cli.vuejs.org/guide/ mode
env.html

Answers:


120

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

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

您有一些选择,这是从“环境变量和模式”文档中获得的

.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

据我了解,您所需要做的就是创建.env文件并添加变量,然后就可以开始了!:)

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

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


谢谢,请尝试一下。是的,根据文档,我的项目是使用本地Vue CLI创建的。
Edgar Quintero18年

vue create my-app
Edgar Quintero18年

25
重要说明:仅以VUE_APP_开头的变量将通过webpack.DefinePlugin静态嵌入到客户端捆绑包中。
Edgar Quintero18年

18
只有以开头的变量VUE_APP_将被静态嵌入 ,这意味着,如果要在客户端代码上访问env-var,则必须将其VUE_APP_用作.env文件中键的前缀
Beerstorm

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

61

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

在根目录中,创建一个.env文件,其内容如下:

VUE_APP_ENV_VARIABLE=value

并且,如果它正在运行,则需要重新启动serve,以便可以加载新的env var。

这样,您就可以在项目(.js和.vue文件)中使用process.env.VUE_APP_ENV_VARIABLE。

更新资料

根据@ ali6p的说法,对于Vue Cli 3,不需要安装dotenv依赖项。


不需要向main.js添加任何代码,只需使用,process.env.VUE_APP_ENV_VARIABLE不是吗?
ali6p

如果没有,则需要安装dotenv,然后像这样使用它。
Pedro Silva

2
如果使用Vue CLI 3创建项目,则无需使用dotenv来获取环境变量。也许您想将此案例添加到您的答案中。
ali6p

只需要使用process.env.VUE_APP_ENV_VARIABLE?真的吗?
Pedro Silva

1
是。CLI 3之后
ali6p

44
  1. 在根文件夹(在package.json附近)中创建两个文件,.env然后.env.production
  2. 将带有前缀的变量添加到theese文件,VUE_APP_例如: VUE_APP_WHATEVERYOUWANT
  3. 服务用途.env建设用途.env.production
  4. 在组件(vue或js)中,用于process.env.VUE_APP_WHATEVERYOUWANT调用值
  5. 如果服务正在运行,请不要忘记重启服务
  6. 清除浏览器缓存

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

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


1
这应该是这个真正令人讨厌的问题的唯一答案。谢谢!指出根文件夹在哪里,将点5和6与其他答案区分开。另外,您需要安装dotenv:我认为npm install dotenv。做得好。
HWJ

1
总是忘记重新启动服务器!
christostsang

20

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

  • .env
  • .env.someEnvironment1
  • .env.SomeEnvironment2

为了然后加载这些CONFIGS,你会指定环境通过mode

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

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

在您的.env中

VUE_APP_TITLE=This will get overwritten if more specific available

.env.someEnvironment1:

VUE_APP_TITLE=My App (someEnvironment1)

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

myComponent.vue:

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

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

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

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

阅读文档以获取更多信息。


这是唯一对我有用的答案。我们全变量名...`标题:process.env.VUE_APP_API_URL`
纳西姆

8

遇到的一个问题是我正在为VueJS使用webpack-simple安装,但似乎没有包含Environment Variable config文件夹。因此,我无法编辑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'"
      }
    })
  ]);
}

我还应该指出,由于某种原因,您似乎需要使用双引号“''。

因此,在Development中,我现在可以访问以下环境变量:

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。
slowFooMovement

Aaron McKeehan,我按照您的建议对webpack.config进行了相同的添加。但是,如何使用在vue组件中编写的用于开发的变量来启动请求?
Nodirabegimxonoyim

@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中,我想在我的发布请求axios .post(ENVIRONMENT_VARIABLE_HERE??/api/users/me/change-password){...}中添加这个ROOT_API变量。请给我建议,我对webpack的工作方式不满意
Nodirabegimxonoyim

对我来说,关键是用前缀VUE_APP_的两个.env,并在file.vue
弗雷德

2

这是我编辑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
这就是我一直在寻找的时间。在启动时从命令行将值放入变量中是简单易懂的,以后可以在应用程序中使用。没有额外的库和困难。非常感谢你!为我添加以下内容: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)
Alex Shink,

1

除了先前的答案,如果您想访问sass中的VUE_APP_ * env变量(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文件之前,这对于变量是很好的。您也可以在此阶段导入mixin,以使它们可用于每个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:未定义的变量。有想法吗?
dari0h

1

在vue-cli版本3中:

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

  • .env.test
  • .env.development
  • .env.production

您可以.env通过使用前缀regex使用自定义变量,/^/而不是/^VUE_APP_/使用/node_modules/@vue/cli-service/lib/util/resolveClientEnv.js:prefixRE

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


0

对于使用Vue CLI 3和webpack-simple安装的用户,Aaron的回答确实对我有用,但是我不希望将环境变量添加到我的环境中,webpack.config.js因为我想将其提交到GitHub。相反,我安装了dotenv-webpack插件,该插件似乎可以从.env项目根目录的文件中很好地加载环境变量,而无需添加VUE_APP_环境变量。


0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.