AtCoder-NoviSteps / AtCoderNoviSteps

【非公式】 AtCoder 上の問題について、取組み状況を記録していくサイトです。各問題が細かく難易度付けされており、必要な知識を段階的に習得できます。
https://atcoder-novisteps.vercel.app/
MIT License
31 stars 8 forks source link

ビルドツールViteの最適化を図りましょう #1122

Open KATO-Hiro opened 1 month ago

KATO-Hiro commented 1 month ago

Background

WHAT

See

https://vitejs.dev/guide/performance

KATO-Hiro commented 4 weeks ago

Issues

[ Farm ] Error: Parse `src/app.html` failed.
 Error: Parse `src/app.html` failed.
 Error:   × Stray end tag "head"
    ╭─[src/app.html:8:1]
  5 │         <link rel="icon" href="%sveltekit.assets%/favicon.png" />
  6 │         <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7 │         %sveltekit.head%
  8 │     </head>
    ·     ───────
  9 │     <body data-sveltekit-preload-data="hover" class="bg-white dark:bg-gray-800">
 10 │         <div style="display: contents">%sveltekit.body%</div>
 11 │     </body>
    ╰────
  × Start tag "body" seen but an element of the same type was already open
    ╭─[src/app.html:9:1]
  6 │         <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7 │         %sveltekit.head%
  8 │     </head>
  9 │     <body data-sveltekit-preload-data="hover" class="bg-white dark:bg-gray-800">
    ·     ────────────────────────────────────────────────────────────────────────────
 10 │         <div style="display: contents">%sveltekit.body%</div>
 11 │     </body>
 12 │ </html>
    ╰────

Potential Causes:
1.The module have syntax error.
2.This kind of module is not supported, you may need plugins to support it

Potential Causes:
1.The module have syntax error.
2.This kind of module is not supported, you may need plugins to support it
KATO-Hiro commented 3 weeks ago

代替ツール

KATO-Hiro commented 3 weeks ago

SvelteKitアプリでビルド速度を向上させるための方法

1. 依存関係の最適化

Viteは依存関係を事前にバンドルすることでビルド速度を向上させます。optimizeDepsオプションを使用して、依存関係の事前バンドルを設定します。

// vite.config.js
import { defineConfig } from 'vite';
import { sveltekit } from '@sveltejs/kit/vite';

export default defineConfig({
  plugins: [sveltekit()],
  optimizeDeps: {
    include: ['some-large-dependency'],
    exclude: ['some-unnecessary-dependency']
  }
});

2. キャッシュの利用

Viteはデフォルトでキャッシュを利用しますが、キャッシュの設定を見直すことでビルド速度を向上させることができます。

// vite.config.js
import { defineConfig } from 'vite';
import { sveltekit } from '@sveltejs/kit/vite';

export default defineConfig({
  plugins: [sveltekit()],
  cacheDir: 'node_modules/.vite_cache'
});

3. コードスプリッティング

コードスプリッティングを使用して、アプリケーションを複数のチャンクに分割することで、初期ロード時間を短縮できます。

// vite.config.js
import { defineConfig } from 'vite';
import { sveltekit } from '@sveltejs/kit/vite';

export default defineConfig({
  plugins: [sveltekit()],
  build: {
    rollupOptions: {
      output: {
        manualChunks: {
          vendor: ['some-large-dependency']
        }
      }
    }
  }
});

4. 開発サーバーの設定

開発サーバーの設定を見直すことで、パフォーマンスを向上させることができます。

// vite.config.js
import { defineConfig } from 'vite';
import { sveltekit } from '@sveltejs/kit/vite';

export default defineConfig({
  plugins: [sveltekit()],
  server: {
    fs: {
      strict: true
    },
    watch: {
      usePolling: true,
      interval: 100
    }
  }
});

5. プラグインの最適化

不要なプラグインを削除したり、プラグインの設定を見直すことでビルド速度を向上させることができます。

6. ホットモジュールリプレースメント(HMR)の設定

HMRの設定を見直すことで、開発中のビルド速度を向上させることができます。

// vite.config.js
import { defineConfig } from 'vite';
import { sveltekit } from '@sveltejs/kit/vite';

export default defineConfig({
  plugins: [sveltekit()],
  server: {
    hmr: {
      overlay: false
    }
  }
});

7. 依存関係のアップデート

依存関係を最新バージョンにアップデートすることで、パフォーマンスが向上する場合があります。

npm update

8. Esbuildの利用

Viteは内部でEsbuildを使用していますが、設定を見直すことでさらにパフォーマンスを向上させることができます。

// vite.config.js
import { defineConfig } from 'vite';
import { sveltekit } from '@sveltejs/kit/vite';

export default defineConfig({
  plugins: [sveltekit()],
  esbuild: {
    target: 'esnext',
    minify: true
  }
});

9. ファイルの監視設定

ファイルの監視設定を見直すことで、リロードのパフォーマンスを向上させることができます。

// vite.config.js
import { defineConfig } from 'vite';
import { sveltekit } from '@sveltejs/kit/vite';

export default defineConfig({
  plugins: [sveltekit()],
  server: {
    watch: {
      ignored: ['**/node_modules/**', '**/.git/**']
    }
  }
});

10. モジュールの分割

大きなモジュールを小さなモジュールに分割することで、ビルド時間を短縮できます。これにより、変更があった部分だけを再ビルドすることができます。

11. SSR(サーバーサイドレンダリング)の設定

SSRを使用する場合、設定を見直すことでビルド速度を向上させることができます。

// svelte.config.js
import adapter from '@sveltejs/adapter-node';
import preprocess from 'svelte-preprocess';

export default {
  preprocess: preprocess(),
  kit: {
    adapter: adapter(),
    target: '#svelte',
    ssr: {
      noExternal: ['some-large-dependency']
    }
  }
};

まとめ

SvelteKitアプリのビルド速度を向上させるためには、依存関係の最適化、キャッシュの利用、コードスプリッティング、開発サーバーの設定、プラグインの最適化、HMRの設定、依存関係のアップデート、Esbuildの利用、ファイルの監視設定、モジュールの分割、SSRの設定など、さまざまな方法があります。これらの対策を組み合わせることで、ビルド速度を大幅に改善することができます。

KATO-Hiro commented 3 weeks ago

SvelteKitアプリでViteを利用している場合に、画面のリロードが遅くなる一般的な原因と対策。

原因と対策

  1. 大量のコンポーネント

    • コンポーネントが多いと、ビルドやホットリロードの際に処理が遅くなることがあります。
  2. 依存関係の多さ

    • 多くの依存関係があると、ビルド時間が長くなることがあります。
  3. Viteの設定

    • Viteの設定が最適化されていない場合、ビルドやリロードが遅くなることがあります。

高速化のための方法

  1. Viteのキャッシュを有効にする

    • Viteはデフォルトでキャッシュを利用しますが、設定を確認してキャッシュが有効になっていることを確認します。
  2. 依存関係の最適化

    • 不要な依存関係を削除し、必要な依存関係のみをインストールします。
  3. Viteの設定を最適化する

    • vite.config.jsファイルを最適化します。以下に例を示します。
import { defineConfig } from 'vite';
import svelte from '@sveltejs/vite-plugin-svelte';

export default defineConfig({
  plugins: [svelte()],
  optimizeDeps: {
    include: ['some-large-dependency'],
    exclude: ['some-unnecessary-dependency']
  },
  build: {
    sourcemap: false, // ソースマップを無効にすることでビルド時間を短縮
    minify: 'esbuild', // esbuildを使用してビルドを高速化
    target: 'esnext' // 最新のJavaScript仕様をターゲットにする
  },
  server: {
    hmr: {
      overlay: false // HMRのオーバーレイを無効にする
    }
  }
});
  1. TypeScriptの設定を最適化する
    • tsconfig.jsonファイルを最適化します。以下に例を示します。
{
  "extends": "./.svelte-kit/tsconfig.json",
  "compilerOptions": {
    "allowJs": true,
    "checkJs": true,
    "esModuleInterop": true,
    "forceConsistentCasingInFileNames": true,
    "incremental": true,
    "isolatedModules": true,
    "moduleResolution": "bundler",
    "outDir": "build",
    "resolveJsonModule": true,
    "skipLibCheck": true,
    "sourceMap": false, // ソースマップを無効にする
    "strict": true
  },
  "include": ["src/**/*.d.ts", "src/*", "src/**/*.ts", "src/**/*.svelte"],
  "exclude": ["node_modules"]
}
  1. ホットモジュールリプレースメント(HMR)の最適化

    • HMRの設定を最適化することで、リロード時間を短縮できます。
  2. 依存関係のバンドル

    • 大きな依存関係を事前にバンドルすることで、ビルド時間を短縮できます。

まとめ

これらの対策を実施することで、SvelteKitアプリのビルドやリロード時間を短縮し、開発体験を向上させることができます。まずは、ViteとTypeScriptの設定を見直し、不要な依存関係を削除することから始めると良いでしょう。

KATO-Hiro commented 2 weeks ago

https://github.com/ankitects/anki/blob/main/ts/vite.config.ts