webpack + React项目中使用vite开发

最近在写一个体量很大的项目时发现编译过程特别慢长,为了提高一下开发体验同时学习一下vite,于是尝试在webpack + React的项目中使用vite起一个开发服务(vite的速度这里就不多说了,懂的都懂),搞了一下午终于成功了,废话不说,开整

如果你的项目中使用的typescript,那么你只需要四步就可以了:

一、安装依赖

yarn add -D vite @vitejs/plugin-react

二、添加配置文件

在项目根目录新增vite.config.js文件,并写入

import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
import { resolve } from 'path';
 
export default defineConfig({
  plugins: [react()],
  resolve: {
    alias: { // 配置别名
      '@': resolve('src'),
    },
  },
});

查看更多vite配置[1]

三、添加入口文件

把public中的index.html复制一份放在项目根目录,并写入

<div id="root"></div>
<script>
  window.process = {
    env: {
      REACT_APP_ENV: 'test'
    }
  }
</script>
<script type="module" src="/src/index.tsx"></script>

四、添加scripts命令

在package.json中添加dev命令

"scripts": {
    "dev""vite"
}

配置完上面四步,我的webpack + React + typescript项目已经可以通过 yarn dev 来使用vite启动开发服务了。

但是当我满怀信心的在另一个没有使用typescript的老项目中使用时,发现很多报错,咱们来一一解决:

报错一、不识别  jsx 语法

webpack + React项目中使用vite开发

这是因为vite默认只会对 .ts  .tsx  .jsx 文件进行jsx语法解析,所以如果项目中在js文件中写了jsx,vite就会报错

解决方案

看到这个错误的时候我下意识的想到把js文件改成jsx,但是看了看项目中几百个js文件我沉默了,一定有更好的解决方案,最后我在vite的issues中找到一个比较好的解决方法(原文[2]), 在 vite.config.js 中添加下面的配置让esbuild预编译时能够识别js文件中的jsx

optimizeDeps: {
    esbuildOptions: {
      plugins: [
        {
          name: 'load-js-files-as-jsx',
          setup(build) {
            build.onLoad({ filter: /src/.*.js$/ }, async args => ({
              loader: 'jsx',
              contents: await fs.readFile(args.path, 'utf8'),
            }));
          },
        },
      ],
    },
 },

但是我试了下我的项目中并不好使,最后搭配一个babel插件才解决了这个问题:@babel/plugin-transform-react-jsx

plugins: [
    react({
      babel: {
        plugins: ['@babel/plugin-transform-react-jsx'],
      },
    }),
],

报错二、postcss 8 版本问题

postcss版本冲突原因(vite中引用了postcss 8 版本)

webpack + React项目中使用vite开发

解决方案

在package.json中resolution中指定一下pastcss版本就好了

"resolutions": {
    "postcss""^8.4.6",
},

报错三:Inline JavaScript is not enabled

webpack + React项目中使用vite开发

解决方案

在vite.config.js中添加css配置

css: {
  preprocessorOptions: {
    less: {
      JavaScriptEnabled: true,
    },
  },
},

报错四:require is not defined

项目中使用了require,vite不支持

解决方案

1、安装 @originjs/vite-plugin-commonjs 插件

yarn add -D @originjs/vite-plugin-commonjs

2、vite.config.js 中使用插件

import { viteCommonjs } from '@originjs/vite-plugin-commonjs';
 
...

plugins: [
  react({
    babel: {
      plugins: ['@babel/plugin-transform-react-jsx'],
    },
  }),
  viteCommonjs(),
],

报错五:vite不支持  require.context 写法

// const files = require.context('./models', false, /.js$/);

解决方案

这里使用 import.meta.globEager() 代替 require.context

const files = import.meta.globEager('./models/*.js');

以上就是我今天在 webpack + react 项目中体验 vite 的全过程,有不足的地方欢迎评论区讨论,在线接受批评。

本文转自 https://juejin.cn/post/7078969057520648205,如有侵权,请联系删除。

参考资料

[1]

https://vitejs.cn/config/: https://link.juejin.cn/?target=https%3A%2F%2Fvitejs.cn%2Fconfig%2F

[2]

https://Github.com/vitejs/vite/discussions/3448: https://link.juejin.cn/?target=https%3A%2F%2Fgithub.com%2Fvitejs%2Fvite%2Fdiscussions%2F3448


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/20474.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!