我尝试了在Scully下运行SSG

本文是DMM集团2020年天窗日历的第20天文章。

总结

因为我自己有一个非常静态的Angular应用程序,所以我尝试引入了用于Angular的SSG工具Scully的故事。

环境

Angular CLI: 11.0.5
Angular: 11.0.5

在文档中指定了使用Angular v9.x.x或v10.x.x,但我选择将其引入到v11的应用程序中。
由于我的应用程序非常小,所以没有特别的问题。

引入

只需在 Angular 项目中添加 Scully 的 Skimatics,基本设置就完成了。

ng add @scullyio/init

scully.log已自动添加,但似乎不需要进行Git管理,因此已将其忽略到.gitignore中(类似问题已存在)。

发展

npx ng build --prod // Angular build
yarn scully // Scully start
yarn scully:serve // Scully serve

当构建Angular项目并运行Scully时,将会在./dist/static生成预渲染文件。

此外,当启动本地环境时,会启动两个服务器,分别托管Angular和Scully的构建结果,以便同时验证预渲染应用和SPA的运行情况。

当部署到生产环境时,需要将 ./dist/static 设置为主机。
由于我的应用程序使用 @angular/fire 进行firebase主机托管,因此我进行了firebase.json的配置更改。

"hosting": [
    {
      "target": "xxx",
      "public": "dist/static",
     ....
    }
]

由于使用 Puppeteer 进行渲染,Scully 不需要担心与浏览器环境无关的事情。
而且,由于提供了示例图纸,我们能够非常轻松地对现有的 SPA 应用进行预渲染!

动态路由

由于我的应用程序非常小,所以我也试着使用常见的动态路由预渲染方法。

假设存在以下动态路由(商品详细页面的示例)

const routes: Routes = [
  { path: 'book/:id', component: BookComponent },
];

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule]
})

如果希望对动态路由进行预渲染,需要在Scully的配置文件中添加设置。如果没有设置,则将被排除在预渲染的范围之外。

使用Scully提供的json插件,并修改了scully..config.ts文件。

Scully 在查看 Angular 的路由配置以检测要预渲染的目标,因此静态文件的数量会随着路由的增加而增加。
JSON 插件会在检查路由时从指定的 API 获取数据,并生成包含路由参数的路由列表。
这样一来,就可以对动态路由的页面进行预渲染了。

export const config: ScullyConfig = {
  ....
  routes: {
    '/book/:id': {
      type: 'json',
      id: {
        url: "https://some-endpoint",
        property: "id",
        resultsHandler: () => [{ id: 1 }, { id: 2 }, { id: 3 }], // テスト用にダミーデータを返した
      }
    }
  }
}

进行了Angular和Scully的构建设置后,再次构建会在./dist/static/book目录下生成了1、2、3三个目录以及各自的静态文件。

此外,Scully的路由文件也已经更新。

[{"route":"/"},{"route":"/book/1"},{"route":"/book/2"},{"route":"/book/3"}]

通过对ScullyRoutesService进行依赖注入,组件可以获取路由信息。

我认为自动将通过API获取的数据作为预渲染的目标是非常方便的,因为动态参数的情况往往有很多不同的模式。

据说还有其他Scully提供的插件,还可以创建自定义插件,可以根据每个应用程序的规格进行各种尝试。

总结

总之,我成功地简单地引入了SSG。
由于Scull软件刚从beta版升级到v1,未来可能还会有更新,所以我希望能继续关注它!

广告
将在 10 秒后关闭
bannerAds