默认情况下,Vite不允许在.js文件中使用JSX语法。我已经将文件重命名为.jsx(或.tsx),但有一些外部依赖项无法重命名。Vite的错误示例:
.jsx
.tsx
✘ [ERROR] The JSX syntax extension is not currently enabled node_modules/somelib/src/someFile.js:122:11: 122 │ return <div/>
如何配置Vite以支持所有.js文件中的JSX表达式?
s6fujrry1#
您可以使用loader选项更改esbuild配置,将所有js文件视为jsx:
loader
// 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中的讨论,它将不正确(和较旧)的答案标记为“正确”的答案。
3okqufwl2#
我无法让this answer中的配置按原样工作。出于某种原因,我需要将include和exclude密钥添加到esbuild配置中。基于Vite讨论板上的这条评论,我能够让这个配置文件同时适用于vite serve和vite build。(好吧,“工作”是指不再抱怨.js文件中的JSX。Vite仍然在抱怨一些CJS模块...)
include
exclude
esbuild
vite serve
vite build
.js
// 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: [], }, });
2条答案
按热度按时间s6fujrry1#
您可以使用
loader
选项更改esbuild配置,将所有js文件视为jsx:注意:使用.jsx加载器加载.js文件会降低性能。
答案取自Vite的GitHub中的讨论,它将不正确(和较旧)的答案标记为“正确”的答案。
3okqufwl2#
我无法让this answer中的配置按原样工作。出于某种原因,我需要将
include
和exclude
密钥添加到esbuild
配置中。基于Vite讨论板上的这条评论,我能够让这个配置文件同时适用于
vite serve
和vite build
。(好吧,“工作”是指不再抱怨.js
文件中的JSX。Vite仍然在抱怨一些CJS模块...)