【发布时间】:2026-01-16 22:15:01
【问题描述】:
我正计划为 Gatsby 构建一个非常动态的单页网站模板。
主题将有许多块类型组件(30 个或更多)可用,例如:
- Jumbotron
- JumboTron2
- JumbotronWithForm
- 全地图
- 地图广场
- ...
我打算基于一组对象来呈现页面,每个对象都有一个类型(如 Jumbotron)来匹配组件和呈现它所需的数据。
如果我静态导入所有这些组件...
import Jumbotron from './../components/Jumbtron';
...它们都将包含在生成的JS中,这很糟糕,因为我的JS会太大。
如果我使用动态导入...
async componentDidMount(){
if(jumbotronTypeRequired){
this.jumbotron = await import('./../components/Jumbotron');
}
this.setState({ dynamicComponentsLoaded: true });
}
render(){
if(this.state.dynamicComponentsLoaded){
//render all
}
else{return (<div>Loading...</div>)}
}
...我只能在 Promise 中获取组件,这意味着组件将在 ComponentDidMount 之后完全渲染,这对 SEO 不利,因为我生成的 HTML 将不包含完全渲染的数据。
Gatsby 是否有办法只包含呈现动态页面所需的组件,同时保持完全呈现的 HTML(而不仅仅是呈现“正在加载...”)?
【问题讨论】:
-
嗯,我正在挖掘更多内容,也许可以在 createPages 方法 (gatsbyjs.org/docs/node-apis/#createPages) 中进行挖掘。这样可以在页面组件创建之前获取组件。
-
你破解了吗?
-
对于任何 Google 朋友来说,这似乎很快就会出现在 Gatsby github.com/gatsbyjs/gatsby/issues/18689
标签: javascript reactjs gatsby