Why

随着团队项目规模越来越大之后,继从babel-loader迁移到esbuild之后发现打包、热重载性能随着时间迭代之后又慢慢开始成为性能瓶颈,所以决定用新的打包工具去解决这个问题。esbuild 自然成为了不二之选。

What esbuild 是什么

esbuild 是基于espack的一款打包工具,借助于rust的性能加成在前端应用打包领域取得了非比寻常的进步,以下是他相较于其他打包工具的对比:

Benchmark results from build-tools-performance.

相较于webpackespack 有以下几个特性:

  • rust的性能加持: Webpack的性能经常被其竞争对手挑战,特别是在大型项目中。Rspack使用Rust语言解决了这个问题,Rust语言专门设计来优先考虑性能,在速度和内存管理方面都在benchmarks的前列。Rust还提供了许多编译器保护措施,以避免其他原生语言(如c++)的常见陷阱。
  • 高度并行的架构: webpack 受限于 JavaScript 对多线程的羸弱支持,导致其很难进行高度的并行化计算,而得益于 Rust 语言的并行化的良好支持, Rspack 采用了高度并行化的架构,如模块图生成,代码生成等阶段,都是采用多线程并行执行,这使得其编译性能随着 CPU 核心数的增长而增长,充分挖掘 CPU 的多核优势。
  • 内置大部分的功能: 事实上 webpack 本身的性能足够高效,但是因为 webpack 本身内置了较少的功能,这使得我们在使用 webpack 做现代 Web App 开发时,通常需要配合很多的 plugin 和 loader 进行使用,而这些 loader 和 plugin 往往是性能的瓶颈,而 Rspack 虽然支持 loader 和 plugin,但是保证绝大部分常用功能都内置在 Rspack 内,从而减小 JS plugin | loader 导致的低性能和通信开销问题。
  • 增量编译: 尽管 Rspack 的全量编译足够高效,但是当项目庞大时,全量的编译仍然难以满足 HMR 的性能要求,因此在 HMR 阶段,我们采用的是更为高效的增量编译策略,从而保证,无论你的项目多大,其 HMR 的开销总是控制在合理范围内。

How 我们怎么做的

webpack项目迁移到rsbuild并不难, 甚至非常简单,我们是存量项目迁移 typescript less 是基础语言,因此通过以下几步我们就完成了关键迁移:

  • 如果直接一步步集成各种plugin跟构建工具,踩的坑肯定很多,所以我们是这么做的 先用npm create rsbuild@latest 创建了一个全新的项目
  • 然后把对应依赖的包跟rsbuild config 从上一个新项目复制到自己项目中
    • 一般是 rsbuild.config.ts
    • @rsbuild/core @rsbuild/plugin-react 这两核心包
  • 下载依赖,这一步要把自己项目内的css预处理语言对应的插件添加上我们项目是less因此添加了@rsbuild/plugin-less
  • 配置html
  • 配置代理
  • 兼容其他webpac配置
    • alias
    • define
    • entry等等

然后分享一个坑是某个文件less引用了一个图片 使用的是相对路径地址,结果导致打包工具解析不到正确的路径,从而在整个打包进程一直卡在某个地方卡着,也没错误提示,最后解决方法就是使用别名路径配置了地址,就解决了。

定位问题的时候,这个地方我们是用排除法去定位的,就是首先把引用的文件全注释掉,然后一一放开 发现哪个文件放开的时候 打包有问题就去排查这个文件,不断重复此过程就能定位到最终问题发生的文件。

最后放个大体配置文件, 注意不要直接复制

export default defineConfig({
html: {
template: './src/index.html',
inject: 'body',
templateParameters: {
removeConsole: true,
}
},
source: {
entry: {
index: './src/index.tsx',
},
define: { },
},
resolve: {
alias: {
'@': '/src',
},
},
output: {
copy: [{}],
cssModules: {},
},
dev: {
progressBar: true,
},
plugins: [
pluginReact({
fastRefresh: true,
}),
pluginLess({
lessLoaderOptions: {
lessOptions: {
javascriptEnabled: true,
},
},
}),
],
server: {
port: 3000,
proxy: {
[PROXY_URL]: {
target: `https://${headers.Host}`,
secure: false,
changeOrigin: true,
pathRewrite: {[`^${PROXY_URL}`]: ''},
headers,
}
},
},
tools: { },
});

嗯 大体就是这样了。完结。

React从webpack迁移到rsbuild 纪实的更多相关文章

  1. react+react-router+webpack+express+nodejs

    react+react-router+webpack+express+nodejs   做SinglePageApplication 支持热加载+ES6 有开发模式和发布模式 https://gith ...

  2. 入门React和Webpack

    最近在学习React.js,之前都是直接用最原生的方式去写React代码,发现组织起来特别麻烦,之前听人说用Webpack组织React组件得心应手,就花了点时间学习了一下,收获颇丰 说说React ...

  3. reactjs学习一(环境搭配react+es6+webpack热部署)

    reactjs学习一(环境搭配react+es6+webpack热部署) 本文的源码在这里下载 https://github.com/tianxiangbing/webpack-study   或者使 ...

  4. spring + spring mvc + mybatis + react + reflux + webpack Web工程例子

    前言 最近写了个Java Web工程demo,使用maven构建: 后端使用spring + spring mvc + mybatis: 前端使用react + react-router+ webpa ...

  5. 轻松入门React和Webpack

    最近在学习React.js,之前都是直接用最原生的方式去写React代码,发现组织起来特别麻烦,之前听人说用Webpack组织React组件得心应手,就花了点时间学习了一下,收获颇丰 <!-- ...

  6. 在React+Babel+Webpack环境中使用ESLint

    ESLint是js中目前比较流行的插件化的静态代码检测工具.通过使用它可以保证高质量的代码,尽量减少和提早发现一些错误.使用eslint可以在工程中保证一致的代码风格,特别是当工程变得越来越大.越来越 ...

  7. React+ES6+Webpack环境配置

    转自http://www.cnblogs.com/chenziyu-blog/p/5675086.html 参考http://www.tuicool.com/articles/BrAVv2y Reac ...

  8. React配合Webpack实现代码分割与异步加载

    这是Webpack+React系列配置过程记录的第四篇.其他内容请参考: 第一篇:使用webpack.babel.react.antdesign配置单页面应用开发环境 第二篇:使用react-rout ...

  9. React+ES6+Webpack深入浅出

    React已成为前端当下最热门的前端框架之一 , 其虚拟DOM和组件化开发让前端开发更富灵活性,而Webpack凭借它异步加载和可分离打包等优秀的特性,更为React的开发提供了便利.其优秀的特性不再 ...

  10. react+babel+webpack初试

    在上一篇,我们简单学习了webpack学习,现在这里我们简单学习一下react+babel+webpack,进行编译react语法jsx以及结合es6写法. 这里我就简单的直接上demo: packa ...

随机推荐

  1. 免费学习基于SpringBoot的高考志愿智能推荐系统

    免费学习基于SpringBoot的高考志愿智能推荐系统 摘要 科学技术日新月异,人们的生活都发生了翻天覆地的变化,高考志愿智能推荐系统管理当然也不例外.过去的信息管理都使用传统的方式实行,既花费了时间 ...

  2. Redis-十大数据类型

    Reids数据类型指的是value的类型,key都是字符串 redis-server:启动redis服务 redis-cli:进入redis交互式终端 常用的key的操作 redis的命令和参数不区分 ...

  3. WorldWind源码剖析系列:WorldWind瓦片调度策略说明

    1 基于源码的分析 首先我们来看WorldWind中摄像头变化相关的几个方法的内部逻辑. 1.1 NltTerrainAccessor. GetElevationAt 方法声明:public over ...

  4. 自动化测试工具-Katalon Studio

              Katalon 代码片段: 1)if(WebUI.verifyTextPresent(findTestObject('Page_Skin/p_Are you ok?'),10,Fa ...

  5. Solution Set -「NOIP Simu.」20221005

    \(\mathscr{A}\sim\)「CF 1252G」Performance Review   Link & Submission.   Tag:「水题无 tag」   记 \(A=a_1 ...

  6. Solution Set - IQ ↓↓

    Q: 为什么说雨兔是个傻子? A: 因为一路上全是星号标记.   呃, 本来的好像是 constructive || greedy, 但感觉最近整体题量不高, 就换成 2700-2900 了. 然后惊 ...

  7. 为了解决服务启动慢的问题,我为什么要给Apollo和Spring提交PR?

    最近在整理之前记录的工作笔记时,看到之前给团队内一组服务优化启动耗时记录的笔记,简单整理了一下分享出来.问题原因并不复杂,主要是如何精准测量和分析,优化后如何定量测量优化效果,说人话就是用实际数据证明 ...

  8. Java虚拟机调优-垃圾回收算法-工具

    背景: 垃圾回收的瓶颈 传统分代垃圾回收方式,已经在一定程度上把垃圾回收给应用带来的负担降到了最小,把应用的吞吐量推到了一个极限.但是他无法解决的一个问题,就是Full GC所带来的应用暂停.在一些对 ...

  9. 线上JVM性能优化详解

    概述 jvm中除了程序计数器,其他的区域都有可能会发生内存溢出 内存溢出是什么? 当程序需要申请内存的时候,由于没有足够的内存,此时就会抛出OutOfMemoryError,这就是内存溢出 内存溢出和 ...

  10. K_V键值存储对比

    memcached-键值存储 redis-键值存储 RocksDB-键值存储 KeyDB-键值存储 DynamoDB-键值存储 levelDB-键值存储 etcd-键值存储 Redis与其他数据库对比 ...