Rspack 学习了解

news2024/11/24 9:58:02

image.png

一、简介

  • Rspack GitHub 仓库、Rspack Quick start。

  • Rspack 是由字节 ByteDance Web Infra 团队基于 Rust 语言开发的 Web 高性能构建工具。

  • Rust 是种高效、可靠的通用高级语言。其高效不仅限于开发效率,执行效率也是令人称赞的,属于少有兼顾开发效率和执行效率的语言。

  • Rspack 目前支持 ReactVueSvelteSolidNestJS, Angular 初步支持,还缺失很多能力,其他还包括 StorybookModern.jsModern.js Doc 等。

二、特点

  • 优点

    • 启动速度:基于 Rust 实现,构建速度极快。

    • HMR(热更新):内置增量编译机制,HMR 速度极快,完全胜任大型项目的开发。

    • 兼容 webpack 生态:针对 webpack 的架构和生态进行兼容,无需从头搭建生态。

    • 内置常见构建能力:对 TypeScriptJSXCSSCSS ModulesSass 等提供开箱即用的支持。

    • 默认生产优化:默认内置多种优化策略,如 Tree Shaking代码压缩 等等。

    • Build 性能:取得了 5~10 倍编译性能的提升。

  • 缺点

    • Loader 支持有限, Plugin 目前主要靠内置,高级点的使用都比较麻烦或者支持有限,内置后配置都比较简单。

    • 更适合庞大的项目,这样运行速度、Build 速度都能保持在 webpack5-10 倍,对中小项目提升有限。

    • 只支持 nodejs 14 以上的项目迁移。

三、性能对比

  • 工具对比

    image.png

  • 字节内部项目迁移后的收益

    image.png

四、架构设计

  • 主要围绕 4 方面,附架构图

    image.png

    • 核心架构脱胎于 Wabpack5

      因为 Wabpack 历经了多年的考验,它整体架构稳定性是非常高的。

    • 基于 Native 语言的高并发框架

      Rust 本身是一门 Native 语言,相比 JS 这种动态语言可以做非常高的优化,性能瓶颈更高,虽然 JS 语言在 V8 的一些优化上已经不错了,但是它的短板来自于对多线程的支持,且在实现多线程后所带来的收益远低于 Rust

    • 基于 RustBabel 代替品 SWC

      Webpack 大部分的生态都是基于 LoaderPlugin 扩展的,主要点在 Loader,传统的工具都是用 Babel Loader 去做的,但 Babel Loader 是比较慢的,所以 Rust 使用了 SWC 来代替,SWC 相比 Babel 带来的性能提升做了比较高的贡献,所以在开发 Rspack 时可以避免掉 Babel Loader 的使用。

    • 基于 NAPI-RSRustJS 的高效通信

      核心用 Rust 写的,但是插件扩展是 JS写的,一方面有些开发者还得学习 Rust 才能做插件开发,上手成本比较高,另一方面是 JS 本身有个动态化特性,能直接在用户侧去编写并被加载执行,由于 Rust 是一门 Native 语言,做动态化是远不如 JS 的,即使使用 Rust 开发了一个插件,编译后的产物也是一个 Native CodeNative Code操作系统CPU 等是强相关的,比如在 Windows 上编译出来的插件在 Mac 上是跑不起来的,如果想做这种 Native 插件的动态分发或加载是比较困难的,需要熟悉整套跨平台编程的知识,每一个插件可能需要编译出来很多个平台的产物,然后再分发到不同平台上去,这个门槛比较高且稳定性也不容易控制。

五、迁移原则

  • 一条原则,优先使用内置能力,这样能保证性能最优化,比如不要使用 Babel Loader 相关的能力,常用的 Babel 能基本已经内置,如果一定需要使用,也需要将影响控制在很小范围内,如果大规模使用可能 Rspack 的性能就会下降比较明显。

  • css 相关,webpack 一般是使用 style-loader、css-loader 做处理,但是 Rspack 使用 SWC 实现了 experiments.css,默认开启,所以建议使用内置 css 能力,而不是去使用这些 Loader

  • 资源模块推荐使用 Asset Modules 做处理,webpack5 也使用 Asset Modules 替换了之前的 file-loader、url-loader、raw-loader 等。

  • html 生成也是内置了 Rust 版本的插件,但是功能可能会稍微弱一些,如果在 html 层面有比较高的定制需求,可以使用 @rspack/plugin-html,这是一个 JS 版本的,性能会比 Rust 版本慢一点,但是扩展更高。

QA

  • ViteRspack 哪个更好?

    这个需要看场景,中小场景 Vite 开发体验与生态是更好的,比如有一些 SSR 的支持,Rspack 目前更适合重型应用(例如公司内部 庞大的B端应用),能编译提速 5-10 倍。

  • 现阶段是否建议迁移 Rspack

    这个需要看是否使用到了一些高级功能或者插件,现阶段可能还不支持,需要查看支持情况,讲人话就是没有对 webpack 进行比较深的定制或骚操作的话,应该问题不大,可以进行尝试。

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

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

相关文章

vulnhub打靶--buli_b0x

目录 vulnhub--buli_b0x1.下载靶机2.导入靶机,开启靶机,nmap扫描3.探测目录,发现敏感目录4.通过test.php下载源码5.代码审计6.提权7.总结 vulnhub–buli_b0x 1.下载靶机 Billu_b0x.zip 2.导入靶机,开启靶机,nmap扫描…

分布式 RPC 框架HSF

分布式 RPC 框架HSF 概述HSF架构调用方式优势应用场景 概述 HSF (High-speed Service Framework),高速服务框架,是在阿里巴巴内部广泛使用的分布式 RPC 服务框架。HSF 作为阿里巴巴的基础中间件,联通不同的业务系统,解耦系统间的…

WebSocket笔记

1. websocket介绍 WebSocket 是基于 TCP 的一种新的网络协议。它实现了浏览器与服务器全双工通信——浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接, 并进行双向数据传输。 HTTP协议和WebSocket协议对比: HTTP是短连接W…

iOS--动静态库

文章目录 认识动静态库静态库动态库静态的打包静态库的使用动态库的打包动态库的使用 动静态库的本质就是可执行程序的"半成品"。 需要完成一个可执行程序需要经历以下四个步骤: 预处理:完成头文件的展开,去掉注释,宏替换,条件编译…

微信小程序学习笔记(五)——优化

下拉刷新后主动关闭 Page({onPullDownRefresh: function() {// ...wx.stopPullDownRefresh()} })在发起请求时设置 loading,请求结束后关闭 Page({onLoad: function(options) {wx.showLoading({title: 数据加载中...}) // 展示 loadingwx.request({// ...complete: …

leetcode每日一练-第206题-反转链表

一、思路 迭代 二、解题方法 以输入为 1 -> 2 -> 3 -> 4 -> 5 的链表为例 三、code class Solution { public:ListNode* reverseList(ListNode* head) {ListNode* prevnullptr;//反转后的链表ListNode* currhead;//当前更新的原有链表while(curr)//原有链表无值…

【大模型】更强的 LLaMA2 来了,开源可商用、与 ChatGPT 齐平

【大模型】可商用且更强的 LLaMA2 来了 LLaMA2 简介论文GitHubhuggingface模型列表训练数据训练信息模型信息 许可证参考 LLaMA2 简介 2023年7月19日:Meta 发布开源可商用模型 Llama 2。 Llama 2是一个预训练和微调的生成文本模型的集合,其规模从70亿到…

中间件安全-CVE漏洞复现-Weblogic+JBoss+GlassFish

服务攻防测试流程: 使用vulfocus靶场: 案例演示:中间件-Weblogic-工具梭哈 探针默认端口:7001,Weblogic是Oracle公司推出的J2EE应用服务器 使用vulfocus靶场复现漏洞 漏洞:weblogic-cve_2020_14883 启动环…

自然语言处理:赋予AI理解和交流的能力

文章目录 🍀引言🍀NLP的定义与重要性🍀NLP的应用领域🍀学好自然语言处理需要掌握以下知识🍀GPT和自然语言处理🍀总结 🍀引言 自然语言处理(Natural Language Processing,…

Visual Studio创建Web项目时候报错- 找不到“2.0.1“版本的程序包”解决方法

问题描述 在今天我开始想做一个ASP.Net Web 项目时,在创建项目的时候突然报下面这个错,也是试了很多方法,比如卸载重新安装,安装更高版本,我之前用的是2019版本,后面下载了2022的,又出现了新的…

python与深度学习(三):ANN和fashion_mnist

目录 1. 说明2. fashion_mnist实战2.1 导入相关库2.2 加载数据2.3 数据预处理2.4 数据处理2.5 构建网络模型2.6 模型编译2.7 模型训练2.8 模型保存2.9 模型评价2.10 模型测试2.11 模型训练结果的可视化 3. fashion_mnist的ANN模型可视化结果图4. 完整代码 1. 说明 本篇文章是A…

(202307)wonderful-sql:环境搭建(ubuntu 22.04 + mysql 8.0 + workbench/dbeavar,免密码-不建议免哈)

前言 能够再次参加datawhale组织的开源学习是十分兴奋的,看到datawhale能够越办越好我也是由衷地感到高兴。 这次参加的是mysql的学习,我知道这样短期的学习不会对我的能力造成多么大的提升,但是相信经过这次学习,我又将被datawh…

Kubernetes中Pod的扩缩容介绍

Kubernetes中Pod的扩缩容介绍 在实际生产系统中,我们经常会遇到某个服务需要扩容的场景,也可能会遇到由于资源紧张或者工作负载降低而需 要减少服务实例数量的场景。此时可以利用 Deployment/RC 的 Scale 机制来完成这些工作。 Kubernetes 对 Pod 的扩…

java代码审计1之环境搭建

文章目录 1、安装jdk2、配置tomcat3、配置maven3.1、配置环境变量3.2、配置源和maven配置文件 4、idea4.1、配置maven4.2、新建web项目4.3、遇到的问题(弹出404页面) 之前的文章, https://blog.csdn.net/weixin_43970718/article/details/121929434 https://blog.…

(全网最详细!)mysql、redis 、RabbitMQ只能本机访问,怎么改?

如果只能本机访问,怎么改? 一、mysql - 改my.ini 刷脚本 bind-address0.0.0.0 然后重启一下mysql服务 任务管理器-关掉mysql 搜索 计算机管理-重启mysql服务 然后 打开查询,并选择mysql数据,输入这个sql语句,点击运行 sele…

POC!VMWare RCE CVE-2023-20887

漏洞简介 VMWare Aria Operations for Networks (vRealize Network Insight) 在通过 Apache Thrift RPC 接口接受用户输入时容易受到命令注入的攻击。此漏洞允许远程未经身份验证的攻击者以 root 用户身份在底层操作系统上执行任意命令。RPC 接口受可以绕过的反向代理保护。VM…

vue3+vue-router4:报错Uncaught (in promise) Error: Invalid navigation guard

报错图示: Error: Invalid navigation guard Uncaught (in promise) Error: Invalid navigation guard 错误影响描述: 配置开发、测试、生产时候,因为是公众号,所以想在开发环境下免鉴权,不走微信获取openid接口&a…

PHP要怎么学--【思维导图知识范围】

强撸项目 总目录在此 专辑工作量PHP登陆/php登录–【强撸项目】难度★✫✰✰✰PHP注册/登录/发邮件–【强撸项目】★★★✫✰PHP在线相册–【强撸项目】★★★★✫–【强撸项目】––【强撸项目】––––– 文章目录 本系列校训学习资源的选择环境的问题本人推荐 PHP视频的知…

C语言-分支语句和循环

目录 【1】字符输入输出 【2】C语言下的垃圾字符回收 【3】分支语句 【4】循环 练习: 【1】字符输入输出 按字符的输入输出 int getchar(void); 功能:从终端输入一个字符 参数:无 返回值:输入字符的ASCII值int putchar(int…

pandas常用方法

一、提要 pandas对于处理表格类数据来说是非常方便的模块,同时也是做数据分析绕不开的第三方库。这里将工作中常用到的各种处理方法记录下来二、常用方法 接下来的以 df 表示我们要处理的 dataframe 表格数据 1、取值 # 循环遍历取值 for i in range(len(df)):y…