我一直在寻找一个很好的解决方案,可以在匹配的路由上按需加载异步反应组件,而无需 Webpack 导入、System.import、require.ensure……
我想避免客户端代码中的 Webpack 足迹。
在服务器上,我获取所有路由并将匹配的位置呈现为静态 HTML/JS。就像经典的 SSR。
我的解决方案是:
- 使用 Webpack 将异步组件打包到静态包(c1.js、c2.js、...)
- 将地图存储为 Routes => 异步组件为 json ("/path" => c1.js )
wrap=true
使用ajax上的参数请求 React-Rroute(RR4) 匹配路径- 如果路由存在,并且参数在服务器上
wrap=true
渲染c1.js以从数据库中获取数据(通用 ajax) - 将数据和原始c1.js 包装为脚本响应
- 将响应作为脚本子附加到正文或父 React 组件 Dom
- 脚本解包数据和代码,存储它们(例如 Redux)并将异步组件(c1.js)附加/渲染到 React Dom
这样我就有一个小的入口文件,并且可以:
- 按需请求路由
https://host
和加载组件(/path) - 在入口处请求路由
https://host/path
并渲染完整的组件(无异步) - 使用 RR4请求路由
https://host/path
并获取和呈现异步组件 - 像2一样重新加载页面。
使用浏览器历史记录(后退)而不请求数据或组件(都存在于 Redux 存储和脚本标签中)
能够使用分页组件(加载更多数据并重用获取的组件)
我对此的想法:
将异步组件直接渲染到 Dom,而不是将它们缓存在脚本标记中,这将在卸载父组件时丢失组件代码(因为 main.bundle.js 中不存在异步组件)
问题:
- 是否有一种经过验证的方法来处理异步组件加载(仅 React 代码且没有Webpack hacky 导入)并能够通用渲染?
将反应代码拆分到独立包上是不好的做法吗?
`<script src=bundle.js /><script>*c1.js* code</script>`
- 附加脚本标记以响应组件 dom 是不好的做法(如
<App/>
或<Home/>
)- HMR 怎么样(可能有副作用)?