まくろぐ
更新: / 作成:

Svelte で YAML ファイルをインポートして使う方法

Svelte (SvelteKit) には YAML ファイルを直接インポートして JavaScript オブジェクトして扱う仕組みはありませんが、raw インポートの仕組みを使えば、YAML ファイルを文字列データとしてそのまま読み込むことができます(これは SvelteKit がビルドに使っている Vite の仕組みです)。

YAML ファイルを文字列としてインポートする
import gamesYaml from '$lib/assets/games.yaml?raw'

このようにして読み込んだ YAML テキストを、Node.js の YAML ライブラリなどでパースすれば、YAML ファイルの内容を JavaScript オブジェクトとして扱うことができます。 ビルド時に処理を完結させることができるので、例えば、static-adapter を使った静的ビルド (SSG) が必要な環境でも利用できます。

実装例

YAML ファイルを扱うために js-yaml ライブラリを使うので、次のようにしてインストールしておきます。

js-yaml(およびその型ファイル)のインストール
$ npm install --save-dev js-yaml @types/js-yaml

サンプルの YAML ファイルとして、下記のようなゲームソフト情報を含んだ games.yaml を使います。 この YAML ファイルはビルド時にインポートするので、static ディレクトリではなく src ディレクトリのどこかに配置します(ここでは、lib/assets というディレクトリに配置しています)。

src/lib/assets/games.yaml
- title: シャドウラン
  date: 1996-02-23
  price: 7800
- title: トムキャットアレイ
  date: 1994-12-22
  price: 7800
- title: 真・女神転生
  date: 1994-02-25

次の Svelte コンポーネントでは、ビルド時に YAML ファイルを読み込んで、JavaScript オブジェクトと扱えるようにしていします。 実装には TypeScript を使っていますが、raw インポートした YAML ファイルからは型情報を推測してくれないようなので、自分で Game 型を定義しています。

src/routes/+page.svelte
<script lang="ts">
	import yaml from 'js-yaml';
	import gamesYaml from '$lib/assets/games.yaml?raw';

	/** ゲームソフトの情報 */
	type Game = {
		/** ゲームタイトル */
		title: string;
		/** 発売日 */
		date: string;
		/** 価格 */
		price?: number;
	};

	// "2023-01-31" のような日付文字列が Date 型に変換されるのを防ぐために
	// オプションで JSON_SCHEMA を指定しています
	const games = yaml.load(gamesYaml, { schema: yaml.JSON_SCHEMA }) as Game[];
</script>

<ul>
	{#each games as g}
		<li>{g.title} ({g.date}) {g.price ? `${g.price}` : '価格不明'}</li>
	{/each}
</ul>

次のような感じの内容で出力されれば成功です。

<ul>
  <li>シャドウラン (1996-02-23) 7800円</li>
  <li>トムキャットアレイ (1994-12-22) 7800円</li>
  <li>真・女神転生 (1994-02-25) 価格不明</li>
</ul>

なお、JSON ファイルであれば、raw インポートを使わずに、そのままインポートすることができます。

関連記事

まくろぐ
サイトマップまくへのメッセージ