Viteでファイルをコピーする

8/21/2023

JavaScript

t f B! P L

ViteでChrome拡張機能開発時にdistディレクトリにファイルをコピーする必要があったので、方法をメモしておきます。

vite-plugin-static-copyのインストール

vite-plugin-static-copyをインストールします。

npm i -D vite-plugin-static-cop

もしくは

yarn add -D vite-plugin-static-copy

vite.config.ts(.js)の設定

vite.config.ts(.js)に以下の設定を追加します。

import { defineConfig } from "vite";
import { viteStaticCopy } from 'vite-plugin-static-copy'
import { resolve } from "path";

// ...他のコード
export default defineConfig({
  // ...他の設定
  plugins: [
    // ...他のプラグイン

    // 追加
    viteStaticCopy({
      targets: [
        // ここにコピー元とコピー先のパスを記述
        {
          src: "src/assets/example.txt",
          dest: "dist/assets",
        },
        // まとめてコピーする場合は以下のように記述
        {
          src: "src/assets/js/*",
          dest: "dist/assets",
        },
        // resolveを使って記述する場合は以下のように記述
        // Windowsでこれを使うと失敗(後述)
        {
          src: resolve(__dirname, "src/assets/example.txt"),
          dest: resolve(__dirname, "dist/assets"),
        },
      ],
    }),
  ],
  // ...他の設定
});

Windowsでresolveを使う場合

Windowsでresolveを使ってパスを記述すると[vite-plugin-static-copy] No items to copy.と表示されて上手くコピーされませんでした。

Windowsのパスの区切り文字が/ではなく\(\)であることが原因のようです。

そこで、normalizePathを使用して区切り文字を/に変更する必要があります。

import { defineConfig, normalizePath } from "vite"; // normalizePathを追加
// 略
targets: [
  {
    src: normalizePath(resolve(__dirname, "src/assets/example.txt")),
    dest: normalizePath(resolve(__dirname, "dist/assets")),
  },
]

これで上手くコピーされるようになります。