javascript - 有条件地在 Gatsby 中导入组件以获得非常动态的模板

标签 javascript reactjs gatsby

我计划为 Gatsby 构建一个非常动态的单页网站模板。

主题将有许多可用的 block 类型组件(30 个或更多),例如:

  • 超大屏幕
  • JumboTron2
  • JumbotronWithForm
  • map 范围
  • map 广场
  • ...

我打算根据对象数组呈现页面,每个对象都有一个类型(如 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(而不仅仅是呈现“正在加载...”)?

最佳答案

您可以使用插件 gatsby-plugin-loadable-components-ssr 来实现这一点。然而,将有对 bundle 中每个组件的文件路径的引用,但至少实际组件不会被捆绑。

关于javascript - 有条件地在 Gatsby 中导入组件以获得非常动态的模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55379064/

相关文章:

javascript - 以 x 毫秒为间隔倒计时

javascript - Typescript/React 功能组件的 props 功能 - 什么类型?

reactjs - 更新到 Xcode 12 后无法在模拟器上运行 React Native 项目

javascript - 异步函数中的 event.preventDefault

javascript - 当我到达某个 div 时,scrollTop 不起作用

javascript - 路由不读取id

build - 在 Gatsby 中如何排除 gatsby build 上的目录?

reactjs - 转义 "import"和 react/html 以在 MDX 中显示为文本?

css - Gatsby 组件 Props CSS 模块

javascript - 使用 {{expression}} 动态创建 ng-model 不起作用?