【发布时间】:2020-10-24 23:18:17
【问题描述】:
我的项目目前的结构如下:
my-project/
client/
src/
dist/
index.html
package.json
tsconfig.json
server/
src/
dist/
package.json
tsconfig.json
common/
src/
dist/
package.json
tsconfig.json
package.json
client 是一个 React 应用程序; server 既服务于客户端的 dist 文件,又作为它的 API;而common 是一个包含client 和server 使用的东西的包。
每个子文件夹都有自己的tsconfig 配置和dist 文件夹。
在我需要实施 SSR 之前,它运行良好。
我首先将app.get('*', loadAppContent); 添加到 Express 实例中。
import React from 'react';
import fs from 'fs';
import path from 'path';
import ReactDOMServer from 'react-dom/server';
import {StaticRouter} from 'react-router-dom';
import {Request, Response} from 'express';
import App from '../../client/src/App';
export function loadAppContent(req: Request, res: Response) {
fs.readFile(path.resolve('../client/dist/index.html'), 'utf8', (err, data) => {
if (err) {
console.error(err);
return res.status(500).send('An error occurred');
}
const markup = ReactDOMServer.renderToString(
<StaticRouter context={{}} location={req.url}>
<App/>
</StaticRouter>
);
return res.send(
data.replace(
'<div id="app"></div>',
`<div id="app">${markup}</div>`
)
);
});
}
现在,当我尝试编译 server 时,它也会尝试编译 client(因为有一个对 App 的导入,它位于 client 内部)。这也意味着server的dist文件夹转自:
dist/
index.ts
server.files.ts
收件人:
dist/
client/
src/App.tsx
client.files.ts
server/
index.ts
server.files.ts
client 使用错误的设置编译(因为它有自己的 tsconfig 文件!)。
可能的方法
以下是一些我能想到但无法奏效的可能解决方案:
-
将所有三个包编译到同一个
dist文件夹: 有可能,但这意味着client将不得不覆盖server的错误编译,而自定义tsconfig问题是没解决。 -
防止
server编译它导入的client代码: 听起来是最好的解决方案,但我无法以这种方式配置./server/tsconfig.json。
如果您有任何想法(或需要任何其他信息),请告诉我。
【问题讨论】:
标签: node.js reactjs typescript express server-side-rendering