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. Qt编写地图综合应用2-迁徙图

    一.前言 在很多web系统中,尤其是大屏系统中,经常可以看到类似于飞机迁徙图的效果,这个在echart中也是最常用的一个效果,迁徙图既可以是一个飞机也可以是其他形状,然后有一条动态的移动轨迹来表示流向 ...

  2. 即时通讯技术文集(第10期):IM通信协议该选TCP还是UDP [共12篇]

    为了更好地分类阅读52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第10 期. [-1-] 简述传输层协议TCP和UDP的区别 [链接] http://www.52 ...

  3. [LC593]有效的正方形-Valid Square

    题目描述 给定2D空间中四个点的坐标 p1, p2, p3 和 p4,如果这四个点构成一个正方形,则返回 true . 点的坐标 pi 表示为 [xi, yi] .输入 不是 按任何顺序给出的. 一个 ...

  4. C# WinForm 托盘程序

    实现步骤 创建 NotifyIcon 控件并设置属性: 编写 NotifyIcon 响应控制事件: 在主窗体的Load事件中将 NotifyIcon 添加到系统托盘: 程序退出时,移除系统托盘的 No ...

  5. c# 创建快捷方式并添加到开始菜单程序目录

    Using the Windows Script Host (make sure to add a reference to the Windows Script Host Object Model, ...

  6. 第一二章(Nginx+Lua)开发环境

    第一章 安装OpenResty(Nginx+Lua)开发环境 首先我们选择使用OpenResty,其是由Nginx核心加很多第三方模块组成,其最大的亮点是默认集成了Lua开发环境,使得Nginx可以作 ...

  7. Chrony:让你的服务器时间精准到微秒级的神器!

    在现代计算机系统中,时间同步是至关重要的.无论是分布式系统.数据库集群,还是日志记录,时间不一致都可能导致严重的问题.而 Chrony,作为一款高性能的时间同步工具,正在成为越来越多系统管理员的首选. ...

  8. Oracle 遍历游标的四种方式汇总(for、fetch、while、BULK COLLECT)

    本文原创:https://www.cnblogs.com/Marydon20170307/p/12869692.html 感谢博主分享 注意:原文中方式四FORALL处有语法错误,应该使用FOR. 1 ...

  9. 如何安全发布 CompletableFuture ?Java9新增方法分析

    如何安全发布 CompletableFuture ?Java9新增方法分析 本文未经允许禁止转载. JDK9 中对于CompletableFuture做了新的增强,除了超时功能(orTimeout), ...

  10. Kali 修改root密码

    Kali 修改root密码 进入 Kali 系统,切换 root 用户 sudo su 输入当前用户密码 成功切换到 root 用户后,进行修改密码 passwd root