我有一个交互式登录页面(单页 - 没有反应路由器)。此登录页面需要上传到您只需粘贴 HTML 的 CMS - 这意味着我不需要<html> <head> <body>
标签,并且 JavaScript 文件是单独上传的。目前我可以粘贴<div id="react-root"></div>
到 CMS 并上传我捆绑的 JavaScript 文件,页面就可以工作了。
然而,反馈是这个页面现在需要在所有搜索引擎上都是可抓取的。这意味着我需要基本上呈现由 react 生成的初始 HTML 以粘贴到 CMS 中,并让页面仍然按预期工作。
我试图让我的构建命令将呈现的 HTML 输出到 index.html 文件中,我可以在其中将代码复制并粘贴到 CMS 中。(我的 bundle.js 文件工作正常)。
webpack.common.js
const path = require('path');
const CleanWebpackPlugin = require('clean-webpack-plugin');
module.exports = {
entry: './src/index.js',
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, 'dist')
},
module: {
rules: [
{
test: /\.css$/,
use: [
'style-loader',
'css-loader',
]
},
{
test: /\.(png|svg|jpg|gif)$/,
use: [
'file-loader'
]
},
{
test: /\.(woff|woff2|eot|ttf|otf)$/,
use: [
'file-loader'
]
},
{
test: /\.js$/,
exclude: /node_modules/,
loader: "babel-loader"
},
]
},
plugins: [
new CleanWebpackPlugin(['dist'])
],
};
webpack.prod.js
const webpack = require('webpack');
const merge = require('webpack-merge');
const UglifyJSPlugin = require('uglifyjs-webpack-plugin');
const common = require('./webpack.common.js');
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = merge(common, {
plugins: [
new UglifyJSPlugin(),
new webpack.DefinePlugin({
'process.env.NODE_ENV': JSON.stringify('production')
}),
new HtmlWebpackPlugin({
inject: false,
template: require('./src/template.js'),
})
]
});
模板.js
const React = require('react');
const ReactDOMServer = require('react-dom/server');
const LandingPage = require('./App.js');
const html = ReactDOMServer.renderToString(LandingPage);
module.exports = function () {
return ReactDOM.hydrate(html, document.getElementById('lp-root'));
};
所以我使用 react-dom-server 来渲染ToString。这是最好的方法吗?如果是这样,这种方式不起作用,因为 HtmlWebpackPlugin 无法处理登录页面(导入和导出)中使用的 ES6 语法 - 无论如何?