よっしー
こんにちは。よっしーです(^^)
今日は、SvelteKitでのパッケージングについて解説しています。
背景
SvelteKitでのパッケージングについて調査する機会がありましたので、その時の内容を備忘として記事に残しました。
ベストプラクティス
SvelteKit特有のモジュール使用に関する注意
パッケージが他のSvelteKitプロジェクトでのみ使用されることを意図している場合を除き、$app/environment
のようなSvelteKit特有のモジュールの使用は避けるべきです。
例:
- 非推奨:
import { browser } from '$app/environment'
- 推奨:
import { BROWSER } from 'esm-env'
また、$app/stores
や$app/navigation
などに直接依存するのではなく、現在のURLやナビゲーションアクションをプロップとして渡すことを検討してください。このような汎用的な方法で実装することで、テストやUIデモなどのツール設定も容易になります。
エイリアスの設定
エイリアスはsvelte-package
で処理されるように、vite.config.js
やtsconfig.json
ではなく、svelte.config.js
で追加するようにしてください。
バージョン管理の重要性
パッケージの変更が以下のどれに該当するか慎重に検討し、それに応じてパッケージバージョンを更新してください:
- バグ修正
- 新機能追加
- 破壊的変更
特に、既存ライブラリのexports
からパスを削除したり、その中のexport
条件を変更したりする場合は、破壊的変更として扱う必要があります。
package.jsonの例と破壊的変更の具体例
{
"exports": {
".": {
"types": "./dist/index.d.ts",
// `svelte`を`default`に変更するのは破壊的変更:
"svelte": "./dist/index.js",
"default": "./dist/index.js"
},
// これを削除するのは破壊的変更:
"./foo": {
"types": "./dist/foo.d.ts",
"svelte": "./dist/foo.js",
"default": "./dist/foo.js"
},
// これを追加するのは問題ない:
"./bar": {
"types": "./dist/bar.d.ts",
"svelte": "./dist/bar.js",
"default": "./dist/bar.js"
}
}
}
重要なポイント
- モジュール依存性
- SvelteKit特有のモジュールへの依存は最小限に
- より汎用的なアプローチを採用
- 依存関係はプロップを通じて注入することを推奨
- 設定管理
- エイリアス設定は
svelte.config.js
に集中 - 他の設定ファイルでの重複を避ける
- バージョニング規則
exports
からのパス削除は破壊的変更- 条件の変更(例:
svelte
→default
)は破壊的変更 - 新しいパスの追加は非破壊的変更
このベストプラクティスに従うことで、より保守性が高く、他のプロジェクトとの互換性のあるパッケージを作成することができます。
おわりに
今日は、 SvelteKitでのパッケージングについて解説しました。
よっしー
何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント