reactjs 如何配置Vite以允许JS文件中的JSX语法?

wkyowqbh  于 2023-03-22  发布在  React
关注(0)|答案(2)|浏览(622)

默认情况下,Vite不允许在.js文件中使用JSX语法。
我已经将文件重命名为.jsx(或.tsx),但有一些外部依赖项无法重命名。
Vite的错误示例:

✘ [ERROR] The JSX syntax extension is not currently enabled

    node_modules/somelib/src/someFile.js:122:11:
      122 │     return <div/>

如何配置Vite以支持所有.js文件中的JSX表达式?

s6fujrry

s6fujrry1#

您可以使用loader选项更改esbuild配置,将所有js文件视为jsx:

// vite.config.ts
import {defineConfig} from 'vite'

// https://vitejs.dev/config/
export default defineConfig(() => ({
  esbuild: {
    loader: "jsx",
  },
  optimizeDeps: {
    esbuildOptions: {
      loader: {
        ".js": "jsx",
        ".ts": "tsx",
      },
    },
  },
}));

注意:使用.jsx加载器加载.js文件会降低性能。
答案取自Vite的GitHub中的讨论,它将不正确(和较旧)的答案标记为“正确”的答案。

3okqufwl

3okqufwl2#

我无法让this answer中的配置按原样工作。出于某种原因,我需要将includeexclude密钥添加到esbuild配置中。
基于Vite讨论板上的这条评论,我能够让这个配置文件同时适用于vite servevite build。(好吧,“工作”是指不再抱怨.js文件中的JSX。Vite仍然在抱怨一些CJS模块...)

// vite.config.js
import fs from "node:fs";
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
import * as esbuild from "esbuild";

const sourceJSPattern = /\/src\/.*\.js$/;
const rollupPlugin = (matchers) => ({
  name: "js-in-jsx",
  load(id) {
    if (matchers.some(matcher => matcher.test(id))) {
      const file = fs.readFileSync(id, { encoding: "utf-8" });
      return esbuild.transformSync(file, { loader: "jsx" });
    }
  }
});

export default defineConfig({
  plugins: [
    react()
  ],
  build: {
    rollupOptions: {
      plugins: [
        rollupPlugin([sourceJSPattern])
      ],
    },
    commonjsOptions: {
      transformMixedEsModules: true,
    },
  },
  optimizeDeps: {
    esbuildOptions: {
      loader: {
        ".js": "jsx",
      },
    },
  },
  esbuild: {
    loader: "jsx",
    include: [sourceJSPattern],
    exclude: [],
  },
});

相关问题