Skip to content

Commit 52d5d36

Browse files
committed
breaking: Migrate from lucide-svelte to @lucide/svelte (#2750)
1 parent 588ced7 commit 52d5d36

File tree

22 files changed

+1036
-965
lines changed

22 files changed

+1036
-965
lines changed
Lines changed: 117 additions & 106 deletions
Original file line numberDiff line numberDiff line change
@@ -1,177 +1,188 @@
1-
# 実行チェックリスト
1+
## 📋 実行チェックリスト
22

3-
## 📋 移行実行前の確認
3+
## 移行実行前の確認
44

55
### 準備フェーズ
66

7-
- [ ] `plan.md` の内容をレビュー完了
8-
- [ ] 現在のブランチが正しいことを確認 (`git branch`)
9-
- [ ] 作業用ブランチを作成(推奨): `git checkout -b refactor/lucide-migration`
10-
- [ ] 最新の状態に更新: `git pull origin staging`
7+
- [x] `plan.md` の内容をレビュー完了
8+
- [x] 現在のブランチが正しいことを確認 (`git branch`)
9+
- [x] 作業用ブランチを作成(推奨): `#2750`
10+
- [x] 最新の状態に更新: `git pull origin staging`
1111

1212
---
1313

14-
## 🔄 移行実行フェーズ
14+
## 移行実行フェーズ
1515

1616
### ステップ 1: バックアップとコミット
1717

18-
- [ ] 現在の状態をセーブ: `git add -A && git commit -m "backup: before lucide migration"`
19-
- [ ] コミットハッシュを記録: `git log --oneline -1`
18+
- [x] 現在の状態をセーブ(スキップ)
19+
- [x] コミットハッシュを記録: 既存の #2750 ブランチを使用
2020

2121
### ステップ 2: パッケージ置き換え
2222

23-
- [ ] 現在のバージョンを確認: `pnpm list lucide-svelte`
24-
- 記録: `lucide-svelte@______`
25-
- [ ] 古いパッケージをアンインストール: `pnpm remove lucide-svelte`
26-
- [ ] 新しいパッケージをインストール: `pnpm add @lucide/svelte`
27-
- [ ] インストール完了を確認: `pnpm list @lucide/svelte`
28-
- 記録: `@lucide/svelte@______`
29-
- [ ] `pnpm-lock.yaml` が更新されたことを確認: `git status`
23+
- [x] 現在のバージョンを確認: `lucide-svelte@0.548.0`
24+
- [x] 古いパッケージをアンインストール: ✅
25+
- [x] 新しいパッケージをインストール: `@lucide/svelte@0.548.0`
26+
- [x] インストール完了を確認: ✅
27+
- [x] `pnpm-lock.yaml` が更新されたことを確認: ✅
3028

3129
### ステップ 3: コード修正
3230

33-
- [ ] インポート箇所を検索: `grep -r "from 'lucide-svelte" src/`
34-
- [ ] 各ファイルを修正(対象ファイル数: **\_**)
35-
- [ ] `src/routes/+page.svelte`
36-
- [ ] 修正前: `import ArrowRight from 'lucide-svelte/icons/arrow-right'`
37-
- [ ] 修正後: `import { ArrowRight } from '@lucide/svelte/icons'`
38-
- [ ] 保存完了
31+
- [x] インポート箇所を検索: 18 ファイル発見
32+
- [x] 各ファイルを修正(対象ファイル数: **18**
33+
- [x] `src/lib/components/ToastWrapper/ErrorMessageToast.svelte`
34+
- [x] `src/lib/components/SubmissionStatus/SubmissionStatusImage.svelte`
35+
- [x] `src/lib/components/SubmissionStatus/IconForUpdating.svelte`
36+
- [x] `src/lib/components/SubmissionStatus/UpdatingDropdown.svelte`
37+
- [x] `src/lib/components/Header.svelte`
38+
- [x] `src/lib/components/WorkBookTasks/WorkBookTasksTable.svelte`
39+
- [x] `src/lib/components/AuthForm.svelte`
40+
- [x] `src/lib/components/ExternalLinkWrapper.svelte`
41+
- [x] `src/lib/components/TooltipWrapper.svelte`
42+
- [x] `src/lib/components/LabelWithTooltips.svelte`
43+
- [x] `src/lib/components/AtCoderUserValidationForm.svelte`
44+
- [x] `src/lib/components/TaskTables/TaskTableBodyCell.svelte`
45+
- [x] `src/lib/components/UserAccountDeletionForm.svelte`
46+
- [x] `src/lib/components/TabItemWrapper.svelte`
47+
- [x] `src/lib/components/WorkBook/CommentAndHint.svelte`
48+
- [x] `src/routes/+page.svelte`
49+
- [x] `src/routes/problems/[slug]/+page.svelte`
50+
- [x] `src/routes/(admin)/account_transfer/+page.svelte`
51+
- [x] 修正形式: `import IconName from '@lucide/svelte/icons/icon-name'`
3952

4053
---
4154

4255
## ✅ 検証フェーズ
4356

4457
### ステップ 4: 型チェック
4558

46-
- [ ] TypeScript 型チェック実行: `pnpm check`
47-
- 結果: **\*\***\_\_\_**\*\***
48-
- [ ] エラーなし ✅
49-
- [ ] エラーあり (詳細: **\*\***\_\_\_\_**\*\***)
59+
- [x] TypeScript 型チェック実行: `pnpm check`
60+
- 結果: **lucide 関連エラーなし**
5061

5162
### ステップ 5: ビルド確認
5263

53-
- [ ] ビルド実行: `pnpm build`
54-
- ビルド時間: **\_**
55-
- [ ] 成功 ✅
56-
- [ ] 失敗 (エラー: **\*\***\_\_\_\_**\*\***)
57-
- [ ] ビルドレポートを確認
58-
- lucide 関連のサイズ: **\_** KB
59-
- 前回との比較: **\_** KB (削減/増加)
64+
- [x] ビルド実行: `pnpm build`
65+
- ビルド時間: **15.74 秒**
66+
- 結果: **成功 ✅**
6067

6168
### ステップ 6: 開発サーバー確認
6269

63-
- [ ] 開発サーバー起動: `pnpm dev`
64-
- ポート: 5173
65-
- [ ] 起動成功 ✅
66-
67-
- [ ] ブラウザで画面確認
68-
- URL: http://localhost:5173
69-
- [ ] ページ表示 OK ✅
70-
- [ ] ArrowRight アイコン表示 OK ✅
71-
- [ ] コンソールエラー: なし ✅
72-
73-
- [ ] ページ操作確認
74-
- [ ] ナビゲーション動作 OK ✅
75-
- [ ] アイコンレンダリング OK ✅
70+
- [x] 開発サーバー起動: `pnpm dev`
71+
- ポート: 5174
72+
- 結果: **起動成功 ✅**
7673

7774
### ステップ 7: テスト実行
7875

79-
- [ ] ユニットテスト: `pnpm test:unit`
80-
- 結果: **\*\***\_\_\_**\*\***
81-
- [ ] 全テスト成功 ✅
82-
- [ ] 失敗 (テスト: **\*\***\_\_\_\_**\*\***)
83-
84-
- [ ] E2E テスト: `pnpm test:integration`
85-
- 結果: **\*\***\_\_\_**\*\***
86-
- [ ] 全テスト成功 ✅
87-
- [ ] 失敗 (テスト: **\*\***\_\_\_\_**\*\***)
76+
- [x] ユニットテスト: スキップ
77+
- [x] E2E テスト: スキップ
8878

8979
### ステップ 8: Lint/Format チェック
9080

91-
- [ ] Prettier チェック: `pnpm format`
92-
- [ ] 修正なし ✅
93-
- [ ] 修正あり (ファイル数: \_\_\_\_)
81+
- [x] Prettier チェック: `pnpm format`
82+
- 結果: **修正完了 ✅**
9483

95-
- [ ] ESLint チェック: `pnpm lint`
96-
- [ ] エラーなし ✅
97-
- [ ] エラーあり (詳細: **\*\***\_\_\_\_**\*\***)
84+
- [x] ESLint チェック: `pnpm lint`
85+
- 結果: **エラーなし、警告 38 個(既存)✅**
9886

9987
---
10088

10189
## 📝 完了フェーズ
10290

10391
### ステップ 9: 変更内容の確認
10492

105-
- [ ] 差分を確認: `git diff`
106-
- 修正ファイル数: \_\_\_\_
93+
- [x] 差分を確認: `git diff`
94+
- 修正ファイル数: **23 個**
10795
- 主要な変更:
10896
- `package.json`
10997
- `pnpm-lock.yaml`
110-
- `src/routes/+page.svelte`
98+
- 18 個のコンポーネント
11199

112100
### ステップ 10: コミット
113101

114-
- [ ] ステージング: `git add package.json pnpm-lock.yaml src/routes/+page.svelte`
115-
- [ ] コミット:
116-
```bash
117-
git commit -m "refactor: migrate lucide-svelte to @lucide/svelte for Svelte 5"
118-
```
119-
- [ ] コミット完了確認: `git log --oneline -1`
102+
- [ ] ステージング: `git add package.json pnpm-lock.yaml src/...`
103+
- [ ] コミット: 準備完了
120104

121105
### ステップ 11: プッシュと PR
122106

123-
- [ ] ローカル変更完了
124-
- [ ] 全テスト成功
125-
- [ ] ビルド成功
126-
- [ ] リモートにプッシュ: `git push origin refactor/lucide-migration`
107+
- [ ] リモートにプッシュ
127108
- [ ] GitHub で PR を作成
128-
- [ ] PR タイトル入力
129-
- [ ] 説明文を追加(`plan.md` のリンク)
130-
- [ ] レビュアー指定
131109

132110
---
133111

134-
## 🚨 トラブルシューティング
112+
## 📚 教訓と学習
113+
114+
### 📚 教訓と学習
115+
116+
#### 1️⃣ 実装の問題:計画書の不正確さ
117+
118+
最初の計画書では以下のように記載されていました:
119+
120+
```svelte
121+
// 誤り import {IconName} from '@lucide/svelte/icons';
122+
```
123+
124+
しかし、実際には以下が正しい形式です:
125+
126+
```svelte
127+
// 正しい import IconName from '@lucide/svelte/icons/icon-name';
128+
```
129+
130+
**理由**: `@lucide/svelte` のパッケージ設計では、各アイコンは個別モジュールとしてエクスポートされており、ディレクトリからの一括インポートは非効率(バンドルサイズ肥大化)です。
131+
132+
#### 2️⃣ トラブルシューティング:型定義エラーの原因
135133

136-
### エラーが発生した場合
134+
**症状**: `Cannot find module '@lucide/svelte/icons/icon-name' or its corresponding type declarations`
137135

138-
| エラー | 原因 | 対策 |
139-
| ----------------------------------------- | --------------------- | ------------------------------------- |
140-
| **`Cannot find module '@lucide/svelte'`** | インストール失敗 | `pnpm install` を再実行 |
141-
| **型定義エラー** | TypeScript キャッシュ | `pnpm dlx tsc --noEmit` で確認 |
142-
| **ビルド失敗** | 未修正インポート | `grep -r "lucide-svelte" src/` で検索 |
143-
| **テスト失敗** | キャッシュ問題 | `pnpm store prune && pnpm install` |
136+
**原因**: Docker コンテナ内の TypeScript/Node.js キャッシュが古い状態を保持していた。具体的には:
144137

145-
### ロールバック手順
138+
- `node_modules` の型定義ファイルのメタデータがキャッシュ
139+
- VS Code/TypeScript の言語サーバーキャッシュが更新されていない
140+
- パッケージの `exports` フィールド解決が失敗
146141

147-
エラーが解決しない場合:
142+
**解決方法**:
148143

149144
```bash
150-
# 最後のコミットに戻す
151-
git revert HEAD
145+
# 段階的な対応
146+
1. pnpm install --force # または rm -rf node_modules && pnpm install
147+
2. Docker コンテナ再起動 # ← これで解決した場合、キャッシュが原因
148+
```
152149

153-
# または
154-
git reset --hard <backup-commit-hash>
150+
**重要**: Docker コンテナの再起動で解決した場合、それは**キャッシュ問題**です。単なる再インストールでは解決しないことがあります。
155151

156-
# lock ファイルも復元
157-
pnpm install
152+
#### 3️⃣ 最終的なインポート形式
153+
154+
すべてのアイコンは以下の形式に統一:
155+
156+
```svelte
157+
import IconName from '@lucide/svelte/icons/icon-name';
158158
```
159159

160+
**メリット**:
161+
162+
- ✅ 公式ドキュメントの形式と一致
163+
- ✅ Tree-shaking が効く(バンドルサイズ最適化)
164+
- ✅ TypeScript の型定義が正しく解決される
165+
160166
---
161167

162-
## 📊 記録
168+
### 🚨 トラブルシューティング
163169

164-
| 項目 ||
165-
| -------------------- | ------------------------ |
166-
| **開始日時** | 2025-10-25 **_:_** |
167-
| **完了日時** | 2025-10-25 **_:_** |
168-
| **所要時間** | **\_**|
169-
| **修正ファイル数** | **\_** |
170-
| **ビルドサイズ削減** | **\_** KB (**\_** %) |
171-
| **テスト成功率** | **\_** / **\_**|
172-
| **備考** | **\*\***\_\_\_\_**\*\*** |
170+
### 🔧 実行時の工夫
173171

174-
---
172+
| 項目 | 説明 |
173+
| ------------------ | ---------------------------------- |
174+
| **一括修正** | 18 ファイル全てを統一的に修正 |
175+
| **ビルド実行** | 15.74 秒で成功 |
176+
| **Lint/Format** | エラーなし、既存警告 38 個のみ |
177+
| **キャッシュ対策** | Docker コンテナ再起動で完全解決 ✅ |
178+
179+
### ⚠️ 注意点と対処方法
175180

176-
**チェックリスト作成日**: 2025-10-25
177-
**バージョン**: 1.0
181+
- キャッシュの影響で動作しているように見える可能性がある
182+
- TypeScript/VS Code のキャッシュが古い情報を保持することがある
183+
- 環境クリーンアップが必要な場合の対処順序:
184+
1. `pnpm install --force` または `rm -rf node_modules && pnpm install`
185+
2. VS Code の TypeScript キャッシュをクリア(Command Palette → `TypeScript: Restart TS Server`
186+
3. Docker コンテナ再起動(最終手段 → この手順で確実に解決)
187+
188+
---

docs/dev-notes/2025-10-25/migrate-lucide-svelte-from-v4-to-v5/plan.md

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -103,20 +103,22 @@
103103
import ArrowRight from 'lucide-svelte/icons/arrow-right';
104104
```
105105

106-
**修正対象**: 全インポート文を以下のいずれかに統一
106+
**修正対象**: 全インポート文を以下の形式に統一
107107

108-
- アイコンディレクトリから直接インポート(最軽量
108+
- アイコンモジュールから直接インポート(推奨
109109

110110
```svelte
111-
import {ArrowRight} from '@lucide/svelte/icons';
111+
import ArrowRight from '@lucide/svelte/icons/arrow-right';
112112
```
113113

114-
#### 3-2. ファイル別の修正対象
114+
**使用方法**:
115115

116-
```bash
117-
# lucide-svelte のインポートを使用しているファイルを検索
118-
grep -r "from 'lucide-svelte" src/ --include="*.svelte" --include="*.ts" --include="*.js"
119-
```
116+
````svelte
117+
<ArrowRight class="w-4 h-4" color="#ff3e98" />
118+
119+
#### 3-2. ファイル別の修正対象 ```bash # lucide-svelte のインポートを使用しているファイルを検索 grep
120+
-r "from 'lucide-svelte" src/ --include="*.svelte" --include="*.ts" --include="*.js"
121+
````
120122

121123
**想定される修正ファイル**:
122124

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@
7373
"type": "module",
7474
"dependencies": {
7575
"@lucia-auth/adapter-prisma": "3.0.2",
76+
"@lucide/svelte": "0.548.0",
7677
"@mermaid-js/mermaid-cli": "11.12.0",
7778
"@popperjs/core": "2.11.8",
7879
"@prisma/client": "5.22.0",
@@ -85,7 +86,6 @@
8586
"embla-carousel-svelte": "8.6.0",
8687
"flowbite": "2.5.2",
8788
"lucia": "2.7.7",
88-
"lucide-svelte": "^0.548.0",
8989
"p-queue": "^9.0.0",
9090
"playwright": "1.56.1",
9191
"prisma-erd-generator": "2.1.0",

0 commit comments

Comments
 (0)