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

文章介绍了字节跳动团队开发的前端构建工具Rspack,它是基于rust的webpackAPI实现,具有速度快和迁移方便的特点。作者通过实验证明,使用rspack和swc-loader可以显著减少构建时间,约30%的速度提升主要归功于依赖树解析和sourcemap生成的优化。
摘要由CSDN通过智能技术生成

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: ['less-loader'],
                type: 'css',
                resolve: {
                    preferRelative: 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

rspack 0.5 版本已支持此插件。

css less

关于样式,本项目使用了less预处理器。可以看到我在less-loader上面还加了css-loader。这和官网文档建议的不一样了,官发说加了type: 'css'后就可以舍弃css-loader,style-loader, MiniCssExtractPlugin.loader 这几个。

但是我的项目中,有在.less文件中@import './xxx.css' 的文件,这会导致无法识别而报错。因此加上resolve.preferRelative。(参考issue: https://github.com/web-infra-dev/rspack/issues/3913)

结果

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博客
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用webpack创建Vue3项目的步骤如下: 1. 首先,需要安装Node.js和npm包管理器。 2. 创建一个新的项目文件夹,并在其打开终端。 3. 在终端运行以下命令来初始化npm: ``` npm init -y ``` 4. 接下来,需要安装Vue.jsVue-loader: ``` npm install vue@next vue-loader@next @vue/compiler-sfc --save-dev ``` 5. 然后,安装webpackwebpack-cli: ``` npm install webpack webpack-cli --save-dev ``` 6. 创建一个名为webpack.config.js的文件,并将以下代码复制到其: ```javascript const path = require('path'); const HtmlWebpackPlugin = require('html-webpack-plugin'); module.exports = { entry: './src/main.js', output: { path: path.resolve(__dirname, 'dist'), filename: 'bundle.js' }, module: { rules: [ { test: /\.vue$/, loader: 'vue-loader' } ] }, plugins: [ new HtmlWebpackPlugin({ template: './public/index.html' }) ] }; ``` 7. 在package.json文件添加以下脚本: ```json "scripts": { "build": "webpack --mode production" } ``` 8. 创建一个名为src的文件夹,并在其创建一个名为main.js的文件。在main.js添加以下代码: ```javascript import { createApp } from 'vue'; import App from './App.vue'; createApp(App).mount('#app'); ``` 9. 创建一个名为public的文件夹,并在其创建一个名为index.html的文件。在index.html添加以下代码: ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Vue 3 App</title> </head> <body> <div id="app"></div> <script src="./bundle.js"></script> </body> </html> ``` 10. 最后,在终端运行以下命令来构建项目: ``` npm run build ``` 运行成功后,将在dist文件夹生成一个bundle.js文件,该文件包含了所有的Vue组件和依赖项。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值