Приложение Prerender React как статический HTML
У меня есть интерактивная целевая страница (одна страница - не реагирует маршрутизатор). Эту целевую страницу нужно будет загрузить в CMS, где вы просто вставляете HTML -код, то есть мне не нужно <html> <head> <body>
теги и файл JavaScript загружаются отдельно. В настоящее время я могу просто вставить <div id="react-root"></div>
в CMS и загрузить мой пакетный файл JavaScript, и страница работает.
Тем не менее, обратная связь заключается в том, что теперь эту страницу необходимо сканировать во всех поисковых системах. Это означает, что мне нужно в основном визуализировать исходный 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'),
})
]
});
template.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'));
};
Поэтому я использовал response-dom-server для рендеринга ToString. Это лучший способ сделать это? Если это так, этот способ не работает, так как HtmlWebpackPlugin не может обработать синтаксис ES6, используемый на целевых страницах (импорт и экспорт) - в любом случае?
1 ответ
Подход кажется правильным.
Тем не менее, вам может понадобиться Babel Transpiler для преобразования вашего кода из синтаксиса ES6.
Попробуйте добавить новое правило в конфигурацию веб-пакета для файлов js/jsx.
Что-то вроде этого:
{
test: /js$/,
exclude: /(node_modules)/,
loader: "babel-loader",
query: { presets: ["react", "es2016", "es2015"], plugins: ["transform-class-properties"] },
},
Это передаст ваш код должным образом перед использованием.
Надеюсь, поможет. Пожалуйста, вернитесь к любым сомнениям.