Я использую приведенную ниже функцию для возврата исходной серверной разметки и данных в случае отсутствия поддержки javascript:
export const serverRender = async () => {
const { port, host } = config;
const resp = await
axios.get(`http://${host}:${port}/testData.json`);
const initialData = resp.data;
return {
initialMarkup: ReactDOMServer.renderToString(<App initialData={initialData} />),
initialData,
};
};
Я передаю эти данные в свой шаблон следующим образом (подробности неэто важно):
app.setViewEngine("pug");
app.use(express.static(path.join(__dirname, "../public")));
app.use(express.static(path.join(__dirname, "../assets")));
app.enableCors();
await app.listen(PORT, () => {
console.log(`Nest App listening on port ${PORT}`);
});
В моем шаблоне я использую интерполяцию pug
для чтения initialData
в window
объект в JavaScript (window.initialData = #{initialData}
).Если бы мой клиент был клиентом javascript, я мог бы читать из объекта window
, например, так: window.initialData
, но Typescript этого не допускает.
Мой вопрос заключается в том, как лучше всего пройти предварительную проверку.извлекать данные и передавать их на клиентскую сторону?То есть.поэтому я могу сделать что-то вроде этого при рендеринге клиента:
/* somehow grab pre-fetched data */
ReactDOM.hydrate(<App />, document.getElementById("root")); // entry point for webpack
Я не говорю, что это лучший способ (это еще одна причина, почему я задаю этот вопрос), но в прошломдля небольших чистых проектов javascript я назначил данные window
, как указано выше, а затем при рендеринге моего клиента react
я сделал что-то вроде этого:
const initialData = window.initialData;
ReactDOM.hydrate(<App initialData={initialData} />, document.getElementById("root")); // entry point for webpack
Это неfly in Typescript
N / a
Сообщение об ошибке для случая window
: Property 'initialData' does not exist on type 'Window'
Но я все равно хочу найти какой-то другой способ.