angularjs 如何将.env文件变量传递给webpack config?

3vpjnl9f  于 2023-01-01  发布在  Angular
关注(0)|答案(7)|浏览(266)

我是webpack的新手,几乎完成了所有的构建部分,但现在的问题是我想把环境变量从一个.env文件传递到webpack config,这样我就可以通过webpack.DefinePlugin插件把那些变量传递到我的构建文件中。
目前,我可以将环境变量直接从webpack传递到我的版本。请参阅下面的代码,我在webpack中使用。

new webpack.DefinePlugin({
            "API_URL": JSON.stringify("http://my-api.com"),
            "FRONT_END_API_KEY" : "MYFRONTENDKEYGOESHERE"
        }),

我的package.json构建脚本是

"scripts": {
    "start": "NODE_ENV=development webpack-dev-server --progress --port 8000 --content-base app/build/src"
    }
z9ju0rcb

z9ju0rcb1#

您可以使用dotenv包来实现此目的。

npm install dotenv --save

安装完软件包后,在配置文件的顶部添加以下内容:

const webpack = require('webpack'); // only add this if you don't have yet

// replace accordingly './.env' with the path of your .env file 
require('dotenv').config({ path: './.env' });

然后在plugins部分添加以下内容:

new webpack.DefinePlugin({
  "process.env": JSON.stringify(process.env),
}),
hgc7kmma

hgc7kmma2#

网络包+dotenv

我确实从公认的答案中得到了灵感,但对我来说行不通,可能是dotenv的API变了。
以下是我的工作

import dotenv from 'dotenv'
import { DefinePlugin } from 'webpack'

...

plugins: [
    new DefinePlugin({
      'process.env': JSON.stringify(dotenv.config().parsed)
    })
]

...
w80xi6nr

w80xi6nr3#

它并不完全符合你的情况(虽然部分),但我发现这个公式是最适合我的。
我使用2个库的组合:dotenv读取.env文件以满足webpack.config.js(配置)需求,webpack-dotenv-plugin用于验证(基于.env.example文件),用于将.env文件中的所有变量传递到应用程序代码:
我的webpack.config.js的一部分:

// this is to load env vars for this config
require('dotenv').config({ // it puts the content to the "process.env" var. System vars are taking precedence
    path: '.env.webpack',
});
// and this to pass env vars to the JS application
const DotenvPlugin = require('webpack-dotenv-plugin');

插件部分:

plugins: [
    // ...
    new DotenvPlugin({ // makes vars available to the application js code
        path: '.env.webpack',
        sample: '.env.webpack.example',
        allowEmptyValues: true,
    }),
    // ...
]
jgwigjjp

jgwigjjp4#

我找到的最简单的解决方案是使用这个npm包:dotenv-webpack

创建一个.env文件

// .env
DB_HOST=127.0.0.1
DB_PASS=foobar
S3_API=mysecretkey

将其添加到Webpack配置文件中

// webpack.config.js
const Dotenv = require('dotenv-webpack');

module.exports = {
...
plugins: [
new Dotenv()
]
...
};

在代码中使用

// file1.js
console.log(process.env.DB_HOST);
// '127.0.0.1'
Resulting bundle
// bundle.js
console.log('127.0.0.1');
elcex8rz

elcex8rz5#

我不能发表评论,以澄清任何信息,所以我的答案道歉。
您可以:

var env = require('.env');

那么

new webpack.DefinePlugin({
            "API_URL": JSON.stringify("http://my-api.com"),
            "SECRET_KEY" : "MYSECRETKEYGOESHERE",
            "env_property": env.property
        }),

但我对您的. env文件及其设置方式做了一些假设

e4yzc0pl

e4yzc0pl6#

首先...
看起来您正试图将机密传递到一个有Angular 的应用程序中。

在客户端(浏览器)javascript中没有“秘密”这样的东西!!!

传入DefinePlugin的任何内容都可以轻松提取。
既然我们已经澄清了...
Webpack现在有了Environment Plugin,这使得将env变量传递到GlobalDefine插件变得更加容易。

new webpack.EnvironmentPlugin(['NODE_ENV', 'DEBUG']);

这相当于以下DefinePlugin应用程序:

new webpack.DefinePlugin({
  'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV),
  'process.env.DEBUG': JSON.stringify(process.env.DEBUG)
});

如果您使用dotenv来管理环境变量,则可以使用dotenv webpack plugin
它只包含代码中引用的变量,因此只要不引用机密,它们就不会被包含。

xtfmy6hx

xtfmy6hx7#

来自网络包docs
webpack命令行环境选项--env允许您传入任意数量的环境变量。环境变量将在webpack.config.js中提供访问权限。例如,--env.production或--env.NODE_ENV=local(NODE_ENV通常用于定义环境类型,请参阅此处。)
在您package.json

webpack --env.NODE_ENV=local --env.production --progress

在您webpack.config.js

module.exports = env => {
  // Use env.<YOUR VARIABLE> here:
  console.log('NODE_ENV: ', env.NODE_ENV) // 'local'
  console.log('Production: ', env.production) // true

  return {
    entry: './src/index.js',
    output: {
      filename: 'bundle.js',
      path: path.resolve(__dirname, 'dist')
    }

相关问题