![logo](https://private-user-images.githubusercontent.com/147462539/333057917-ceb3c63d-65ca-4613-aeb4-e10b4d96dc85.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjQwNTI4NjYsIm5iZiI6MTcyNDA1MjU2NiwicGF0aCI6Ii8xNDc0NjI1MzkvMzMzMDU3OTE3LWNlYjNjNjNkLTY1Y2EtNDYxMy1hZWI0LWUxMGI0ZDk2ZGM4NS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQwODE5JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MDgxOVQwNzI5MjZaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT01ZDRmNWI3YTM0ZTg1Y2EwZDA2YjEwYzEzZGQ4MDk5MzRiMjI1MmU1OTMyYzNhMTY1NzkxYzdjYmIwNzBiZTZjJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZhY3Rvcl9pZD0wJmtleV9pZD0wJnJlcG9faWQ9MCJ9.hh1-KTbuJaxXS2HxLsm8opS2W_Qj0r92o7AyR3htgIA)
個人的な技術ブログのソースコードです。
Next.jsとTypeScriptにより実装されています。
Next.jsは、Reactベースのフレームワークで、サーバーサイドレンダリング(SSR)や静的サイト生成(SSG)をサポートしています。 これによりパフォーマンスやSEO向上を図ることができます。
また、言語にはよりモダンなTypeScriptを採用しています。これは自身の学習のためです。サイトの性能には影響しません。
SSG(Static Site Generation)により静的な記事ページを生成しています。
SSGはサイトのビルド時にあらかじめHTMLファイルを生成し、これらを静的ファイルとして配信する方法です。これにより高速で安定したページリロードを可能にします。
Markdownパーサーにより、Markdownで書かれた記事をHTMLに変換しています。 Markdownパーサーの実装は以下のように行われています。
export const markdownToHtml = async (markdownContent: string): Promise<string> => {
const result = unified()
.use(remarkParse) // Parse markdown.
.use(remarkGfm) // Support GFM (tables, autolinks, tasklists, strikethrough).
.use(remarkRehype) // Turn it into HTML.
.use(rehypeSlug)
.use(rehypeCodeTitles) // add code block titles
.use(rehypePrism) // syntax hightlighting
.use(rehypeStringify) // Serialize HTML.
.processSync(markdownContent)
.toString();
return result;
};
以下に例を示します。
tocbot を用いて自動追尾目次(上図参照)を実装しています。
上記のMarddownパーサーでは、HTMLに変換した後にHTML解析を行ってPrism.jsによるシンタックスハイライティングを行っています。
Prism.jsだけで対応できない行ハイライトやdiffのデザインは独自に実装しています。
SSR(Server Side Rendering)によりリアルタイムで動的なサイトマップ生成を行います。 サイトマップは https://almond-latte.com/sitemap.xml から取得できます。
ブログ記事のタイトル下にあるタグをクリックすることで同じタグがついた記事を検索できます。