EY-Office ブログ

【速報】Astroは遅くなかった! 悪いのは私でした・・・

昨日Astroはブログページ生成が遅いぞ ???というブログを書きましたが、その後コードを見直したところ遅い原因に気が付きました。

そして修正したところ、たった11秒でビルドできるようになりました。❗❗

I think the software called Astro is great DeepAIが生成した画像です

ビルドが遅かった原因

このブログには記事一覧という下の画像のようなページがあります。ここには全ブログの画像、タイトル、本文テキストの一部などが並んでいます、ブログ数は300以上あるとはいえ、このページのビルドに1分近くかかるのは納得がいかないので、コードにたくさんのconsole.log("XXXX", new Date());を入れ処理時間を計測したところ驚愕の事実がわかりました。

以下のblogInfo関数は記事一覧やブログページに表示するブログ記事の情報を戻す関数です。

  • compiledContent()メソッドのでMarkdownで書かれたブログ記事をHTMLに変換された結果を取得しています
  • ② HTMLから最初に現れた画像のURLを取得しています
  • ③ HTMLからHTMLタグを取り除き本文テキストを取り出しています
export const blogInfo = (post: MarkdownInstance<Record<string, any>>) => {
  const p = blogParms(post);
  const html = post.compiledContent();                              // ← ①
  const firstImageMatch = html.match(/<img\s+src="(.*?)"/);         // ← ②
  const summaryRaw = stripHtml(html).result.replace(/[\r\n]/g, ""). // ← ③
    replace(/写真は.*?から/, '');
  const ogImage = firstImageMatch ? firstImageMatch[1] : "/images/logo.png";
  const categories: string[] = post.frontmatter.categories.split(" ");
  const title: string = post.frontmatter.title;

  return {
    date: `${p.y}-${p.m}-${p.d}`,
    titleShort: title.length > 19 ? title.slice(0, 19) + "…" : title,
    category: categories.join(", "),
    path: blogUrl(post),
    summary: (limit:number) => summaryRaw.slice(0, limit) + "…",
    html,
    title,
    ogImage,
    categories
  };
}

問題は、①のcompiledContent()メソッドにありました! この中で行われるMarkdownからHTMLへの変換はかなり重い処理だったのです。

画像URLや本文テキストはMarkdownからも取得できます。そこで以下のように変更しました。

  • rawContent()メソッドのでMarkdownの文字列を取得しています
  • markdown-to-txtのremoveMarkdown関数でMarkdownのタグを取り除き、本文テキストを取り出しています
  • ③ Markdown文字列の中から最初に現れた画像のURLを取得しています
  • ④ 本文テキストから改行、不要文字列を削除しています
export const blogInfo = (post: MarkdownInstance<Record<string, any>>) => {
  const p = blogParms(post);
  const markdown = post.rawContent();                               // ← ①
  const text = removeMarkdown(markdown);                            // ← ②
  const firstImageMatch = markdown.match(/!\[.*?\]\((.*?)[ )]/);    // ← ③
  const summaryRaw = text.replace(/[\r\n]/g, "").                   // ← ④
    replace(/写真は.*?から/, '');
  const ogImage = firstImageMatch ? firstImageMatch[1] : "/images/logo.png";
  const categories: string[] = post.frontmatter.categories.split(" ");
  const title: string = post.frontmatter.title;

  return {
    date: `${p.y}-${p.m}-${p.d}`,
    titleShort: title.length > 19 ? title.slice(0, 19) + "…" : title,
    category: categories.join(", "),
    path: blogUrl(post),
    summary: (limit:number) => summaryRaw.slice(0, limit) + "…",
    title,
    ogImage,
    categories
  };
}

以上の変更で、ビルド時間が3分6秒から11秒に短縮しされました。
なんと17倍の高速化 ❗❗

- about -

EY-Office代表取締役
・プログラマー
吉田裕美の
開発者向けブログ