Astro でシンタックスハイライター Shiki を使う
はじめに
このブログで使っているシンタックスハイライターを Prism から Shiki へ切り替えたので、Astro で Shiki を使う際の設定方法や移行手順をまとめる。
シンタックスハイライターとは、コードブロック内のコードを言語に応じて適切に色付けし、可読性を高める機能を提供するものである。例えば下記のようなもので、技術ブログやドキュメントなどにおいては、読者がコードを理解しやすくするための重要な要素の一つだ。
Markdown 内でコードを 3 つのバッククォートで囲んだ状態で、かつ言語を指定すると
```py
def greet(name):
print("Hello, " + name)
if __name__ == "__main__":
greet("Alice")
```
このように指定された言語の文法を解析して色付けした状態で表示される。
def greet(name):
print("Hello, " + name)
if __name__ == "__main__":
greet("Alice")
Prism から Shiki へ切り替えた背景
これまで当ブログでは Prism を使用してきたが、いくつかの理由から Shiki への移行を決断した。
Prism の開発停滞
Prism のリポジトリを確認すると、Issue や Pull Request が溜まっていてメンテナンスが活発とは言えない状況だ。
GitHub - PrismJS/prism: Lightweight, robust, elegant syntax highlighting.
Lightweight, robust, elegant syntax highlighting. Contribute to PrismJS/prism development by creating an account on GitHub.
github.com
カスタマイズの限界
以前、ファイル名表示機能を実現するために remark プラグインを自作したことがあるが、unified エコシステムの理解が不十分なまま実装してしまい、後から見返すと不適切な実装になっていた。この経験から、「Markdown 処理の仕組み」を正しく理解した上で、適切なツールを選ぶ必要性を感じた。
Shiki の魅力
一方、Shiki は以下の点で魅力的だった。
- VS Code のシンタックスハイライトエンジンとして使われており、継続的にメンテナンスされている
rehype-pretty-code プラグインが強力で、ファイル名表示や行番号などのハイライト機能を簡単に実現できる
- VS Code と同じ TextMate 文法を使用しているため、構文解析の精度が高い
今回の移行作業の詳細は、以下の 2 つの PR で対応した。
Replace prism to shiki by ega4432 · Pull Request #597 · ega4432/egashira.dev
github.com
Shiki syntax highlight by ega4432 · Pull Request #599 · ega4432/egashira.dev
github.com
その他 Prism と Shiki の比較についてはこちらの記事が参考になるので気になる人は参照してもらいたい。
ZennのシンタックスハイライターをPrism.jsからShikiに移行しました
zenn.dev
Markdown 処理の仕組み
Prism と Shiki の違いを理解するには、Markdown が HTML に変換される仕組みを理解する必要がある。多くの静的サイトジェネレーター(Astro、Next.js、Gatsby など)は unified エコシステムを使用しており、以下のような変換プロセスを経る。
- Markdown → MDAST: remark が Markdown を構文木(MDAST)に変換
- MDAST → HAST: remark-rehype が Markdown の構文木を HTML の構文木(HAST)に変換
- HAST → HTML: rehype が HTML の構文木を実際の HTML 文字列に変換
重要なのは、remark プラグインは MDAST を操作し、rehype プラグインは HAST を操作するという点である。この変換プロセスにおいて、プラグインの実行順序は非常に重要である。順番を間違えると、期待した効果が出なかったり、データが消えてしまったりといったトラブルが発生する。
以前、筆者が remark プラグインを自作した際に、この順序の重要性を理解していなかったため、期待通りに動作しないという問題に直面した。unified エコシステムを正しく理解することで、このようなトラブルを避けることができる。
Astro での Shiki 導入・設定方法
それでは、実際に Astro で Shiki を使うための設定方法を見ていこう。
パッケージのインストール/アンインストール
Shiki 自体は Astro 内に組み込まれているので別途インストール不要だが、カスタマイズに必要なパッケージのインストールを行う。また、これまで使っていて不要になったパッケージをアンインストールする。
$ npm install -D rehype-pretty-code @shikijs/transformers
$ npm uninstall rehype-prism-plus
astro.config.mjs の設定
次に、プロジェクトの設定を変更していく。
astro.config.mjs// 他のパッケージは省略
import { transformerNotationDiff } from "@shikijs/transformers";
import { rehypePrettyCode } from "rehype-pretty-code";
import rehypePrismPlus from "rehype-prism-plus";
import remarkCodeTitles from "./src/lib/utils/remark-plugins/remark-code-titles";
export default defineConfig({
// 他の設定は省略
markdown: {
syntaxHighlight: 'prism'
syntaxHighlight: false, // Astro 組み込みの syntaxHighlight を無効化
remarkPlugins: [
// 他の remark plugin の設定は省略
remarkCodeTitles
]
rehypePlugins: [
// 他の rehype plugin の設定は省略
[
rehypePrismPlus,
{
ignoreMissing: true
}
]
[
rehypePrettyCode,
{
theme: "github-dark-default",
transformers: [transformerNotationDiff()] // Transformer を設定
}
]
]
}
});
設定のポイントの詳細を以下にまとめる。
syntaxHighlight: false
Astro には組み込みの Shiki サポートがあるが、rehype-pretty-code を使う場合は syntaxHighlight: false に設定する必要がある。これは、組み込みの Shiki と rehype-pretty-code が競合するのを防ぐためである。
- rehype プラグインとして設定
rehype-pretty-code は rehype プラグインなので、rehypePlugins 配列に追加する。プラグインの順序は重要で、他の rehype プラグイン(rehype-slug や rehype-autolink-headings など)がある場合は、それらの後に配置することを推奨する。
- テーマの選択
theme オプションで使用するテーマを指定できる。Shiki は非常に多くのテーマを提供しているがシンプルなものが好みで、かつ他のサービスなどと比較して奇抜なものだと読者目線で見慣れないだろうと思い github-dark-default を選択した。デフォルトは github-dark-dimmed である。1
Shiki
A beautiful yet powerful syntax highlighter
shiki.style
- Transformer の設定
transformers オプションで、Shiki の変換機能を拡張できる。例えば transformerNotationDiff() を使うことで、コードブロック内で追加・削除行を表現できるようになる。
```js
console.log('removed'); // [!code --]
console.log('added'); // [!code ++]
```
console.log("removed");
console.log("added");
他にも、以下のような Transformer が用意されているが、一旦必要になったら追加しようと思う。
CSS の適用
Shiki は HTML への変換までを、すなわち class の付与までが行われる。そのため、別途 CSS は用意しないといけない。src/styles/code-block.css 内に、 Shiki で生成される DOM 及び class 名に対してのスタイリングを定義した。
まとめ
このブログでは、Prism から Shiki へシンタックスハイライターを移行した。Prism の開発停滞や、カスタマイズの限界を感じたことが移行の理由である。
Shiki は VSCode と同じ TextMate 文法を使用し、構文解析の精度が高い。ビルド時に処理が完了するため、クライアントサイドでの JavaScript が不要になり、初期表示が高速になる。rehype-pretty-code を使うことで、ファイル名表示や行番号、Diff 表示などの機能を簡単に実装でき、より実用的なコードブロックを作成できるようになった。
参考
シンタックスハイライト
Astroでコードブロックにハイライトを適用する方法を学びます。
docs.astro.build
Astro フロントエンド開発の教科書
(概要)
※この商品はリフロー型epubで作成されております。デバイスに合わせて文字の大きさやレイアウトが変更可能です。また,電子書籍内で検索をかけたり,マーカーを引いたり,自動読み上げを行うことも可能です。
本書は、近年モバイルファーストやSEOの観点から再び注目されている「静的サイトジェネレータ」(SSG)による静的サイトの制作に適したフレームワーク「Astro」の解説書です。これまでのJavaScriptフロントエンドフレームワークは、動的サイトの生成(CSR/SSR)を主目的としていましたが、Astroはビルド時にJavaScriptを最大限除去することで、シンプルで高速な静的Webサイトの生成を可能にしています。また、ReactやVueなどのフレームワークと連携することで、静的Webサイトのビルドツールとしても利用できます。本書では、Astroの基本からコンポーネントベースのWebサイト制作の進め方、SSGモードによる静的サイト制作/SSRモードによる動的サイト制作、エンドポイント/アクション/ミドルウェアなどのサーバサイド機能まで、Astroの機能を網羅して解説します。
(こんな方におすすめ)
・Astroを使った「静的サイトジェネレータ」(SSG)による静的サイトの制作を学びたい人
(目次)
●第1章 Astroを初体験
1.1 Astroとは
1.2 Astroの環境構築
1.3 Astroプロジェクトの作成と実行
1.4 本書で必要なTypeScript文法
●第2章 Astroコーディングの基本
2.1 Astroのコンポーネントと基本構文
2.2 Astroコンポーネントでの変数の表示
2.3 Astroコンポーネントでの制御構文
●第3章 コンポーネント間連携
3.1 コンポーネントの埋め込み
3.2 コンポーネントのProps
3.3 子コンポーネントをカスタマイズするSlot
●第4章 ルーティングとレイアウト
4.1 ルーティングとルートパラメータ
4.2 レイアウト機能
4.3 ページネーション
●第5章 コンポーネントベースのWebサイト制作
5.1 コンポーネントベースのWebサイト制作ケーススタディの概要
5.2 BaseLayoutの作成
5.3 TOPページの作成
5.4 ニュースページとマークダウンファイル
5.5 デプロイの準備
●第6章 動的サイトとSSR
6.1 ケーススタディの概要と準備
6.2 天気情報コンポーネントの追加とSSGの問題点
6.3 Astroで動的処理を実現する方法
6.4 Astroのアイランド
6.5 SSRデプロイ
●第7章 Astroでのコンテンツの扱い
7.1 コンテンツコレクション
7.2 動的ルートとSSRの組合せ
7.3 Storyblokによるコンテンツ管理
●第8章 Astroのその他の機能
8.1 バックサイドに関する機能
8.2 フロントサイドに関する機能
続きを読む
amazon.co.jp
[改訂新版]プロになるためのWeb技術入門
こちらの書籍は 2025/03/19 紙版の3刷に対応するため更新をおこないました。
(概要)
※この商品はリフロー型epubで作成されております。デバイスに合わせて文字の大きさやレイアウトが変更可能です。また,電子書籍内で検索をかけたり,マーカーを引いたり,自動読み上げを行うことも可能です。
なぜWebシステムをうまく作ることができないのか?――本書は2010年に初版が発行されました。Webに携わるエンジニアだけでなく、Webマーケティング担当者にいたるまでWebの仕組みを根本から理解するための技術書として多くの方々に利用されました。それから10数年の月日が流れ、本書の特徴である技術の根本をていねいに解説するスタイルはそのままにアップデートを図りました。最新のWeb技術を取り入れて全面改訂です。さらに技術を学ぶ上でのさまざまな悩みを解消し、エンジニアとして成長していく手がかりをふんだんに盛り込みました。もちろんサンプルアプリケーションプログラムを試しながら理解を深めていく工夫もしています。本書によって本質をとらえるプロの技術力も得てください。
(こんな方におすすめ)
・Webプログラミング初心者。Web業界やそれをなしている技術に興味のある方。
(目次)
■第1章 技術の学び方
1.1 技術の学びはなぜ難しくなったのか
1.2「技術の引き出し」を作ろう
■第2章 Webシステムの全体像
2.1 Webシステムの構造
2.2 Webコンテンツ
2.3 クライアントサイドの構成要素
2.4 サーバサイドの構成要素
2.5 ネットワークとインターネット
2.6 Webシステムの実行環境と開発環境
2.7 Webシステムを実現するための技術
■第3章 WWWの基本要素とその発展
3.1 World Wide Webの始まり
3.2 URIとハイパーリンク
3.3 HTTP
3.4 SGMLから生まれたHTML
3.5 CSSによる視覚情報の分離
3.6 データ構造を記述するXML
3.7 HTML5策定とHTML Living Standardへの統一
■第4章 HTTPクライアントとHTTPサーバ
4.1 Webアプリケーションの根本を学ぼう
4.2 最小のHTTPサーバを実現する
4.3 レンダリングエンジンの働きを確認する
4.4 HTTPクライアントをブラウザに変更する
4.5 動的なコンテンツの生成
4.6 Webアプリケーションへの発展
■第5章 URLとHTTP
5.1 URLの基本構造
5.2 URLの詳細構造
5.3 HTTPの基本
5.4 HTTPリクエストの実践
■第6章 従来型のWebアプリケーション
6.1 GoによるWebアプリケーション
6.2 Goによる簡単なWebサーバの作成
6.3 ToDoアプリケーションで学ぶ基礎
6.4 Webアプリケーションの画面遷移
6.5 Webアプリケーションの状態管理
6.6 セッションとユーザ管理
6.7 ユーザ認証の実装
6.8 Webアプリケーションの複雑性をカバーするフレームワーク
■第7章 SPAへの進化
7.1 SPAへの潮流
7.2 JavaScriptの起源と発展
7.3 Tiny ToDoのUIを改善する
7.4 サーバとの非同期通信
7.5 Tiny ToDoに非同期通信を実装する
7.6 JSONによるデータ交換
7.7 フラグメントによる状態の表現
7.8 SPAの課題とサーバサイドレンダリング
■第8章 Web API
8.1 APIのWeb化
8.2 REST
8.3 リソース指向アーキテクチャ
8.4 Tiny ToDoのWeb API設計
8.5 Tiny ToDoのWeb API化
8.6 Web APIの公開
8.7 再注目されるRPCスタイル
■第9章 サーバプッシュ技術
9.1 サーバプッシュ技術の歴史
9.2 Server-sent eventsによるプッシュ配信
9.3 Server-sent eventsの実践
9.4 WebSocket
9.5 WebSocketの実践
■付録A コンピュータの基礎
A.1 2進数と16進数
A.2 テキストとバイナリ
A.3 文字コード
A.4 Base64エンコーディング
A.5 ハッシュ値
A.6 IPアドレスとドメイン名
A.7 TCP/IP
A.8 標準入力と標準出力
A.9 構造化データの表現
■付録B WSLのインストール
B.1 環境の確認
B.2 WSLのインストールと実験の準備
B.3 WSLの使い方
■付録C Go言語入門
C.1 Goのインストール方法
C.2 はじめてのGoプログラム
C.3 Go学習時の注意点
■付録D 補足資料
D.1 telnetコマンドのインストール方法
D.2 サンプルコードのダウンロードと実行
続きを読む
amazon.co.jp
Webを支える技術 ―― HTTP,URI,HTML,そしてREST WEB+DB PRESS plus
こちらの書籍は 2020/12/09 紙版の14刷に対応するため更新をおこないました。
本電子書籍は2010年4月8日初版発行のものを、後日電子化し、発売したものです。
(概要)
Webは誕生から20年で爆発的な普及を果たし,17億人のユーザと2億台のサーバを抱える巨大システムへと成長しました。Webがここまで成功した秘密は,その設計思想,いわゆるアーキテクチャにあります。Webのアーキテクチャ,そしてHTTP,URI,HTMLといったWebを支える技術は,Webがどんなに巨大化しても対応できるように設計されていたのです。
私たちが作る個々のWebサービスも,Webのアーキテクチャにのっとることで成功へとつながります。Webのアーキテクチャに正しく適応したWebサービスは,情報が整理され,ユーザの使い勝手が向上し,ほかのサービスと連携しやすくなり,将来的な拡張性が確保されるからです。
本書のテーマは,Webサービスの実践的な設計です。まずHTTPやURI,HTMLなどの仕様を歴史や設計思想を織り交ぜて解説します。そしてWebサービスにおける設計課題,たとえば望ましいURI,HTTPメソッドの使い分け,クライアントとサーバの役割分担,設計プロセスなどについて,現時点のベストプラクティスを紹介します。
(こんな方にオススメ)
・Webサービス(Webアプリケーション/Web API)の設計・開発に携わる方
・Webのしくみや動作原理を知りたい方
(目次)
第1部 Web概論
第1章 Webとは何か
第2章 Webの歴史
第3章 REST ── Webのアーキテクチャスタイル
第2部 URI
第4章 URIの仕様
第5章 URIの設計
第3部 HTTP
第6章 HTTPの基本
第7章 HTTPメソッド
第8章 ステータスコード
第9章 HTTPヘッダ
第4部 ハイパーメディアフォーマット
第10章 HTML
第11章 microformats
第12章 Atom
第13章 Atom Publishing Protocol
第14章 JSON
第5部 Webサービスの設計
第15章 読み取り専用のWebサービスの設計
第16章 書き込み可能なWebサービスの設計
第17章 リソースの設計
続きを読む
amazon.co.jp