Skip to content

vitesse tsx 踩坑

Updated: at 01:22 AM

vitesse 是 antfu 整合的 Vue 框架,集成的模块都是最新的,赶紧尝试一下。 为了保证和 React 开发体验统一,这回就试试能不能用 tsx。 **目前还不能在 Vitesse 中使用 tsx,项目配置都是针对 template 的。tsx 建议使用 **vue-tsx-starter

一、让 vitesse 把 tsx 当作页面

由于 vitesse 是 File based routing,所以要让他把 tsx 识别为页面,这样加入到路由中才能访问得到

// 1、找到 vite.config.ts 中的
Pages({
	extensions: ['vue', 'md'],
}),

// 2、在数组里边加个 'tsx'
Pages({
	extensions: ['vue', 'md', 'tsx'],
}),

二、安装 vite 的 tsx 插件

vite 对于不同框架的解析都是用插件来实现的,vitesse 集成了 vue 插件,但是没有集成 jsx 插件。

// 1、在 package.json 文件中找到 plugin-vue 插件
"@vitejs/plugin-vue": "^2.0.1",

// 2、在这一行下边添加 plugin-vue-jsx 插件
"@vitejs/plugin-vue-jsx": "^1.3.3",

// 3、在项目根目录安装以来
终端执行 pnpm install

// 4、在 vite.config.ts 中引入刚才安装的插件
import vueJsx from '@vitejs/plugin-vue-jsx'

// 5、在 vite.config.ts 中找到这段代码
Vue({
	include: [/\.vue$/, /\.md$/],
}),

// 6、在这段代码的前边或者后边加上下边这一段,直接加一句 vueJsx(), 这个也可以,留着大括号是为了以后需要的时候写配置
vueJsx({
      // options are passed on to @vue/babel-plugin-jsx
}),

三、让 tsc 把 tsx 内容交给 babel 编译

// 在 tsconfig.json 的 compilerOptions 中加一句
"jsx": "preserve",

四、修改 eslint 让他不报 react 错误

// 将 .eslintrc 内容替换为如下内容
{
  "extends": "@antfu",
  "rules": {
    "react/display-name": "off",
    "react/react-in-jsx-scope": "off"
  }
}

五、写一个 tsx 组件试试

// import { defineComponent } from 'vue' // 理论上这一行不用写,如果你那里报找不到就放开注释
export default defineComponent({
  name: 'Mouse',
  setup() {
    const { x, y } = useMouse()
    return () => <div>mouse at {x.value},{y.value}</div>
  },
})

六、引用这个组件试试

// import { defineComponent } from 'vue' // 理论上这一行不用写,如果你那里报找不到就放开注释
import Mouse from './Mouse'
export default defineComponent({
  setup() {
    return () => <Mouse/>
  },
})

七、存在的问题

className 提示不存在 class 补全是 class={} class 自动转换成 className 继续报错 class 和 className 中的 windicss 代码补全丢失 react 命名空间不存在 (可以通过修改 eslint 配置禁用检测) display name XXX (可以通过修改 eslint 配置禁用检测) 无法使用 vitesse 的 layout 功能