コードハイライトのグラマー未ロード問題を修正し、非推奨エクスポートを削除
highlightCode ヘルパーが prismjs を直接インポートしていたため、グラマー定義が読み込まれない問題を修正しました。あわせて v0.7.0 以前から非推奨だった highlightAll エクスポートが削除されています。
背景
highlightCode ヘルパーはコードブロックの構文ハイライトを担う関数ですが、グラマーが実際に動作しない状態になっていました。原因は、ヘルパーが prismjs を直接インポートしていたことにあります。Prism のグラマー定義(prism-ruby、prism-go など)は src/config/prism.js でまとめてロードされているにもかかわらず、ヘルパーはその設定ファイルを経由せず素の prismjs を参照していたため、グラマーが未定義のまま動作していました。
この問題と同時に、v0.7.0 より前のバージョンとの互換性のために維持されていた highlightAll エクスポートも削除されています。PR の説明では BREAKING CHANGE として明記されており、旧 API への移行猶予期間が終了したと判断されたことがわかります。
技術的な変更
変更の核心は、src/config/prism.js をグラマー定義を持つモジュールとして明示的にエクスポートし、ヘルパーがそこからインポートするよう修正した点です。
src/config/prism.js では、これまで import "prismjs" として副作用のみのインポートをしていましたが、import Prism from "prismjs" に変更し、ファイル末尾に export default Prism を追加しました。これにより、グラマーがすべてロードされた状態の Prism オブジェクトをモジュールとして外部に提供できるようになりました。また、window.Prism ||= {} への書き換えは機能的に同等で、コードの簡潔化です。
変更前:
window.Prism = window.Prism || {}
window.Prism.manual = true
import "prismjs"
// Import base language dependencies first
import "prismjs/components/prism-clike"
// ...
import "prismjs/components/prism-diff"
変更後:
window.Prism ||= {}
window.Prism.manual = true
import Prism from "prismjs"
// Import base language dependencies first
import "prismjs/components/prism-clike"
// ...
import "prismjs/components/prism-diff"
export default Prism
src/helpers/code_highlighting_helper.js 側では、インポート元を "prismjs" から "../config/prism" に変更するだけで修正が完了しています。
変更前:
import Prism from "prismjs"
変更後:
import Prism from "../config/prism"
src/index.js からは以下の3行が削除され、highlightAll の公開が終了しました。
// legacy export for <=v0.7
export { highlightCode as highlightAll } from "./helpers/code_highlighting_helper"
テスト用のダミーアプリ test/dummy/app/javascript/controllers/events_logger_controller.js でも highlightAll から highlightCode への移行が行われており、破壊的変更への対応例として参照できます。
設計判断
グラマーロードの責務を prism.js 設定ファイルに一元化する設計が採用されました。
prismjs を直接インポートする代わりに設定ファイル経由でインポートさせることで、「Prism を使うならグラマーも必ず揃っている」という不変条件をモジュール境界で保証できます。各利用箇所が個別にグラマーのインポートを意識する必要がなくなり、将来グラマーを追加・削除する場合も src/config/prism.js の変更だけで対応できます。
この修正に対応する形で、追加されたユニットテスト test/javascript/unit/helpers/code_highlighting_helper.test.js では、期待されるグラマー(clike、markup、ruby、php、go、bash、json、diff など9種)が Prism.languages に定義されていることを test.each で網羅的に検証しています。グラマーの未ロードという問題の性質上、この種の存在確認テストが有効なリグレッション防止策として機能します。
まとめ
インポート元を "prismjs" から "../config/prism" に切り替えるという最小限の変更で、グラマー未ロードという実害のあるバグが解消されました。同時に旧 API highlightAll を削除したことで、v0.7.0 以前から引き継いできた互換レイヤーが整理され、コードベースがよりシンプルになっています。