HTML webpack 插件不解析 EJS 变量
HTML webpack plugin not parsing EJS variables
我正在尝试将 .env 文件中的 Google Places API 键加载到我的主索引中。我知道 process.env.GOOGLE_PLACES_API_KEY 正在正确加载,因为我可以控制台记录它并且它会吐出我的密钥。但它不会将变量渲染到 DOM.
我几乎从不使用 EJS,而 Webpack 一直是我推进这个项目的最大绊脚石。似乎有上千种不同的选择来做应该非常简单和直接的事情。我只需要将一个 JS 变量插值到我输出的 HTML.
这是我的 webpack 配置:
// webpack.dev.config.js
const webpack = require('webpack');
const path = require('path');
const SplitByPathPlugin = require('webpack-split-by-path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
entry: [
path.join(__dirname, 'client', 'src', 'main.js'),
'webpack-hot-middleware/client',
'webpack/hot/dev-server',
],
devtool: 'source-map',
target: 'web',
output: {
path: '/',
publicPath: 'http://localhost:3000/',
filename: '[name].js',
},
module: {
loaders: [
{
test: path.join(__dirname, 'client', 'src'),
loaders: [
'react-hot-loader',
'babel-loader?presets[]=react,presets[]=es2015,presets[]=stage-0,plugins[]=transform-decorators-legacy,cacheDirectory=babel_cache',
],
exclude: /node_modules/,
},
{ test: /\.css$/, loader: 'style-loader!css-loader' },
{ test: /\.(png|jpg)$/, loader: 'url-loader?limit=8192' },
],
},
resolve: {
extensions: ['.js', 'map'],
},
plugins: [
new SplitByPathPlugin([
{
name: 'vendor',
path: path.join(__dirname, '..', 'node_modules'),
},
]),
new HtmlWebpackPlugin({
title: 'Better Beehive Project',
template: 'client/index.dev.ejs',
inject: false,
appMountId: 'app',
filename: '../index.html',
placesApiKey: process.env.GOOGLE_PLACES_API_KEY,
}),
new webpack.DefinePlugin({
'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV),
}),
new webpack.HotModuleReplacementPlugin(),
],
};
这是我的 index.ejs
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
<title>Better Beehive Project</title>
<script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?key=<% htmlWebpackPlugin.options.placesApiKey %>&libraries=places"></script>
</head>
<body>
<div id='app'></div>
<script type="text/javascript" src="manifest.js"></script>
<script type="text/javascript" src="main.js"></script>
</body>
</html>
Google 地点的脚本标签呈现如下:
<script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?key=&libraries=places"></script>
我已经尝试了一些东西(显式使用我根本无法工作的 ejs-loader,使用 dotenv-webpack 结果证明是不必要的)。有任何关于前进的指导吗?
您没有使用正确的语法进行插值。
来自EJS - Tags:
<%
'Scriptlet' tag, for control-flow, no output
<%_
'Whitespace Slurping' Scriptlet tag, strips all whitespace before it
<%=
Outputs the value into the template (escaped)
<%-
Outputs the unescaped value into the template
通过使用 <%
你只计算表达式,但它没有输出。您需要改用 <%=
。
<%= htmlWebpackPlugin.options.placesApiKey %>
我正在尝试将 .env 文件中的 Google Places API 键加载到我的主索引中。我知道 process.env.GOOGLE_PLACES_API_KEY 正在正确加载,因为我可以控制台记录它并且它会吐出我的密钥。但它不会将变量渲染到 DOM.
我几乎从不使用 EJS,而 Webpack 一直是我推进这个项目的最大绊脚石。似乎有上千种不同的选择来做应该非常简单和直接的事情。我只需要将一个 JS 变量插值到我输出的 HTML.
这是我的 webpack 配置:
// webpack.dev.config.js
const webpack = require('webpack');
const path = require('path');
const SplitByPathPlugin = require('webpack-split-by-path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
entry: [
path.join(__dirname, 'client', 'src', 'main.js'),
'webpack-hot-middleware/client',
'webpack/hot/dev-server',
],
devtool: 'source-map',
target: 'web',
output: {
path: '/',
publicPath: 'http://localhost:3000/',
filename: '[name].js',
},
module: {
loaders: [
{
test: path.join(__dirname, 'client', 'src'),
loaders: [
'react-hot-loader',
'babel-loader?presets[]=react,presets[]=es2015,presets[]=stage-0,plugins[]=transform-decorators-legacy,cacheDirectory=babel_cache',
],
exclude: /node_modules/,
},
{ test: /\.css$/, loader: 'style-loader!css-loader' },
{ test: /\.(png|jpg)$/, loader: 'url-loader?limit=8192' },
],
},
resolve: {
extensions: ['.js', 'map'],
},
plugins: [
new SplitByPathPlugin([
{
name: 'vendor',
path: path.join(__dirname, '..', 'node_modules'),
},
]),
new HtmlWebpackPlugin({
title: 'Better Beehive Project',
template: 'client/index.dev.ejs',
inject: false,
appMountId: 'app',
filename: '../index.html',
placesApiKey: process.env.GOOGLE_PLACES_API_KEY,
}),
new webpack.DefinePlugin({
'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV),
}),
new webpack.HotModuleReplacementPlugin(),
],
};
这是我的 index.ejs
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
<title>Better Beehive Project</title>
<script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?key=<% htmlWebpackPlugin.options.placesApiKey %>&libraries=places"></script>
</head>
<body>
<div id='app'></div>
<script type="text/javascript" src="manifest.js"></script>
<script type="text/javascript" src="main.js"></script>
</body>
</html>
Google 地点的脚本标签呈现如下:
<script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?key=&libraries=places"></script>
我已经尝试了一些东西(显式使用我根本无法工作的 ejs-loader,使用 dotenv-webpack 结果证明是不必要的)。有任何关于前进的指导吗?
您没有使用正确的语法进行插值。
来自EJS - Tags:
<%
'Scriptlet' tag, for control-flow, no output<%_
'Whitespace Slurping' Scriptlet tag, strips all whitespace before it<%=
Outputs the value into the template (escaped)<%-
Outputs the unescaped value into the template
通过使用 <%
你只计算表达式,但它没有输出。您需要改用 <%=
。
<%= htmlWebpackPlugin.options.placesApiKey %>