Skip to content

Commit a41d3d6

Browse files
authored
Merge pull request #2753 from AtCoder-NoviSteps/#2750
breaking: Migrate from lucide-svelte to @lucide/svelte (#2750)
2 parents 9ad85da + db95eb6 commit a41d3d6

File tree

22 files changed

+1350
-851
lines changed

22 files changed

+1350
-851
lines changed
Lines changed: 188 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,188 @@
1+
## 📋 実行チェックリスト
2+
3+
## ✅ 移行実行前の確認
4+
5+
### 準備フェーズ
6+
7+
- [x] `plan.md` の内容をレビュー完了
8+
- [x] 現在のブランチが正しいことを確認 (`git branch`)
9+
- [x] 作業用ブランチを作成(推奨): `#2750`
10+
- [x] 最新の状態に更新: `git pull origin staging`
11+
12+
---
13+
14+
## ✅ 移行実行フェーズ
15+
16+
### ステップ 1: バックアップとコミット
17+
18+
- [x] 現在の状態をセーブ(スキップ)
19+
- [x] コミットハッシュを記録: 既存の #2750 ブランチを使用
20+
21+
### ステップ 2: パッケージ置き換え
22+
23+
- [x] 現在のバージョンを確認: `lucide-svelte@0.548.0`
24+
- [x] 古いパッケージをアンインストール: ✅
25+
- [x] 新しいパッケージをインストール: `@lucide/svelte@0.548.0`
26+
- [x] インストール完了を確認: ✅
27+
- [x] `pnpm-lock.yaml` が更新されたことを確認: ✅
28+
29+
### ステップ 3: コード修正
30+
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'`
52+
53+
---
54+
55+
## ✅ 検証フェーズ
56+
57+
### ステップ 4: 型チェック
58+
59+
- [x] TypeScript 型チェック実行: `pnpm check`
60+
- 結果: **lucide 関連エラーなし**
61+
62+
### ステップ 5: ビルド確認
63+
64+
- [x] ビルド実行: `pnpm build`
65+
- ビルド時間: **15.74 秒**
66+
- 結果: **成功 ✅**
67+
68+
### ステップ 6: 開発サーバー確認
69+
70+
- [x] 開発サーバー起動: `pnpm dev`
71+
- ポート: 5174
72+
- 結果: **起動成功 ✅**
73+
74+
### ステップ 7: テスト実行
75+
76+
- [x] ユニットテスト: スキップ
77+
- [x] E2E テスト: スキップ
78+
79+
### ステップ 8: Lint/Format チェック
80+
81+
- [x] Prettier チェック: `pnpm format`
82+
- 結果: **修正完了 ✅**
83+
84+
- [x] ESLint チェック: `pnpm lint`
85+
- 結果: **エラーなし、警告 38 個(既存)✅**
86+
87+
---
88+
89+
## 📝 完了フェーズ
90+
91+
### ステップ 9: 変更内容の確認
92+
93+
- [x] 差分を確認: `git diff`
94+
- 修正ファイル数: **23 個**
95+
- 主要な変更:
96+
- `package.json`
97+
- `pnpm-lock.yaml`
98+
- 18 個のコンポーネント ✅
99+
100+
### ステップ 10: コミット
101+
102+
- [ ] ステージング: `git add package.json pnpm-lock.yaml src/...`
103+
- [ ] コミット: 準備完了
104+
105+
### ステップ 11: プッシュと PR
106+
107+
- [ ] リモートにプッシュ
108+
- [ ] GitHub で PR を作成
109+
110+
---
111+
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️⃣ トラブルシューティング:型定義エラーの原因
133+
134+
**症状**: `Cannot find module '@lucide/svelte/icons/icon-name' or its corresponding type declarations`
135+
136+
**原因**: Docker コンテナ内の TypeScript/Node.js キャッシュが古い状態を保持していた。具体的には:
137+
138+
- `node_modules` の型定義ファイルのメタデータがキャッシュ
139+
- VS Code/TypeScript の言語サーバーキャッシュが更新されていない
140+
- パッケージの `exports` フィールド解決が失敗
141+
142+
**解決方法**:
143+
144+
```bash
145+
# 段階的な対応
146+
1. pnpm install --force # または rm -rf node_modules && pnpm install
147+
2. Docker コンテナ再起動 # ← これで解決した場合、キャッシュが原因
148+
```
149+
150+
**重要**: Docker コンテナの再起動で解決した場合、それは**キャッシュ問題**です。単なる再インストールでは解決しないことがあります。
151+
152+
#### 3️⃣ 最終的なインポート形式
153+
154+
すべてのアイコンは以下の形式に統一:
155+
156+
```svelte
157+
import IconName from '@lucide/svelte/icons/icon-name';
158+
```
159+
160+
**メリット**:
161+
162+
- ✅ 公式ドキュメントの形式と一致
163+
- ✅ Tree-shaking が効く(バンドルサイズ最適化)
164+
- ✅ TypeScript の型定義が正しく解決される
165+
166+
---
167+
168+
### 🚨 トラブルシューティング
169+
170+
### 🔧 実行時の工夫
171+
172+
| 項目 | 説明 |
173+
| ------------------ | ---------------------------------- |
174+
| **一括修正** | 18 ファイル全てを統一的に修正 |
175+
| **ビルド実行** | 15.74 秒で成功 |
176+
| **Lint/Format** | エラーなし、既存警告 38 個のみ |
177+
| **キャッシュ対策** | Docker コンテナ再起動で完全解決 ✅ |
178+
179+
### ⚠️ 注意点と対処方法
180+
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+
---

0 commit comments

Comments
 (0)