解决Vite-React项目中.js使用jsx语法报错的问题

简介: 解决Vite-React项目中.js使用jsx语法报错的问题

背景


在做存量项目接入Vite测试时发现,存量(老)项目中很多是直接在js中书写jsx语法,使用Vite启动时就会抛出一堆问题Failed to parse source


不嫌麻烦可以跑个脚本批量修改文件类型,这是一个解决办法


为了刨根知底,同时为了存量项目最低成本的接入Vite使用,尽力避免修改业务代码。得寻找其它办法解决一下。


报错截图如下


网络异常,图片无法展示
|


复现问题


初始化demo项目


# npm 6.x
npm init vite@latest my-react-app --template react-ts
# npm 7+, extra double-dash is needed:
npm init vite@latest my-react-app -- --template react-ts
# yarn
yarn create vite my-react-app --template react-ts


目录如下


├── index.html
├── package.json
├── src
|  ├── App.css
|  ├── App.tsx
|  ├── favicon.svg
|  ├── index.css
|  ├── logo.svg
|  ├── main.tsx
|  └── vite-env.d.ts
├── tsconfig.json
└── vite.config.ts


启动


npm run


网络异常,图片无法展示
|


页面正常,接下来将App.tsx修改为App.js

将会得到上述的报错


网络异常,图片无法展示
|


原因


  1. Vite在启动时会做依赖的预构建
  2. 预构建运行时默认都只会对jsxtsx做语法转换。不会对js做jsx的语法转换。


网络异常,图片无法展示
|


解决方案


  1. 修改依赖预构建的配置
  2. 使用babel插件@babel/plugin-transform-react-jsx,让Vite在运行时对js文件转换


网络异常,图片无法展示
|


按照文档描述在配置文件添加一点配置


export default defineConfig({
  build:{
    rollupOptions:{
      input:[]
    }
  },
  optimizeDeps: {
    entries: [],
  },
})


通过阅读@vite/plugin-react文档,发现其支持传入babel插件


npm i @babel/plugin-transform-react-jsx


添加插件


import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
// https://vitejs.dev/config/
export default defineConfig({
  plugins: [react({
      babel: {
        plugins: ['@babel/plugin-transform-react-jsx'],
      },
  })],
})


再次启动验证,发现一个报错


网络异常,图片无法展示
|


原因是没有在App.js中引入React,咱们引入一下


import React,{ useState } from 'react'


大功告成


网络异常,图片无法展示
|


总结


两种处理方案


  1. 文件后缀 js => jsx
  2. 修改依赖预构建配置,再添加babel插件@babel/plugin-transform-react-jsx


第二种方法会一定程度影响项目的启动速度。读者可以根据实际项目情况pick方案


最后


欢迎大家在评论区共享/交流在开发过程中接入Vite时遇到的一些问题与总结的经验


相关文章
|
3天前
|
缓存 前端开发 JavaScript
React和Next.js开发常见的HTTP请求方法
React和Next.js开发常见的HTTP请求方法
6 0
|
3天前
|
JavaScript
js中如何使用工厂方式和构造函数创建对象,web开发项目实例
js中如何使用工厂方式和构造函数创建对象,web开发项目实例
|
4天前
countup.js包实现数字滚动-大屏项目
countup.js包实现数字滚动-大屏项目
7 1
|
4天前
|
JavaScript 前端开发
vue3中使用jsx报错React is not defined和h is not defined
vue3中使用jsx报错React is not defined和h is not defined
|
5天前
|
XML JavaScript 前端开发
【JavaScript】实战训练小项目-WebAPI
【JavaScript】实战训练小项目-WebAPI
11 1
|
5天前
|
JavaScript 开发工具 git
Three.js第1篇,Three.js新手教学,如何在项目中使用Three.js(three.js使用流程详细,three.js的使用方式,three.js创建3d物体)
Three.js封装了WebGL的底层细节,是一款运行在浏览器中的 3D 引擎,可以用它创建各种三维场景,包括了摄影机、光影、材质等各种对象,目前在Git上已经拥有90k+的star。
30 0
Three.js第1篇,Three.js新手教学,如何在项目中使用Three.js(three.js使用流程详细,three.js的使用方式,three.js创建3d物体)
|
5天前
|
前端开发 网络架构 UED
React Next.js框架
React Next.js 是一个基于 React 的服务器渲染框架,用于构建高性能的现代Web应用。它提供内置的服务器渲染、静态导出、动态路由功能,并自动进行代码拆分。Next.js 还支持热模块替换、CSS-in-JS 和客户端路由,拥有丰富的插件生态系统,简化了开发过程,提升了应用的性能和用户体验。
|
5天前
|
移动开发 资源调度 前端开发
nbcio-vue下载安装后运行报错,diagram-js没有安装
nbcio-vue下载安装后运行报错,diagram-js没有安装
10 0
|
5天前
|
XML 前端开发 JavaScript
react中JSX的详解
react中JSX的详解
16 2
|
5天前
|
监控 JavaScript 前端开发
【JavaScript与TypeScript技术专栏】TypeScript在JavaScript项目中的渐进式采用
【4月更文挑战第30天】TypeScript是JavaScript的超集,引入静态类型、接口等特性,提升代码安全性和可读性。在JavaScript项目中采用TypeScript可享受类型安全、社区支持及优秀工具集成等优势。渐进式采用策略包括评估项目现状、逐步引入新旧模块、编写类型定义文件、配置编译选项和编写测试用例,以提高项目质量和效率。