API KEY が必要な script タグを HTML に書く必要があって API KEY を直接書いたファイルを git にコミットしたくないので、gitignore した .env に変数として持たせて HTML に渡す方法のメモ
JavaScript で .env を使う
loadenv を使うと .env ファイルをオブジェクトとして読み込めるようです
.env ファイルを作成して使いたい変数を作る
$ touch .env
.env
API_KEY="API KEY"
.env ファイルをコミットしないように .gitignore に追加
.DS_Store /node_modules .env !.gitkeep
loadenv のインストール
$ yarn add -D node-env-file
webpack での config 内で .env を使う
// webpack.config.js const loadenv = require('node-env-file'); function getENV() { const { API_KEY } = loadenv('./.env'); return { API_KEY, }; }
HTML に変数を渡すために pug を使う
webpack で HTML に変数を埋め込む方法が分からなかったので、JavaScript が使える pug を噛ませて HTML を出力することにしました。
pug で HTML を出力する
必要なパッケージのインストール
$ yarn add -D pug pug-loader html-webpack-plugin
webpack.config.js
const path = require('path'); const HtmlWebpackPlugin = require('html-webpack-plugin'); // 中略 module.exports = (env, argv) => { const htmlTemplate = path.join('./src/index.pug'); return { // 略 module: { rules: [ { test: /\.pug$/, use: { loader: 'pug-loader', }, } ], }, plugins: [ new HtmlWebpackPlugin({ template: htmlTemplate, }) ], }; }
pug に変数を渡す
webpack.config.js
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const loadenv = require('node-env-file');
function getENV() {
const { API_KEY } = loadenv('./.env');
return {
API_KEY,
};
}
module.exports = (env, argv) => {
const htmlTemplate = path.join('./src/index.pug');
const ENV = getENV();
return {
// 略
module: {
rules: [
{
test: /\.pug$/,
use: {
loader: 'pug-loader',
+ options: {
+ self: true,
+ }
},
}
],
},
plugins: [
new HtmlWebpackPlugin({
template: htmlTemplate,
+ data: ENV,
})
],
};
}
pug で 渡された変数を使う
HtmlWebpackPlugin の data で渡される値は pug 内で self.htmlWebpackPlugin.options.data という形で取得できる。
.env ファイルにある API_KEY="API KEY" は次のような形で取得することができる。
- const API_KEY = self.htmlWebpackPlugin.options.data.API_KEY html body script(src=`example.com/api?key=${API_KEY}`)
所感
pug 使わなくても webpack の output.publicPath みたいなオプションで .env から取った変数で変換できそうな気がする。できないものだろうか?
[参考]
塩分…