gpt4 book ai didi

reactjs - Webpack 4 和 React loadable 似乎没有为服务器端渲染创建正确的 block

转载 作者:行者123 更新时间:2023-12-03 13:08:49 29 4
gpt4 key购买 nike

我正在尝试创建一个带有延迟加载导入的 ssr react 应用程序。一切正常,除了无法获取所有所需的 block

我还想知道这是否与基于服务器响应的动态组件有关

编辑 - 它实际上渲染了所有必需的 block ,但当客户端接管并再次渲染时它会清除整个内容

由于它重新渲染所有内容,因此速度减慢了很多。

enter image description here

解析器发生在服务器端,当客户端接管时,它会获取更多内容server.js

 const history = createHistory({
initialEntries: [urlPath],
})
// const history = createHistory()
const store = configureStore(history, {
location: {
...
},

})

const context = {}
const htmlRoot = (
<Provider store={store}>
<StaticRouter location={urlPath} context={context}>
<AppRoot />
</StaticRouter>
</Provider>
)

// pre fetching data from api
store
.runSaga(rootSaga)
.done.then(() => {

const RTS = renderToString(htmlRoot) + printDrainHydrateMarks()
const head = Helmet.renderStatic()
console.log(printDrainHydrateMarks())

res.status(code).send(renderDom(RTS, port, host, storeState, head))
}
})
.catch(e => {
console.log(e.message)
res.status(500).send(e.message)
})

renderToString(htmlRoot)
console.log(printDrainHydrateMarks())

store.close()
} else {
res.status(500).send(_err)
}

产品服务器

Loadable.preloadAll().then(() => {
app.listen(PROD_PORT, (error) => {

})
});

客户端

Loadable.preloadReady().then(() => {
hydrate(
<Provider store={store}>
<ConnectedRouter history={history}>
<AppRoot />
</ConnectedRouter>
</Provider>,
domRoot,
)
})

分割 block 设置

    styles: {
name: 'styles',
test: /\.css$/,
chunks: 'all',
enforce: true
},

欢迎任何意见或建议

有人建议尝试使用 window.onload = () => { 但这种方法似乎也很慢。

最佳答案

您应该使用 ReactLoadablePlugin 来获得可加载导入的列表:

new ReactLoadablePlugin({
filename: './build/react-loadable.json',
})

使用“react loadable capture”,您可以找出渲染时需要哪些动态组件,并且可以将它们的包添加到头文件中:

const content = ReactDOMServer.renderToString(
<Loadable.Capture report={moduleName => modules.push(moduleName)}>
<Provider store={configureStore()}>
<StaticRouter location={req.url} context={context}>
<App />
</StaticRouter>

</Provider>
</Loadable.Capture>
);

let bundles = getBundles(stats, modules);
bundles.map((item) => {
//add js to header
})

这可以防止 React loadable 删除内容并重新渲染它。

要将 Webpack 配置为基于动态加载的组件输出正确的 block ,请执行以下操作:

 optimization: {
splitChunks: {
cacheGroups: {
default: false,
vendors: false,
}
}
}

此配置在 Webpack v4 中适用于我。

您可以在此处找到使用 React 可加载服务器端渲染的完整文档:

https://github.com/jamiebuilds/react-loadable

关于reactjs - Webpack 4 和 React loadable 似乎没有为服务器端渲染创建正确的 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52207730/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com