turbopack-bundler について
JavaScript と TypeScript のプロジェクト、特に Next.js を使う開発者向けの Turbopack スキルです。設定、組み込みアセット対応、増分キャッシュ、コード分割、webpack からの移行を扱います。
主な機能
- 01Next.js での Turbopack 設定
- 02TypeScript と JSX のサポート
- 03CSS と静的アセットの処理
- 04エイリアスとカスタムローダーの設定
- 05増分キャッシュとコード分割
活用シーン
- 01Next.js の開発で Turbopack を有効化
- 02エイリアスとアセットルールの設定
- 03増分ビルドに向けたコード整理
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ mindrally/ skills --skill turbopack-bundlerインストール後、Claude Code で/turbopack-bundlerを入力して読み込まれたか確認します。
詳細
Turbopack バンドラー
Turbopack は、Rust で記述され Next.js に組み込まれた、JavaScript と TypeScript に最適化されたインクリメンタルバンドラーです。Turbopack を使用する際は、以下のガイドラインに従ってください。
基本原則
- Turbopack はインクリメンタルな計算とキャッシュを前提に設計されています
- Turbo エンジンによる関数レベルのキャッシュ
- 高速なビルドを実現するネイティブ Rust のパフォーマンス
- TypeScript と JSX の組み込みサポート
- Next.js との統合に最適化
- webpack の設定を抽象化
プロジェクト構成
project/
├── src/
│ ├── app/ # Next.js App Router
│ │ ├── layout.tsx
│ │ ├── page.tsx
│ │ └── globals.css
│ ├── components/ # Shared components
│ └── lib/ # Utility functions
├── public/ # Static assets
├── next.config.js # Next.js configuration
├── tsconfig.json # TypeScript config
└── package.json
Turbopack の有効化
開発モード
# Next.js 13.4+
next dev --turbo
# Or in package.json
{
"scripts": {
"dev": "next dev --turbo"
}
}
Next.js の設定
// next.config.js
module.exports = {
experimental: {
turbo: {
// Turbopack-specific configuration
}
}
};
設定オプション
カスタムローダー
// next.config.js
module.exports = {
turbopack: {
rules: {
'*.svg': {
loaders: ['@svgr/webpack'],
as: '*.js'
},
'*.mdx': {
loaders: ['@mdx-js/loader']
}
}
}
};
エイリアスの解決
// next.config.js
module.exports = {
turbopack: {
resolveAlias: {
'@components': './src/components',
'@lib': './src/lib',
'@styles': './src/styles'
}
}
};
拡張子の解決
// next.config.js
module.exports = {
turbopack: {
resolveExtensions: ['.tsx', '.ts', '.jsx', '.js', '.json']
}
};
組み込みサポート
Turbopack には、以下のサポートが組み込まれています。
- TypeScript:設定は不要です
- JSX/TSX:自動変換
- CSS:ネイティブ CSS サポート
- CSS Modules:
.module.cssファイル - PostCSS:自動処理
- 静的アセット:画像、フォントなど
以下のローダーは不要です。
css-loaderpostcss-loaderbabel-loader(@babel/preset-env用)
TypeScript の設定
推奨される tsconfig.json
{
"compilerOptions": {
"target": "ES2017",
"lib": ["dom", "dom.iterable", "esnext"],
"allowJs": true,
"skipLibCheck": true,
"strict": true,
"noEmit": true,
"esModuleInterop": true,
"module": "esnext",
"moduleResolution": "bundler",
"resolveJsonModule": true,
"isolatedModules": true,
"jsx": "preserve",
"incremental": true,
"baseUrl": ".",
"paths": {
"@/*": ["./src/*"]
}
}
}
パスエイリアス
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@components/*": ["src/components/*"],
"@lib/*": ["src/lib/*"],
"@styles/*": ["src/styles/*"]
}
}
}
コードの整理
アトミックデザインパターン
src/
├── components/
│ ├── atoms/ # Basic building blocks
│ │ ├── Button/
│ │ └── Input/
│ ├── molecules/ # Combinations of atoms
│ │ ├── SearchBar/
│ │ └── NavItem/
│ ├── organisms/ # Complex components
│ │ ├── Header/
│ │ └── Footer/
│ └── templates/ # Page layouts
│ └── MainLayout/
├── app/
│ └── page.tsx
└── lib/
└── utils.ts
コンポーネント構成
Button/
├── Button.tsx
├── Button.module.css
├── Button.test.tsx
└── index.ts
コード分割
動的インポート
import dynamic from 'next/dynamic';
const HeavyComponent = dynamic(() => import('@/components/HeavyComponent'), {
loading: () => <p>Loading...</p>,
ssr: false // Disable server-side rendering if needed
});
ルートベースの分割
Next.js は app/ ディレクトリ内のルートごとにコードを自動的に分割します。
手動での分割
// Split large components
const ChartComponent = dynamic(() => import('./ChartComponent'));
const EditorComponent = dynamic(() => import('./EditorComponent'));
キャッシュ戦略
Turbo エンジンのキャッシュ
- インクリメンタルビルド向けの関数レベルのキャッシュ
- 変更された部分のみを再計算
- ビルド間でキャッシュを永続化
キャッシュの最適化
// Keep modules focused and small
// Changes to one module don't invalidate others
// Good: Separate concerns
export function formatDate(date: Date) { /* ... */ }
export function formatCurrency(amount: number) { /* ... */ }
// Avoid: Large utility files that change frequently
パフォーマンスに関するベストプラクティス
モジュールの整理
- モジュールは小さく、役割を絞ってください
- モジュール間の依存関係を最小限に抑えてください
- バレルエクスポートは控えめに使用してください
インポートの最適化
// Prefer specific imports
import { Button } from '@/components/Button';
// Avoid importing entire libraries
// Bad: import _ from 'lodash';
// Good: import debounce from 'lodash/debounce';
静的解析
// Use const assertions for better tree-shaking
const ROUTES = {
home: '/',
about: '/about',
contact: '/contact'
} as const;
CSS の処理
CSS Modules
import styles from './Component.module.css';
function Component() {
return <div className={styles.container}>Content</div>;
}
グローバル CSS
// app/layout.tsx
import './globals.css';
Tailwind CSS
// tailwind.config.js
module.exports = {
content: [
'./src/**/*.{js,ts,jsx,tsx,mdx}',
'./app/**/*.{js,ts,jsx,tsx,mdx}'
]
};
環境変数
Next.js の環境変数
# .env.local
NEXT_PUBLIC_API_URL=https://api.example.com
DATABASE_URL=postgresql://...
// Client-side (must have NEXT_PUBLIC_ prefix)
const apiUrl = process.env.NEXT_PUBLIC_API_URL;
// Server-side only
const dbUrl = process.env.DATABASE_URL;
テスト
テストの整理
src/
├── components/
│ └── Button/
│ ├── Button.tsx
│ └── Button.test.tsx # Co-located test
└── __tests__/ # Integration tests
└── pages/
└── home.test.tsx
テストに関するベストプラクティス
- ユーティリティ関数のユニットテストを作成してください
- コンポーネントには React Testing Library を使用してください
- Cypress または Playwright でエンドツーエンドテストを実施してください
- テスト対象のコードの近くにテストを配置してください
よくある落とし穴
設定の問題
// Ensure correct tsconfig.json paths
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@/*": ["./src/*"] // Must match actual structure
}
}
}
キャッシュの問題
# Clear Turbopack cache if issues arise
rm -rf .next
互換性
- Turbopack との依存関係の互換性を確認してください
- webpack プラグインの中には、そのままでは動作しないものがあります
- webpack の設定ではなく、Next.js の設定を使用してください
webpack からの移行
変更点
- webpack.config.js を直接使用することはできません
- カスタマイズには next.config.js を使用してください
- 一部のローダーには Turbopack 用の代替手段が必要です
変更されない点
- インポート構文
- 動的インポート
- CSS Modules
- TypeScript のサポート
ベストプラクティスのまとめ
推奨事項
- カスタマイズには Next.js の設定を使用してください
- TypeScript と JSX の組み込みサポートを活用してください
- インクリメンタルな計算に適したコード構成にしてください
- コード分割には動的インポートを使用してください
- モジュールは役割を絞り、小さく保ってください
避けるべきこと
- webpack の設定を直接使用すること
- 頻繁に変更される大規模なバレルファイル
- Next.js の規約に逆らうこと
- TypeScript のパス設定を無視すること
デバッグ
詳細ログ
NEXT_DEBUG_TURBOPACK=1 next dev --turbo
ビルドの分析
# Check build output
ANALYZE=true next build
よくある問題
- 初回ビルドが遅い:正常です。2 回目以降のビルドは高速です
- モジュールが見つからない:tsconfig.json のパスエイリアスを確認してください
- CSS が読み込まれない:インポート構文が正しいことを確認してください
- 型エラー:別途
tsc --noEmitを実行してください
コメント
Markdown 対応