私はwebpackを使い始めてほとんどすべてのビルドセクションを解決しましたが、問題は.envファイルからwebpack configに環境変数を渡して、webpack.DefinePlugin
プラグイン。
現在、環境変数を直接webpackからビルドに渡すことができます。私がwebpackで使用した以下のコードをご覧ください。
new webpack.DefinePlugin({
"API_URL": JSON.stringify("http://my-api.com"),
"SECRET_KEY" : "MYSECRETKEYGOESHERE"
}),
私のpackage.json
ビルドスクリプトは
"scripts": {
"start": "NODE_ENV=development webpack-dev-server --progress --port 8000 --content-base app/build/src"
}
この目的のためにdotenv
パッケージを使用できます
リファレンス: https://www.npmjs.com/package/dotenvhttps://github.com/motdotla/dotenv
Webpack設定ファイルの先頭で、次のようにdotenvを要求します(.envパスを正しく設定します)
_var dotenv = require('dotenv').config({path: __dirname + '/.env'});
_
webpack設定プラグインセクションで使用
_new webpack.DefinePlugin({
"process.env": dotenv.parsed
}),
_
これで、アプリ全体で環境変数を使用できます。アプリのコードでconsole.log(process.env);
を試してください
(部分的にではありますが)あなたのケースと正確には一致しませんが、この式が私にとって最も効果的であることがわかりました。
私は2つのlibsの組み合わせを使用します: 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,
}),
// ...
]
受け入れられた答えからインスピレーションを得ましたが、それは私にとってはうまくいきません。多分dotenvのAPIが変更されました。
次の作品
import dotenv from 'dotenv'
import { DefinePlugin } from 'webpack'
...
plugins: [
new DefinePlugin({
'process.env': JSON.stringify(dotenv.config().parsed)
})
]
...
情報を明確にするためにコメントすることはできませんので、答えをお詫びします。
あなたがすることができます:
var env = require('.env');
その後
new webpack.DefinePlugin({
"API_URL": JSON.stringify("http://my-api.com"),
"SECRET_KEY" : "MYSECRETKEYGOESHERE",
"env_property": env.property
}),
しかし、私はあなたの.envファイルとこの回答でのセットアップ方法について仮定しています
私が見つけた最も簡単な解決策は、この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');
最初に...
angularアプリケーションにシークレットを渡そうとしているようです。
クライアント側(ブラウザ)のJavaScriptには「秘密」などはありません!!!
DefinePlugin
に渡されたものはすべて、最小限の労力で抽出できます。
これで解決しました...
Webpackに Environment Plugin が追加され、環境変数を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から 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')
}