Closed3

react-csvをvite環境で使うときのメモ

Hi MORISHIGEHi MORISHIGE

Reactでcsvを書き出したいときに利用するライブラリreact-csvを利用していたcra環境をvite環境へ移行した際に手間取ったのでメモ。

下記issueでやり取りされていたようでPRも上がったがCIが通らないという理由でクローズされたまま放置となっている模様。

https://github.com/react-csv/react-csv/issues/268

Hi MORISHIGEHi MORISHIGE

viteでビルドすると下記エラーが出る。

yarn dev

> hoge@1.0.0 dev
> vite

Pre-bundling dependencies:
  react
  react-dom
  @sentry/react
  @sentry/tracing
  axios
  (...and 32 more)
(this will be run only when your dependencies or config have changed)
 > node_modules/react-csv/src/components/Link.js:110:6: error: Unexpected "<"
    110<a
        ╵       ^
Hi MORISHIGEHi MORISHIGE

viteの仕様上.jsファイルに書かれたjsxを処理しないことに起因している模様。
(react-csvもTypeScript化はされていないので。。)
issueの中で提案されている下記プラグインを追記することで利用が可能となった。

vite.config.ts
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
import path from 'path';

// https://vitejs.dev/config/
export default defineConfig(({ command }) => {
  return { plugins: [react(), fixReactCsvPlugin(command)], server: {} };
});

function fixReactCsvPlugin(command) {
  const esbuildPlugin = {
    name: 'esbuild:resolve-fixes',
    setup: (build) => {
      build.onResolve({ filter: /react-csv$/ }, (args) => {
        return Promise.resolve({
          path: path.join(process.cwd(), './node_modules/react-csv/index.js'),
        });
      });
    },
  };

  return {
    name: 'resolve-fixes',
    config() {
      // only use the esbuild plugin during dev ("serve" command)
      if (command === 'serve') {
        return {
          optimizeDeps: {
            // development fixes
            esbuildOptions: {
              plugins: [esbuildPlugin],
            },
          },
        };
      }

      // build
      return {
        resolve: {
          // production fixes
          alias: [
            {
              find: 'react-csv',
              replacement: './node_modules/react-csv/index.js',
            },
          ],
        },
      };
    },
  };
}
このスクラップは2022/03/10にクローズされました