reactwebpack老项目开发环境增加vite

news2024/12/25 23:49:33
  • 在开发环境下,vite的启动时间远远高于webpack,特别是首次启动,做到了真正的按需加载,开发体验好于webpack;
    • 目的:开发环境加入vite,生产环境不变
  • react项目切webpack(开发环境增加vite)
    • 例子项目简介:
      • 技术栈:react-17,ts,react脚手架(内置webpack@5.73.0,customize-cra
      • 实现了一个记录时间的插件out-put-time-plugin,下面的时间记录基于该插件,已发布在npm包上
      • 非首次启动平均时间4秒(存在cache情况下)
      • 热更新2444毫秒
      • 首次构建时间100886ms,有cache情况下再次构建时间54402ms
    • 引入vite后
      • 构建时间: 20.928s,相比首次提升80%,有cache提升61%(生产环境下没有添加,所以只做参考)
      • 启动时间555ms,相对于非首次启动时间提升87%
      • 热更新时间500ms,相对提高了79%
    • 转化步骤
      1. 安装vite-npm i vite
      2. 根目录下新建vite.config.ts
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
import path from 'path'
export default defineConfig({
  server: {
    port: 3001,
  },
    plugins: [react()],
      resolve: {
    // 路径相关配置项
    alias: [
      {
        find: '@',
        replacement: path.resolve(__dirname, 'src'),
      },
      {
        find: 'src',
        replacement: path.resolve(__dirname, 'src'),
      },
    ],
    extensions: ['.js', '.json', '.ts', '.tsx', '.jsx', '.less'],
  },
});
      1. 新建一个main.js文件,拷贝src里面的index.tsx的内容进去(不做也可以,引入的script标签src就为index.tsx)
      2. 拷贝public里面的index.html,放在最外层,文件中的%PUBLIC_URL%字段(公共URL路径)去掉, 加入<script type="module" src="src/index.tsx"></script>
        1. vite的入口文件index.html在最外层,并且index.html 中的 URL 将被自动转换,因此不再需要 %PUBLIC_URL% 占位符了(指向对应的public文件夹的绝对路径)
        2. 思考:可以实现一个方法,将public文件夹里面的文件拷贝并且经过处理后放置在目录最外层
import fs from 'fs'
import path from 'path'


function createHtml() {
    var htmlPath = path.resolve(__dirname, 'public');
    // 目录最外层
    var outPath = path.resolve(__dirname);
    var webpackHtml = path.join(htmlPath, 'index.html');
    var viteHtml = path.join(outPath, 'index.html');


    // exists弃用,existsSync不使用回调
    // 存在的话就返回
    if (fs.existsSync(viteHtml)) return


    if (fs.existsSync(webpackHtml)) {
        var content = fs.readFileSync(webpackHtml, 'utf-8');


        content = content.replace(/%PUBLIC_URL%/g, '');


        var bq = '<script type="module" src="src/index.tsx"></script>';
        var bodyIndex = content.lastIndexOf('</body>');
        content = content.slice(0, bodyIndex)+bq+content.slice(bodyIndex)


        fs.writeFileSync(viteHtml, content, 'utf-8');
        console.log(`${outPath}成功创建外层html`);
    } else {
        console.error(`${htmlPath}路径没有html`);
    }
}


export default createHtml
      1. package.json文件里面的script,加入启动vite脚手架命令(保留webpack命令)
      2. 这个时候启动的话,会报下图错误
        1. 主要原因是开发环境,vite使用esbuild对代码进行转化(符合es),react文件的后缀结尾可以为js,jsx,ts,tsx,这些文件可能都包含jsx语法。
        2. esbuild对jsx语法文件要求是后缀结尾的为jsx或者tsx,对于js,ts里面包含jsx语法的文件会报错。可增加其对应的后缀结尾
          1. 解决方法,在vue.config里面加入上图代码
        3. 环境变量设置
          1. 上图报错为环境两个两个脚手架暴露和访问环境变量的方式不同
          2. react脚手架中环境变量访问通过process.env,且环境变量必须以 REACT_APP_ 为前缀,vite里面则为import.meta.env,所以需要替换(开发环境为import.meta.env)
          3. vite默认抛出以前缀开头为 VITE_的环境变量,REACT_APP_开头的环境变量使用import.meta.env是取不到的
          4. 可以在vite.config.ts中,加入选项envPrefix,并且加入前缀'REACT_APP_'即可,这样就不用改变原来的声明的环境变量
          5. import.meta.env,ts类型检查会有报错,在tsconfig.json里面加入"types": ["vite/client"]、
          6. 思考:可实现一个方法,在转译代码的时候,替换该process.env,并且设置前缀
function vitePluginEnvTransform() {
  return {
    config: function () {
      return {
        //支持前缀REACT_APP_
        envPrefix: 'REACT_APP_'
    },
        // 对应webpack的loader,转译的时候将process.env转化为import.meta.env
    transform: function (code, id) {
      if (id.includes('node_modules')) return code;


      return code.replace(/process\.env\./g,'import.meta.env.');
    },
  };
}


export default vitePluginEnvTransform;

        1.  引入antd的css:无法识别~符号
          1. 解决方法:在vite.config里面配置对应路径
          2. 注意:vite不支持require语法
            1. 使用vite-plugin-require-transform插件
            2. import requireTransform from 'vite-plugin-require-transform'
            3. requireTransform({
            4. fileRegex: /src\/.*\.[tj]sx?$/,
            5. })
        2. 分支switchVite,脚手架vite和webpack并存
          1. 可以将vite.config.ts里面的配置写进vitePluginEnvTransform方法里面
          2. 然后将两个方法写进一个插件里面,这样实现了一个简单通用的react&webpack项目增加vite脚手架的插件react-webpack-to-vite-env
import { defineConfig, PluginOption } from 'vite';
import react from '@vitejs/plugin-react';
import requireTransform from 'vite-plugin-require-transform'


import {createHtml,vitePluginEnvTransform} from 'react-webpack-to-vite-env'
export default defineConfig({
    plugins: [createHtml(),react(), vitePluginEnvTransform() as PluginOption, requireTransform({
        fileRegex: /src\/.*\.[tj]sx?$/,
    }),],
    });

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2119122.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一篇文章教你如何设计权限控制系统——RBAC模型详解

原文链接&#xff0c;关注获取更多技术文章&#xff01; 在信息技术飞速发展的今天&#xff0c;数据安全和系统访问控制成为了保护企业资产的关键。基于角色的访问控制&#xff08;RBAC&#xff0c;Role-Based Access Control&#xff09;模型作为一种有效的权限管理策略&…

【C++ Primer Plus习题】14.1

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream> #include "wine.h" …

自适应中值滤波器:图像去噪的高效解决方案

在数字图像处理中&#xff0c;椒盐噪声是常见的干扰之一&#xff0c;它会导致图像出现随机的黑点和白点&#xff0c;严重影响图像质量。传统的中值滤波器虽然在一定程度上能够去除这种噪声&#xff0c;但可能无法完全恢复图像的细节。为此&#xff0c;本文将介绍一种自适应中值…

81.C语言中的内存分布

目录 一.内存分布 二.视频教程 一.内存分布 代码段&#xff1a;通常是指用来存放程序执行代码的一块内存区域。通常为只读。 只读数据段&#xff1a;如字符串&#xff0c;数字等。 初始化数据段:已初始化的全局变量&#xff0c;已初始化的静态变量。 未初始化数据段&#x…

心觉:做一件事很纠结,怎么办?

Hi&#xff0c;我是心觉&#xff0c;与你一起玩转潜意识、脑波音乐和吸引力法则&#xff0c;轻松掌控自己的人生&#xff01; 挑战每日一省写作164/1000天 专心做一件事情并不容易 因为这个世界物质太丰富了&#xff0c;可以选择的事情太多了 诱惑无处不在&#xff0c;定力…

C语言——在有序数组中插入一个新的元素,且数组的排列不变

在插入新元素时&#xff0c;数组需要多一个空间&#xff0c;所以在 malloc 时分配 len 1 的空间。 #include <stdio.h> #include <stdlib.h> void insert_arry(int *arr, int len,int target) { int index; for (int i 0; i < len; i) { …

论文风向变了!迁移学习+多模态融合才是王道!性能爆炸好

多模态如今是越来越火了&#xff0c;与之相关的研究方向在各大顶会基本都成了投稿热门&#xff0c;趁着这波风向&#xff0c;我也给想发论文但找不着idea的同学推荐一个创新思路&#xff1a;迁移学习多模态融合。 这种结合可以轻松搞定提高性能这一核心问题&#xff0c;通过将…

VulnHub DC-1-DC-7靶机WP

VulnHub DC系列靶机&#xff1a;https://vulnhub.com/series/dc,199/ # VulnHub DC-1 nmap开路获取信息 Nmap scan report for 192.168.106.133 Host is up (0.00017s latency). Not shown: 997 closed ports PORT STATE SERVICE 22/tcp open ssh 80/tcp open http 1…

python如何加速计算密集型任务?

问题描述&#xff1a; 在python中&#xff0c;有一个函数&#xff0c;其功能是进行某种计算&#xff0c;需要传入一些参数&#xff0c;计算完成后传回结果&#xff0c;调用其一次大概要1s的时间&#xff0c;现在需要通过for循环调用其350次&#xff0c;保存每次调用结果&#…

自动化测试面试题(含答案)

1、你会封装自动化测试框架吗&#xff1f; 自动化框架主要的核心框架就是分层PO模式&#xff1a;分别为&#xff1a;基础封装层BasePage&#xff0c;PO页面对象层&#xff0c;TestCase测试用例层。然后再加上日志处理模块&#xff0c;ini配置文件读取模块&#xff0c;unittest…

SprinBoot+Vue校园部门资料管理系统的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优质…

高反差保留DetailTransfer测评

inpainting中的生成链路优化. ComfyUI中IC-Light节点的Detail Transfer节点参数测试_iclight detailtransfer-CSDN博客文章浏览阅读1k次,点赞16次,收藏23次。ic-light是一个能重绘画面光影的节点,但是在重绘的过程中,难免会将图像本身的细节进行重绘,尤其是在电商的场景中…

Python自动化测试学习-PO设计模式

PO模式&#xff1a;Page Object&#xff0c;是一种页面对象设计模式&#xff0c;算是一种比较好的设计模式。在该设计模式中&#xff0c;功能类&#xff08;PageObjects&#xff09;所代表的是每个页面之间的逻辑关系。 PO设计模式 一、PO设计模式的优点 PO模式有以下优点&a…

【Python报错已解决】No Python at ‘C:Users…Python Python39python.exe’

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 前言一、问题描述1.1 报错示例1.2 报错分析1.3 解决思路 二、解决方法2.1 方法一&#xff1a;检查Python安装路径2.2 …

Linux网络编程---传输层

一、重谈端口号 1、在 TCP/IP 协议中 , 用 " 源 IP", " 源端口号 ", " 目的 IP", " 目的端口号 ", " 协议号 " 这样一个五元组来标识一个通信 ( 可以通过netstat -n查看 ); 2、端口号的划分 0 - 1023: 知名端口号 , HTTP…

树莓派通过串口驱动LD3320语音模块

树莓派通过串口驱动LD3320语音模块 文章目录 树莓派通过串口驱动LD3320语音模块一、LD3320语音模块的认知1.1 模块参数&#xff1a;1.2 模块结构介绍&#xff1a;1.3 模块的串口连接&#xff1a;1.4 验货测试方法&#xff1a;1.5 配套程序识别语句修改方法&#xff1a; 二、树莓…

MySQL数据库宕机,启动不起来,教你一招搞定!

作者介绍&#xff1a;老苏&#xff0c;10余年DBA工作运维经验&#xff0c;擅长Oracle、MySQL、PG、Mongodb数据库运维&#xff08;如安装迁移&#xff0c;性能优化、故障应急处理等&#xff09; 公众号&#xff1a;老苏畅谈运维 欢迎关注本人公众号&#xff0c;更多精彩与您分享…

Stream 流式编程

优质博文&#xff1a;IT-BLOG-CN 大家都知道可以将Collection类转化成流Stream进行操作&#xff08;Map并不能创建流&#xff09;&#xff0c;代码变得简约流畅。我们先看下流的几个特点&#xff1a; 1、流并不存储元素。这些元素可能存储在底层的集合中&#xff0c;或者是按需…

信号与槽,QMainWindow中常用类的使用

QMainWindow菜单栏和工具栏 菜单栏&#xff0c;工具栏&#xff0c;状态栏&#xff0c;中心部件&#xff0c;铆接部件&#xff08;浮动窗口&#xff09; 菜单栏 //创建菜单栏QMenuBar *bar menuBar();//指定父组件this->setMenuBar(bar);this->resize(600,400);this-&g…

老师发布月考成绩的必备小程序

随着新学期的到来&#xff0c;教师们面临着诸多挑战&#xff0c;从课程规划到班级管理&#xff0c;再到学生的个别指导&#xff0c;每一项任务都至关重要。是否有工具能够帮助教师们在这些繁忙的事务中找到一丝轻松呢&#xff1f; “易查分”小程序正是为了解决这一问题而设计…