カテゴリー
最新のStorybook8をSvelte5&Vite5で動作確認してみた
※ 当ページには【広告/PR】を含む場合があります。
2024/11/08
2024/11/13

以前のStorybook&Svelte関連で執筆していた記事において、
そこからおおよそ、4ヶ月が経過し、つい先月の10月に
そして、海外のフォーラム界隈に、
"百聞は一見に如かず"ということで、この組み合わせが動作するのか、サクッと確認してみようと思います。
Storybookプロジェクトのアップグレード
こちらの
この記事の執筆当時はまだSvelte5が正式にリリース前で、メインでSvelte4を使っていました。
ここではSvelte5コンポーネントへの巻き上げの詳細は説明しませんが、以下のMigration Guideをよく観てから必要に応じて修正してください。
個別のStorybookプロジェクトの状況にもよりますが、アップグレードの方向性は以下のようにしました。
+ storybook: v7 --> v8
+ svelte: v4 --> v5
+ vite: v4 --> v5
さて、アップグレード方法にもいくつか方法があり、Storybookがコマンドとして提供している方法でアップグレードしても良いでしょう。
この方法では、
$ npx storybook@latest upgrade
とすることで、Storybook8がインストールされます。
あとは必要に応じて、以下のコマンドを実行すると、古い設定ファイルなどのクリーンアップやちょっとした修正も行ってくれるようです。
$ npx storybook automigrate --config-dir <.storybookのパス>
手動で関連のパッケージを引き上げる場合には、
$ yarn add [-S/-D] <アップグレードしたいパッケージ>@latest
を一つ一つやってもよいですが、
package.json
yarn install
著者の環境で動作確認用にアップグレードした結果は以下のようになります。
$ npx storybook --version
8.4.2
$ npx vite --version
vite/5.4.10 linux-x64 node-v20.16.0
$ yarn list | grep -i svelte@
│ ├─ @storybook/svelte@8.4.2
├─ @storybook/svelte@8.4.2
├─ @sveltejs/vite-plugin-svelte@4.0.0
├─ @tsconfig/svelte@5.0.4
├─ htmlparser2-svelte@4.1.0
├─ svelte@5.1.10
│ └─ htmlparser2-svelte@4.1.0
Viteのビルドエラー
関連パッケージをアップグレードし、おもむろにStorybookサーバーを起動してみましょう。
これで何ごともなく動いてくれたら使う側としてはもう言うことがありません。
で、自分の最初の結果はと言うと...
The CJS build of Vite's Node API is deprecated. See https://vite.dev/guide/troubleshooting.html#vite-cjs-node-api-deprecated for more details.
SB_CORE-SERVER_0007 (MainFileEvaluationError): Storybook couldn't evaluate your .storybook/main.js file.
Error [ERR_PACKAGE_PATH_NOT_EXPORTED]: No "exports" main defined in /node_modules/@sveltejs/vite-plugin-svelte/package.json
at exportsNotFound (node:internal/modules/esm/resolve:304:10)
at packageExportsResolve (node:internal/modules/esm/resolve:594:13)
at resolveExports (node:internal/modules/cjs/loader:592:36)
at Module._findPath (node:internal/modules/cjs/loader:669:31)
at Module._resolveFilename (node:internal/modules/cjs/loader:1131:27)
at Module._load (node:internal/modules/cjs/loader:986:27)
at Module.require (node:internal/modules/cjs/loader:1233:19)
at require (node:internal/modules/helpers:179:18)
at Object.<anonymous> (/.storybook/main.js:2:24)
at Module._compile (node:internal/modules/cjs/loader:1358:14)
WARN Broken build, fix the error above.
WARN You may need to refresh the browser.
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
ということでViteの内部エラーで止まってしまうようになりました。
結局のことろ、Storybookのメイン設定ファイルとなる、
.storybook/main.js
これは、
main.js
main.ts
一例として、
import {StorybookConfig} from '@storybook/svelte-vite';
const config: StorybookConfig = {
stories: [
"../stories/components/**/*.stories.@(js|ts|svelte)",
],
addons: [
"@storybook/addon-links",
"@storybook/addon-essentials",
"@storybook/addon-interactions",
],
core: {
builder: {
name: '@storybook/builder-vite',
options: {
viteConfigPath: './customVite.config.js',
},
},
},
framework: "@storybook/svelte-vite",
docs: {
autodocs: "tag",
},
async viteFinal(config) {
return config;
}
};
export default config;
とします。
ちなみに個人的な設定として、vite設定ファイルは分割していますので、設定の別ファイル
customVite.config.js
import { defineConfig } from 'vite';
import { svelte } from '@sveltejs/vite-plugin-svelte';
import tsconfigPaths from 'vite-tsconfig-paths';
export default defineConfig({
plugins: [
svelte(),
tsconfigPaths()
]
})
こちらはCommonJSのままでも問題ありません。
Storybookサーバーが立ち上がらないときの対処法
Storybook8にアップグレード後に、Devサーバーがそのままブラウザに表示されなくなることがあります。
そんなときには、
$ storybook dev -p [ポート番号]
👇
$ storybook dev -p [ポート番号] --no-open
SvelteのPreprocessを設定する
前回も触れた内容ですが、Storybook8の初期に存在していた
@sveltejs/vite-plugin-svelte
既に、
@sveltejs/vite-plugin-svelte
vite.config.js
今回紹介したやり方だと、
svelte-preprocess
$ yarn add -D svelte-preprocess
インストールできたら、
customVite.config.js
import { defineConfig } from 'vite';
import { svelte } from '@sveltejs/vite-plugin-svelte';
import tsconfigPaths from 'vite-tsconfig-paths';
export default defineConfig({
plugins: [
//👇利用するPreprocessを有効にする
svelte({
preprocess: [sveltePreprocess({ typescript: true, scss: true })]
}),
tsconfigPaths()
]
})
「<script lang="ts">」内で別のSvelteコンポーネントを呼び出せない問題
先程の内容からも最新の
@sveltejs/vite-plugin-svelte
<script lang="ts">
import PageHeader from './PageHeader.svelte';
//...中略
</script>
...
<PageHeader />
...
この状態でサーバーを起動すると、

のように外部のsvelteファイルを読み込んでくれないようです。
このバグの出所を良くみてみると、
sb-preview/runtime.js
ユーザー側のできる対処法として、外部のSvelteコンポーネントを親コンポーネントから呼び出したい場合、typescriptのPreprocessは使わずに、
<script>
import PageHeader from './PageHeader.svelte';
//...中略
</script>
...
<PageHeader />
...
とすると問題なくプレビュー画面が起動します。
まとめ
個人的な感想で、ようやくまともにSvelte5コンポーネントがStorybookで使えるようになった安堵感があります。
これで心置きなく過去のSvelteプロジェクトをver.5へマイグレできるようになって喜ばしい限りです。
記事を書いた人
ナンデモ系エンジニア
主にAngularでフロントエンド開発することが多いです。 開発環境はLinuxメインで進めているので、シェルコマンドも多用しております。 コツコツとプログラミングするのが好きな人間です。
カテゴリー