如何将 .env 文件变量传递给 webpack 配置?
How to pass .env file variables to webpack config?
我是 webpack 的新手,几乎了解了所有构建部分,但现在的问题是我想将环境变量从 .env 文件传递到 webpack 配置,这样我就可以将该变量传递到我的构建中通过 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"
}
我无法发表评论来澄清任何信息,所以我很抱歉回答。
你可以这样做:
var env = require('.env');
然后
new webpack.DefinePlugin({
"API_URL": JSON.stringify("http://my-api.com"),
"SECRET_KEY" : "MYSECRETKEYGOESHERE",
"env_property": env.property
}),
但我正在假设您的 .env 文件及其使用此答案的设置方式
您可以为此目的使用 dotenv 包。
安装包后,将其添加到配置的顶部:
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);
}),
来自 webpack docs:
The webpack command line environment option --env allows you to pass
in as many environment variables as you like. Environment variables
will be made accessible in your webpack.config.js. For example,
--env.production or --env.NODE_ENV=local (NODE_ENV is conventionally used to define the environment type, see here.)
在你的 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')
}
它不完全符合您的情况(虽然部分符合),但我发现这个公式最适合我。
我使用了 2 个库的组合:dotenv to read the .env
file for the webpack.config.js
(configuration) needs, and 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,
}),
// ...
]
我找到的最简单的解决方案是使用这个 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');
webpack + dotenv
我确实从接受的答案中得到了灵感,但它对我不起作用。可能dotenv的API变了
以下适合我
import dotenv from 'dotenv'
import { DefinePlugin } from 'webpack'
...
plugins: [
new DefinePlugin({
'process.env': JSON.stringify(dotenv.config().parsed)
})
]
...
首先……
您似乎正试图将秘密传递到 angular 应用程序。
客户端(浏览器)中没有 "secret" 这样的东西 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。
它只会包含您的代码中引用的变量,因此只要您不引用您的机密,它们就不会包含在内。
我是 webpack 的新手,几乎了解了所有构建部分,但现在的问题是我想将环境变量从 .env 文件传递到 webpack 配置,这样我就可以将该变量传递到我的构建中通过 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"
}
我无法发表评论来澄清任何信息,所以我很抱歉回答。
你可以这样做:
var env = require('.env');
然后
new webpack.DefinePlugin({
"API_URL": JSON.stringify("http://my-api.com"),
"SECRET_KEY" : "MYSECRETKEYGOESHERE",
"env_property": env.property
}),
但我正在假设您的 .env 文件及其使用此答案的设置方式
您可以为此目的使用 dotenv 包。
安装包后,将其添加到配置的顶部:
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);
}),
来自 webpack docs:
The webpack command line environment option --env allows you to pass in as many environment variables as you like. Environment variables will be made accessible in your webpack.config.js. For example, --env.production or --env.NODE_ENV=local (NODE_ENV is conventionally used to define the environment type, see here.)
在你的 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')
}
它不完全符合您的情况(虽然部分符合),但我发现这个公式最适合我。
我使用了 2 个库的组合:dotenv to read the .env
file for the webpack.config.js
(configuration) needs, and 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,
}),
// ...
]
我找到的最简单的解决方案是使用这个 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');
webpack + dotenv
我确实从接受的答案中得到了灵感,但它对我不起作用。可能dotenv的API变了
以下适合我
import dotenv from 'dotenv'
import { DefinePlugin } from 'webpack'
...
plugins: [
new DefinePlugin({
'process.env': JSON.stringify(dotenv.config().parsed)
})
]
...
首先……
您似乎正试图将秘密传递到 angular 应用程序。
客户端(浏览器)中没有 "secret" 这样的东西 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。
它只会包含您的代码中引用的变量,因此只要您不引用您的机密,它们就不会包含在内。