[英]ReferenceError: React is not defined with Parcel Bundler
[英]Parcel Bundler & React Server Side Rendering
當我使用 React Server Side Rendering 時,我試圖使用 Parcel Bundler 作為我的客戶端文件的捆綁器。
我使用了 Parcel Middleware 並為其分配了客戶端入口點的位置。
當我啟動我的腳本時,它顯示 Parcel 正在捆綁我的文件,但我的 ReactDOM.hydrate 方法從未被調用,而且似乎捆綁器根本不使用該文件。
這是我的 server.js 文件:
import Bundler from 'parcel-bundler';
import express from 'express';
import { renderer } from './Helpers';
const app = express();
const bundler = new Bundler(__dirname + '/index.js');
app.use(express.static('public'));
app.use(bundler.middleware());
app.get('*', (req, res) => {
const context = {};
const content = renderer(req, context);
if (context.url) return res.redirect(301, context.url);
if (context.notFound) res.status(404);
res.send(content);
});
const listeningPort = 5000;
app.listen(listeningPort, () => {
console.log(`Server is now live on port ${listeningPort}.`);
這是我的 index.js 文件:
import React from 'react';
import ReactDOM from 'react-dom';
import { BrowserRouter } from 'react-router-dom';
import { routes as Routes } from './Routes';
const routes = Routes;
if (process.env.NODE_ENV === 'development')
ReactDOM.render(
<BrowserRouter>
{routes}
</BrowserRouter>,
document.querySelector('#root'));
else
ReactDOM.hydrate(
<BrowserRouter>
{routes}
</BrowserRouter>,
document.querySelector('#root'));
這是我的渲染器文件,它基本上渲染了 html 文件:
import React from 'react';
import { renderToString } from 'react-dom/server';
import { StaticRouter } from 'react-router-dom';
import { routes as Routes } from '../Routes';
const routes = Routes;
export default (req, context) => {
const content = renderToString(
<StaticRouter location={req.path} context={context}>
{routes}
</StaticRouter>
);
const lang = "en";
return `
<!DOCTYPE html>
<html lang="${lang}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="apple-mobile-web-app-capable" content="yes">
<link href="./public/plugin/bootstrap/css/bootstrap.min.css" rel="stylesheet" />
<link href="./public/plugin/font-awesome/css/fontawesome-all.min.css" rel="stylesheet" />
<link href="./public/plugin/et-line/style.css" rel="stylesheet" />
<link href="./public/plugin/themify-icons/themify-icons.css" rel="stylesheet" />
<link href="./public/plugin/owl-carousel/css/owl.carousel.min.css" rel="stylesheet" />
<link href="./public/plugin/magnific/magnific-popup.css" rel="stylesheet" />
<link href="./public/css/style.css" rel="stylesheet" />
<link href="./public/css/color/default.css" rel="stylesheet" id="color_theme" />
</head>
<body>
<div id="root">${content}</div>
</body>
</html>
`;
};
應用程序在 StaticRouter 中運行並加載內容,但從不執行 Hydrate。
我終於使用以下示例項目解決了我的問題。
https://github.com/reactivestack/parcel-react-ssr
基本上,解決方案是不使用Bundler Middleware ,而是將客戶端和服務器端分別與 Parcel 捆綁在一起,然后運行項目。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.