首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >初识 Turbopack

初识 Turbopack

作者头像
政采云前端团队
发布于 2023-02-27 08:55:12
发布于 2023-02-27 08:55:12
5190
举报
文章被收录于专栏:采云轩采云轩

初识 Turbopack http://zoo.zhengcaiyun.cn/blog/article/turbopack

一 前言

前端构建工具从 Grunt, Gulp 发展到具有划时代意义的 Webpack,Webpack 成为前端不可或缺的开发构建工具。但是随着前端的项目越来越大,无论是项目的启动时间,还是项目的打包时间,变得原来越长,短则四、五分钟,长则十几二十分钟。特别是在发版期间,打包速度直接影响发版效率。Webpack 打包速度成为了前端开发的最大痛点之一。

二 什么是 Turbopack

Turbopack 是 Webpack 的作者 Tobias Koppers 使用 Rust 语言开发一个前端模块化的工具,按作者构想 Turbopack 的目标是取代 Webpack。官方宣称 TurboPack 的速度比 Vite 快 10 倍,比 Webpack 快 700 倍。目前 Turbopack 仍然处于 AIpha 阶段,离正式运用到生产环境还有不少时间。

三 Turbopack 功能和特点

如果用一个字来形容 Turbopack,“懒”字再合适不过,极尽所能做不必要做的事情。

为了更好的说明 Turbopack 特性,我们使用 Webpack 作为对比的对象。

1. 增量计算和函数级别的缓存

我们用一个简单的例子来说明增量计算和缓存,如下代码是一个页面的代码,代码包含了 Header 和 Footer 两个组件:

代码语言:javascript
AI代码解释
复制
import Header from '../components/header'
import Footer from '../components/footer'
export default function Home() {
  return (
    <div>
      <Header />
      <h1>Home</h1> 
      <Footer />
    </div>
  )
}

当页面访问 /home 时 Header 和 Footer 会被标记为需要缓存 ,并被编译输出为 components_header.tsx.js 和 components_footer.tsx.js。而后更新 Footer 这个组件并保存,在 Webpack 中 Header 和 Footer 两个组件都会被重新编译,而仔细观察 Turbopack 输出的缓存文件,会发现只有 Footer 组件被重新编译,而 Header 组件则使用的是上一次的编译结果,如图所示 compoents_footer.tsx.js 的文件被刷新,而 header 则依旧是上一次的结果。

通过这种缓存机制,去除大量重复的工作,使得编译的效率大幅度的提升。

2. 按需编译

本地开发时,Webpack 启动时要全量编译所有文件,这使得启动项目或者切换分支后需要花费大量的时间重新打包编译。而 Turbopack 则采用按需编译的方式,我们使用一个简单的例子来说明什么是按需编译,为什么 Turbopack 的启动速度如此之快,在项目的基础上添加一个 Login 的页面,如下所示:

代码语言:javascript
AI代码解释
复制
import Header from '../components/header'
import Footer from '../components/footer'
export default function Login() {
  return (
    <div>
      <Header />
      <h1>Login</h1>
      <Footer />
    </div>
  )
}

启动项目,在不到 1s 时间后控制台提示已经启动成功,但是文件目录下却没有输出任何缓存文件,这是由于 Turbopack 的按需编译机制,所有组件在启动时都未被使用,所以没有任何的编译操作。在浏览器中访问项目的首页地址,此时观察输出缓存文件则发现 /home 页面及其依赖的组件才被编译:

而我们添加的 Login 的页面并没有被编译和输出,我们再次访问 /login 页面,在看一次输出的缓存文件:

在浏览器访问 /login 之后,该页面的以及所依赖的组件才会被编译,而这种按需编译的机制,减少程序的重复工作,提升开发人员的工作效率。此外还有一点,虽然 /home 和 /login 页面都依赖于 Footer 组件,当浏览器访问 /login 时只会更新当前页面的下的 Footer 组件,而 /home 页面下的 Footer 组件是不会被更新的。

3. SWC 编译器

Turbopack 的速度如此之快有一个很大的原因是使用了 SWC 作为编译器。大部分 Webpack 的项目编译都是使用 Babel 编译和转换,由于 Babel 本身也是使用 Javascript 编写,转换效率并不理想,而 Turbopack 原生使用 SWC(https://swc.rs/) 作为编译器。SWC 是一款 Rust 编写的 Javascript 代码编译器,官方宣称其编译速度是 Babel 的 20 倍( Webpack 也可以使用SWC)。

4. 本地持久化

根据作者的想法,未来编译结果不仅仅缓存在内存当中,还会本地持久化。本地持久化的意义是什么?在实际的生产环境中, 中大型的项目往往都需要打包 15 分钟甚至更久,编译结果持久化可以节省大量的打包时间。假设项目里有 50 个页面,本次迭代只修改了其中 10 个页面,Webpack 打包会全量重新打包 50 个页面,而 Turbopack 只需重新打包 10 个被修改的页面,未修改的 40 个页面直接从硬盘读取上一次打包结果,打包效率则得到非常大的提升。

5. Imports

根据作者的计划,Turbopack 支持 CommonJS、ESM, 部分支持 AMD。

CommonJS:

代码语言:javascript
AI代码解释
复制
const { add } = require('./math');
add(1, 2);

ESM:

代码语言:javascript
AI代码解释
复制
import img from './img.png'; 
import type { User } from '../server/types'; 
import { z } from 'zod';

Dynamic Imports:

代码语言:javascript
AI代码解释
复制
const getFeatureFlags = () => {  
  return import('/featureFlags').then(mod => {    
    return mod.featureFlags;  
  })
 }

6. 框架支持

原生支持 JSX/TSX,不需要引入 React 也能使用 JSX/TSX.

代码语言:javascript
AI代码解释
复制
- import React from 'react'; 
const Component = () => {  
 return <div />
}

作者计划在未来通过插件的形式支持 Vue 和 Svelte。

四 Turbopack体验

目前 next.js v13 搭配 Turbopack 已开放体验

代码语言:javascript
AI代码解释
复制
npx create-next-app --example with-turbopack

在启动代码里新增常规启动方式,分别使用两种方式启动项目,做个对比。

代码语言:javascript
AI代码解释
复制
  "scripts": {
    "dev": "next dev --turbo",
    "dev_normal": "next dev",
    "dev:tailwind": "concurrently \"next dev --turbo\" \"npm run tailwind -- --watch\"",
    "build": "next build",
    "start": "next start",
    "lint": "next lint",
    "tailwind": "tailwindcss -i styles/globals.css -o styles/dist.css",
    "format": "prettier --write \"**/*.{js,ts,tsx,md}\"",
    "postinstall": "npm run tailwind"
  },

使用 Turbopack 启动时间:

使用常规方式启动项目的时间:

该测试项目仅仅只有 200 个模块,得益于按需编译方式,Turbopack 的启动速度远比常规的方式要快的多。但是以上方法只能看出启动速度,在实际的开发中打包速度更能提升开发体验,因此想测试下 Turbopack 在大量模块下的打包编译速度。

新建一个 Next 的项目:

代码语言:javascript
AI代码解释
复制
npx create-next-app@latest

安装 Turbo:

代码语言:javascript
AI代码解释
复制
npm install turbo --save-dev

启动服务:

代码语言:javascript
AI代码解释
复制
npx turbo dev

使用以下脚本批量生成模块,将代码 batch.js 文件保存在项目的根目录下,并在 pages 目录下新建 components 文件夹:

代码语言:javascript
AI代码解释
复制
const [nodeExeDir, fileDir, count] = process.argv ;
var fs = require('fs');
const getJsx = (index) => {
    return `export function Comp${index}() {
        return <div>hello world ${index}</div>
      }`
}
(async () => {
    let importJsx = [];
    let renderJsx = [];
    for(var i=0;i<count;i++){
        await fs.writeFileSync(`./pages/components/comp${i}.tsx`,getJsx(i),'utf-8');
        importJsx.push(`import { Comp${i} } from './components/comp${i}';`);
        renderJsx.push(`<Comp${i} />  `)
    }
    await fs.writeFileSync(`./pages/page.tsx`,` ${importJsx.join('\r\n')} \r\n export default function Page() {
        return <div> ${renderJsx.join('\r\n')}  </div>
    }`,'utf-8');
})();

执行代码:

代码语言:javascript
AI代码解释
复制
node batch.js 1000

后面的数字为生成的模块数量,代码生成完成后将 page.tsx 引入并重启服务。分别生成 1000 ~ 10000 个模块的页面,并使用 Turbopack 运行, 记录多次编译所需的平均时间。作为参照使用 Webpack + Babel 的打包速度作为对比,操作方法同上。 得到以下曲线图:

从图表中可以看出,随着模块的增加,打包编译的时间是比较接近线性增长。测试过程中出现了一种情况,当模块数量超过 10000 个后编译时间变得非常不稳定,从 60s ~ 100s 都存在,没有统计意义,所以只统计到 10000 个模块。当数量达到 13000 个,编译过程会出现进程超时的情况。

备注 1:测试的结果会因为 模块的大小、硬件设备、平台的不同,而有比较大的区别;

备注 2:如果使用命令搭建失败,您可以在 https://github.com/vercel/next.js 的 example 文件夹里找到该项目。

五 Turbopack 的生态问题

除了上文所说的打包器之外,还有一款被大家熟知的打包器 Vite。相比 Webpack, Vite 的打包速度也比 Webpack 快非常多,但是流行程度依然没有 Webpack 这么高,比较重要的原因之一就是生态的问题。在 Webpack 的社区有丰富的插件供开发者使用,未来 Turbopack 也会遇到同样的问题。与 Vite 不同的地方,Turbopack 由同一个作者开发,和 Webpack 是继承关系,但作者表示并不会对 Webpack 和 Turbopack 做 1:1 的兼容,意味着 Webpack 的插件是无法在 Turbopack 上使用,同时作者也表示会将在 Webpack 上广泛被使用的插件移植到 Turbopack。因此 Turbopack 想替代 Webpack,未来还有很长的路要走。

六 总结

Turbopack 想替代 Webpack 急需解决的一个是生态问题,以及提供尽可能低成本的迁移方案。当迁移后的收益远大于迁移成本,Turbopack 完全取代 Webpack 也不是没有可能。就目前而言,未来一段时间内 Webpack 依然是主流的前端的工具。

七 参考文档

  • https://turbo.build/pack/docs
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-01-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 政采云技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
著名社交软件惊现Bug,删除你的所有好友!
昨天,给大家推荐了卡死别人QQ的一个小玩意,本来以为大家会不喜欢,但是,阅读量还马马虎虎,没看到的同学可以点这篇文章看一下《解放你的/别人的QQ》 到了晚上,QQ突然刮起了一阵红色感叹号风。 最开始是
课代表
2018/06/29
5650
QQ频道(内测版)整体使用简谈
一个偶然的机会得知了 QQ 正在内测一个类 Discord 服务器+频道式的社交功能,名字叫做“QQ频道”,很巧的是昨天正好在某个群里看到了某个 QQ 频道的通行证(内测邀请),翻了一下聊天记录然后找到了那个邀请,加入了 QQ 频道的内测。加之今天下午 QQ 官方灰度了 PC QQ 9.5.2.27899 版本(内置 QQ 频道的第二个版本),正好给我逮到了,于是下载尝试了一下以后谈一下体验。
HikariLan贺兰星辰
2022/10/27
4.1K0
云视频直播,使用腾讯云搭建直播教程
首先:登录腾讯云官网,找到云直播的产品页,点击“立即使用”进入腾讯云直播控制台;然后按页面的指引要求,点击同意、申请开通,就可以进入控制台了;
tengxunyun8点com活动整理
2019/04/30
37.7K0
云视频直播,使用腾讯云搭建直播教程
Fiddler教程
Fiddler(中文名称:小提琴)是一个 HTTP 的调试代理,以代理服务器的方式,监听系统的 Http 网络数据流动,Fiddler 可以也可以让你检查所有的 HTTP 通讯,设置断点,以及 Fiddle 所有的 “进出” 的数据(我一般用来抓包),Fiddler 还包含一个简单却功能强大的基于 JScript .NET 事件脚本子系统,它可以支持众多的 HTTP 调试任务。
明哥的运维笔记
2019/01/30
1.8K0
155. [HarmonyOS NEXT 实战案例十二 :List系列] 聊天消息列表 - 基础篇
聊天应用是移动设备上最常用的应用类型之一,而聊天消息列表是这类应用的核心组件。一个优秀的聊天消息列表需要支持多种消息类型(文本、图片、语音、文件等),并且能够清晰地区分自己和对方的消息。本教程将介绍如何使用HarmonyOS NEXT的ArkUI框架实现一个功能完善的聊天消息列表。
全栈若城
2025/06/30
1880
微信淘宝QQ被疑在后台反复读取用户相册,微信回应:便于快速发图;联想集团科创板IPO审核终止;Facebook服务再次宕机
10月8日,有网友爆料称,微信、淘宝、QQ等多款国产App均存在后台频繁读取用户相册的行为。该网友开启了iOS 15 的隐私新特性“记录App活动”,对所有 App 的隐私读取行为进行 7 天的监控,并使用 App Privacy Insights 对记录进行读取。监控发现,微信在用户未主动激活 App 的情况下,在后台数次读取用户相册,每次读取时间长达 1 分钟。
SDNLAB
2021/10/21
4970
QQ 被盗号引发大型“社死”现场!腾讯回应:系用户扫描过伪造的游戏二维码
整理 | 郑丽媛 出品 | CSDN(ID:CSDNnews) 今日凌晨,“QQ 盗号”这一词条登上微博热搜,直至中午都还在热搜榜上待着。 看到这条热搜后,小编火速登录 QQ 查看自己是否也被盗号,所幸没有遭殃,但同时也发现了列表里的许多群组突然“活跃”起来。 点进去一看,有些动作快的群主已撤回成员消息,但也有些群还未及时处理:好几个群成员在凌晨时候突然发黄图,甚至还发在了群成员 599 人、其中还有十几位老师的大学学院群里……借用网友的一句话:我这替人尴尬的老毛病又犯了。 大型社死现场,网友:
用户1737318
2022/06/29
8660
QQ 被盗号引发大型“社死”现场!腾讯回应:系用户扫描过伪造的游戏二维码
【玩转腾讯云】WordPress Typecho Hexo 实现消息的及时 QQ 微信 推送
WordPress 在有新评论的时候,可以有邮件推送,但是长老平时也不是时时刻刻都会打开邮箱看着,所以希望能够将新评论及时地推送到自己的 QQ 或者微信,以便及时查看、及时回复。下面长老将分享如何简单、快速地将消息推送到自己的 QQ 和 微信。
凝神长老
2020/04/20
2.2K0
用了TCP协议,就一定不会丢包吗?
最近就有个读者加了我的绿皮聊天软件,女生,头像挺好看的,就在我以为她要我拉她进群发成人专升本广告的时候。
小白debug
2022/12/02
1.2K0
用了TCP协议,就一定不会丢包吗?
【每日要闻】台积电确认明年1月起涨价;腾讯QQ回应大批账号被盗
1、腾讯QQ回应大批账号被盗:用户扫描不法分子伪造的游戏登录二维码,已陆续恢复正常 2、哪吒汽车:将迅速启动公司股份制改制工作 3、NASA正式结束月球火箭SLS的测试活动,计划于8月发射 4、阿里宣布获颁L4级自动驾驶卡车路测牌照 5、美科技巨头每秒能赚多少钱?苹果11376元、谷歌66918元 6、亚马逊致函FCC:SpaceX部署全部3万颗星链卫星有点多 7、环球晶圆宣布德克萨斯州新设晶圆工厂计划,预计2025年投产 8、小鹏汽车遭摩根大通减持3.65亿港元 9、台媒:台积电已确定明年1月起大多数制程
镁客网
2022/06/29
4490
【每日要闻】台积电确认明年1月起涨价;腾讯QQ回应大批账号被盗
瑞吉外卖Day7 Git使用的入门到精通
实际上,代码开发中也需要这样的软件来管理我们的代码. 例如我们经常会碰到如下的现象:
小小程序员
2023/04/02
2.4K0
瑞吉外卖Day7 Git使用的入门到精通
Android必看面试题——基础篇
温馨提示:文章干货内容较多,可能一次看不完,建议点个“在看”并收藏,下次再查阅不迷路~
Android扫地僧
2020/03/19
3.4K1
Android必看面试题——基础篇
相亲对象告诉你他的相亲史_时间让我看懂一切
注:本文,来自csdn论坛的觉的楼主写的不错,所以就引用过啦了,别介意哦,http://topic.csdn.net/u/20100624/16/80f263ca-b05f-456f-bf5f-9d87dd78a6f9.html,作者:NewJacket (这个真不是马甲)
全栈程序员站长
2022/11/08
3.6K0
面试 Notes|2021 年秋季 Android 求职记。。。
说来也怪,从入职的第一天就觉得很不舒服,然后慢慢产生离开的念头,随后转变思想,回去打算按照步骤继续学习,避免下次求职尴尬。奈何。
贺biubiu
2021/11/16
2.3K0
面试 Notes|2021 年秋季 Android 求职记。。。
相关推荐
著名社交软件惊现Bug,删除你的所有好友!
更多 >
LV.0
这个人很懒,什么都没有留下~
交个朋友
加入腾讯云官网粉丝站
双11活动抢先看 更有社群专属礼券掉落
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档