使用rspack 替换webpack加速vue3项目构建

rspack简介

rspack是字节跳动团队出的前端构建工具,使用rust编写。

在我看来,它是对webpack Api规范的rust实现与优化。

特点:速度快,易于从webpack迁移。

官网:Rspack

rspack在0.2版本,兼容了vue-loader 

旧项目packages(主要)

  • webpack@5.88.2
  • webpack-cli@5.1.4
  • @swc/core@1.3.62
  • swc-loader@0.2.3
  • swc-plugin-vue-jsx@0.2.5
  • @core-js@3.31.0
  • esbuild@0.18.10
  • esbuild-loader@3.0.1
  • html-webpack-plugin@5.5.0
  • less@4.1.3
  • less-loader@11.1.0
  • mini-css-extract-plugin@2.7.5
  • terser-webpack-plugin@5.3.7
  • vue3-styled-components

旧项目框架介绍

整个项目使用webpack5 + vue3 + tsx构建,不采用vue SFC 单文件。

swc替换babel

swc-plugin-vue-jsx 使其可以正常转换vue3 代码。

得益于swc的构建速度,因此在这套框架下,使得项目的构建时间大大降低。

尝试使用rspack替换webpack以进一步提升构建速度。

调研

rspack.config.js 配置和webpack.config.js 很相似。这更便于从webpack迁移。

读过rspack官网文档,和官网中提供的vue-demo 

我很快旧能够搭建起rspack 的平台。

新增依赖

  • @rspack/cli@0.2.10
  • @rspack/plugin-html@0.2.10

rspack.config.js

仅列出重要的

const HtmlRspackPlugin = require('@rspack/plugin-html');
module.exports = {context: __dirname,entry: {...},devtools: 'source-map',devServer: {...},builtins: {define: {NODE_ENV: process.NODE_ENV,__VUE_OPTIONS_API__: 'true',__VUE_PROD_DEVTOOLS__:'false'}},resolve: {...},externals: {...},module: {rules: [{// swc-loader},{test: /\.css$/,type: 'css',},{test: /\.less$/,use: [{ loader: 'style-loader' },{ loader: 'css-loader' },{loader: 'less-loader',options: {lessOptions: {javascriptEnabled: true}},}]}]},plugins: [new HtmlRspackPlugin({template:'./index.html',templateParameters: {NODE_ENV: process.env.NODE_ENV}})]
}

踩坑过程

vue-loader

这里面,虽然官方支持vue-loader,但由于我项目中并不采用.vue SFC 文件,因此没有引入。

vue jsx

官方对于vue jsx 的方案使使用babel-loader 配合@vue/babel-plugin-jsx 进行转换。因为我觉得swc比babel要快,所以直接使用了swc来替换babel。而且swc-loader似乎也兼容,就用了。

虽然rspack 基于swc来转换js代码,但是并未提供swc的配置途径,所以复用不了rspack中内置的swc模块。所以只能外挂一个swc-loader,才能使用swc的插件(swc-plugin-vue-jsx)来对代码进行转换。

html-webpack-plugin

关于html-webpack-plugin,虽然官方提供了builtins.html 配置来取代该插件。但本项目中index.html 模板中使用了 <%if (){%>, <%=xx%> 这样的模板语法, 导致运行报错。所以使用了@rspack/plugin-html 来取代html-webpack-plugin

css less

关于样式,本项目使用了less预处理器。可以看到我在less-loader上面还加了css-loader。这和官网文档建议的不一样了,官发说加了type: 'css'后就可以舍弃css-loader,style-loader, MiniCssExtractPlugin.loader 这几个。但是我的项目中,有在.less文件中@import './xxx.css' 的文件,这会导致无法识别而报错。因此加上css-loader解决。

结果

webpack + swc-loader 构建耗时18471ms

rspack + swc-loader 构建耗时 12926ms

速度提升约 30%

猜测速度的提升主要从解析依赖树,生成sourcemap达到。

这只是一个尝试,不敢轻易上生产,仍需多观察。

相关内容

  1. Webpack + swc + esbuild 优化构建速度尝试_webpack swc_JA+的博客-CSDN博客
  2. 使用swc 替换ts-loader 加速构建webpack-vue-tsx项目_swc-loader_JA+的博客-CSDN博客

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

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

相关文章

ChatGPT及其工作原理;OpenAI申请注册商标GPT-5,引发关注

&#x1f989; AI新闻 &#x1f680; OpenAI申请注册商标GPT-5&#xff0c;引发关注 摘要&#xff1a;OpenAI已在上月18日申请注册商标GPT-5&#xff0c;显示该模型将提供文本生成、自然语言理解、语音转录、翻译、分析等功能。此前OpenAI曾表示尚未开始训练GPT-4的后继者GPT…

transformer面试常考题

1.位置编码有哪些&#xff1f;有什么区别&#xff1f; nn.embedding和正余弦编码两种用的多。nn.embedding是一种基于学习的嵌入方法&#xff0c; 通过神经网络的训练过程&#xff0c; 会自动学习数据中每个符号的嵌入向量表示。 而正余弦编码是一种手工设计的嵌入方式&…

flask-session、数据库连接池

flask 自带session---》以cookie的形式放到了浏览器中---》加密 真正的session&#xff0c;是在服务端存储 -django中存在djangosession表中 -flask中&#xff0c;使用第三方&#xff0c;保存在---》redis中---》flask-session 使用步骤 pip install flask-session …

Django实现音乐网站 ⑸

使用Python Django框架制作一个音乐网站&#xff0c; 本篇主要是配置媒体资源设置。 目录 配置介绍 设置媒体资源 创建媒体资源目录 修改settings.py 注册媒体资源路由 总结 配置介绍 静态资源是指项目配置的js/css/image等系统常用文件。对于一些经常变动的资源&#x…

手机变电脑2023之虚拟电脑droidvm

手机这么大的内存&#xff0c;装个app来模拟linux&#xff0c;还是没问题的。 app 装好后&#xff0c;手指点几下确定按钮&#xff0c;等几分钟就能把linux桌面环境安装好。 不需要敲指令&#xff0c; 不需要对手机刷机&#xff0c; 不需要特殊权限&#xff0c; 不需要找驱…

【项目 计网1】4.1 网络结构模式 4.2MAC地址、IP地址、端口

文章目录 第四章 Linux网络编程4.1 网络结构模式C/S结构&#xff08;client-server&#xff09;B/S结构&#xff08;Browser/Server&#xff0c;浏览器/服务器模式&#xff09; 4.2 4.3MAC地址、IP地址、端口&#xff08;1&#xff09;&#xff08;2&#xff09;MAC地址IP地址(…

org.apache.hadoop.hive.ql.exec.DDLTask. show Locks LockManager not specified解决

Error while processing statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. show Locks LockManager not specified解决 当在Hive中执行show locks语句时&#xff0c;出现"LockManager not specified"错误通常是由于…

低代码平台的使用学习

背景 最近发现老婆每天都要捣鼓一个 excel 表格&#xff0c;并将表格发到群中&#xff0c;询问后才知道只是为了记录每天的事物变化。我想这接收方每次都要下载表格再打开看&#xff0c;太麻烦了&#xff0c;直接做个 web 表单&#xff0c;支持简单的增删改查就好了。 当我着…

第3集丨Vue 江湖 —— Vue中的事件

目录 一、Vue中事件使用二、事件修饰符2.1 prevent2.2 stop2.3 once2.4 capture2.5 self2.6 passive2.7 修饰符连续写2.8 整合案例 三、键盘事件3.1 Vue 中常用的按键别名3.2 key值绑定3.3 系统修饰符键3.4 keyCode绑定3.5 自定义别名3.6 组合键3.7 案例整合 一、Vue中事件使用…

面试题总结

文章目录 第一阶段:网络1、osi七层模型、tcp\ip 五层模型2、三次握手四次挥手3、交换机路由器工作原理4、vlan的作用5、icmp协议Linux1、cpu、内存、io、磁盘容量、网络流量、load average2、lvm逻辑卷如何创建3、raid磁盘阵列4、开机引导过程5、软连接硬链接6、查找文件命令7…

前端Vue入门-day07-Vuex入门

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 自定义创建项目 vuex概述 构建 vuex [多组件数据共享] 环境 创建一个空仓库 state 状态 1. 提供数据&…

【云原生】K8S超详细概述

目录 一、Kubernets概述1.1 K8S什么1.2为什么要用K8S 二、Kubernetes 集群架构与组件2.1Master组件Kube-apiserverKube-controller-managerKube-scheduler 2.2 配置存储中心etcd 2.3 Node 组件KubeletKube-Proxydocker 或 rocket 三、 Kubernetes 核心概念3.1Pod3.2Pod 控制器K…

【Rust 基础篇】Rust派生宏:自动实现trait的魔法

导言 Rust是一门现代的、安全的系统级编程语言&#xff0c;它提供了丰富的元编程特性&#xff0c;其中派生宏&#xff08;Derive Macros&#xff09;是其中之一。派生宏允许开发者自定义类型上的trait实现&#xff0c;从而在编译期间自动实现trait。在本篇博客中&#xff0c;我…

python 变量赋值 修改之后 原值改变

ython 是一种动态语言&#xff0c;因此变量的类型和值 在运行时均可改变。当我们将一个变量赋值给另一个变量时&#xff0c;实际上是将变量的引用地址传递给新的变量&#xff0c;这意 味着新旧变量将指向同一个位置。因此&#xff0c;在更改其中一个变量的值时&#xff0c;另一…

SpringBoot项目-个人博客系统的实现【下】

10.实现强制要求登陆 当用户访问 博客列表页和 博客详情页时, 如果用户当前尚未登陆, 就自动跳转到登陆页面 1.添加拦截器 public class LoginInterceptor implements HandlerInterceptor {Overridepublic boolean preHandle(HttpServletRequest request, HttpServletRespon…

解决Linux下PyCharm无法新建文件

一、问题描述 如图&#xff0c;在Ubuntu Linux系统中使用pycharm管理项目时&#xff0c;提示无法新建.py源文件&#xff1a; 二、问题解决 将问题定性为文件夹&#xff08;目录&#xff09;权限问题&#xff0c;在终端中打开项目文件夹的上级目录&#xff0c;将整个项目目录的…

全志F1C200S嵌入式驱动开发(应用程序开发)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 我们在开发soc驱动的时候,很多情况下也要验证下当前的驱动功能是否正确。当然除了验证驱动功能之外,我们还要编写业务代码和流程代码。这中间就和各行各业有关了,有的是算法,有…

网络安全学习笔记——SQL常用函数

联合注入常用函数 version()&#xff1a; 查询数据库的版本user()&#xff1a;查询数据库的使用者database()&#xff1a;数据库system_user()&#xff1a;系统用户名session_user()&#xff1a;连接数据库的用户名current_user&#xff1a;当前用户名datadir&#xff1a;读取…

你还不快来学习怎么翻译视频中的英语吗

年轻人纪逸是一个对世界充满好奇心的视频爱好者。每当他看到令人激动的视频时&#xff0c;总是忍不住想要将它与更多人分享。然而&#xff0c;有一天&#xff0c;他遇到了一个困扰&#xff1a;他发现了一段精彩的外语视频&#xff0c;但自己并不懂那种语言&#xff01;他犯了愁…