js项目中jsx的使用
- js项目引入Vue 3 Babel JSX 插件
- 修改vite.config.js
import {
defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import vuejsx from "@vue/babel-plugin-jsx"
import path from "path"
// https://vitejs.dev/config/
export default defineConfig({
plugins: [vue(),vuejsx({
})],
resolve:{
alias:{
"@": `${
path.resolve(__dirname, './src')}`
}
},
esbuild: {
jsxFactory: 'h',
jsxFragment: 'Fragment',
jsxInject: "import { h } from 'vue';"
}
})
这样的话就不会出现React is not defined和h is not defined这两个错误。
- 下面是vite官方关于使用jsx的表述:
.jsx 和 .tsx 文件同样开箱即用。JSX 的转译同样是通过 esbuild,默认为 React 16 风格。期望在 esbuild
中支持 React 17 风格的 JSX 请看 这里。Vue 用户应使用官方提供的 @vitejs/plugin-vue-jsx 插件,它提供了 Vue 3 特性的支持,包括
HMR,全局组件解析,指令和插槽。如果不是在 React 或 Vue 中使用 JSX,自定义的 jsxFactory 和 jsxFragment 可以使用 esbuild
选项 进行配置。例如对 Preact:
关键问题就是在这里,我到底是不是vue用户?vue用户应该不需要再做其他的配置了,有点懵逼。
// vite.config.js
import {
defineConfig } from 'vite'
export default defineConfig({
esbuild: {
jsxFactory: 'h',
jsxFragment: 'Fragment'
}
})
更多细节详见 esbuild 文档.
你可以使用 jsxInject(这是一个仅在 Vite 中使用的选项)为 JSX 注入 helper,以避免手动导入:
// vite.config.js
import {
defineConfig } from 'vite'
export default defineConfig({
esbuild: {
jsxInject: `import React from 'react'`
}
})
- 支持的用法
就是必须导出,必须用defineComponent 这两点
import {
defineComponent } from 'vue'
// named exports w/ variable declaration: ok
export const Foo = defineComponent({
})
// named exports referencing variable declaration: ok
const Bar = defineComponent({
render() {
return <div>Test</div> }})
export {
Bar }
// default export call: ok
export default defineComponent({
render() {
return <div>Test</div> }})
// default export referencing variable declaration: ok
const Baz = defineComponent({
render() {
return <div>Test</div> }})
export default Baz
Non-supported patterns
// not using `defineComponent` call
export const Bar = {
... }
// not exported
const Foo = defineComponent(...)