00:00:00(欢快的音乐)大家好
00:00:06我是Lydia
00:00:07我在BUN的职位是宣传负责人
00:00:11如果你对我有所了解,你就知道我喜欢谈论JavaScript运行时和性能
00:00:17在加入BUN之前,我在Vercel工作了几年,教Next开发者如何更快地构建应用
00:00:24所以我很高兴今天能在这里展示,当我们结合Next框架性能和BUN运行时性能时,效果会有多好
00:00:35但在我谈论BUN本身之前,我想回顾一下是什么让Next.js这样的框架如此特殊
00:00:45因为它们彻底改变了我们对网络性能的看法
00:00:49它不仅让网站更快
00:00:52它还简化了整个过程的每一个部分
00:00:55我们有更智能的Webpack打包,现在还有Turbo Pack
00:00:59我们有内置的图片和字体优化
00:01:02我们有高效的服务器端渲染、静态渲染,现在有ISR,还有RSC把数据获取带入组件本身
00:01:12这些改进都推动了框架能够优化的内容,但真的只能到某个程度
00:01:21一直存在着一个基础层面,Next.js还没能优化
00:01:26这不是因为工程努力或能力不足,而是这超出了Next的范围
00:01:34那就是运行时本身
00:01:37通常当你运行Next dev或部署到Vercel时,你的Next应用运行在Node上
00:01:42这意味着Node的运行时执行你的JavaScript
00:01:45它管理事件循环、文件IO、所有的一切
00:01:49它连接你的JavaScript代码和操作系统
00:01:53这很合理,因为Node在过去大约15年里一直是默认运行时
00:01:59它经过了实战考验,非常可靠,但在2025年,它也成为了某种瓶颈
00:02:06别误会,Node很棒
00:02:09它使在服务器上运行JavaScript成为可能
00:02:13在此之前,在2009年Node推出之前,JavaScript真的只是用于浏览器
00:02:20Node改变了这一切,它提供了一个包含JavaScript引擎、
00:02:24事件循环、
00:02:25异步IO的运行时,还有API来做浏览器无法做的所有事情
00:02:29比如从磁盘读取文件、内存,所有这些东西
00:02:33在底层,Node使用V8 JavaScript引擎
00:02:37这是谷歌快速的Chrome引擎,对于长期运行的任务非常好用,比如Chrome浏览器中的标签页
00:02:44当然,V8只是一个引擎
00:02:46它只知道如何执行JavaScript
00:02:49它无法打开文件、进行TCP连接,和所有这类东西
00:02:54所以这就是Node内置API的作用
00:02:57比如FS、HTTP、NET等等
00:03:01这些API是我们的JavaScript代码和操作系统之间的桥梁
00:03:07而这些API本身依赖于一个叫libuv的C库
00:03:13这不是为JavaScript本身构建的
00:03:16它更多地是一种通用抽象,Node用它来完成文件IO、网络连接等工作,跨越所有这些不同的操作系统
00:03:27所以当我们在JavaScript代码中调用fs.readFile这样的东西时,我们真的只是在问计算机,我想从磁盘读取这个文件
00:03:36但在我们能到达那里之前,它首先必须经过V8,或者从JavaScript代码到V8
00:03:42然后它传递给Node的C++绑定
00:03:46这随后调用libuv,这还没有提到线程工作和所有这类开销
00:03:52只有之后libuv才会真正向我们的内核进行系统调用,以从磁盘获取文件
00:03:58当所有这一切发生时,我们有libuv使用的事件循环,所以我们的其余JavaScript代码仍然可以执行等等
00:04:06这个模型工作得很好
00:04:08我们仍在使用Node,但这不是最优的
00:04:13所以回到2009年,再次说Node推出的时候,我们的硬件看起来非常不同
00:04:19服务器可能只有四个核心,内存有限,存储也很慢
00:04:25线程也很昂贵,所以为每个连接创建一个新线程的伸缩性并不好
00:04:32所以Node的模型在那个时代非常好用,因为我们可以用一个线程高效地处理数千个连接
00:04:40但快进到2025年,我们的硬件看起来非常不同
00:04:44我们现在有数百个CPU核心、数TB内存,存储快50倍
00:04:51但我们仍在使用基于2009年的Node模型
00:04:55它仍在把所有东西推送通过同一个事件循环
00:04:59再次说,这没问题
00:05:00Node的架构在服务器运行数天时是没问题的
00:05:04但在现代,我们经常有无服务器函数或开发服务器
00:05:09所有这些更像是需要快速启动并运行更短时间的短爆发脚本
00:05:16所以在这些环境中,启动的每一毫秒和每一个数据层都很重要,因为它们都增加了延迟
00:05:24现在再次说,当你运行你的Next应用时,你在Node上运行它
00:05:34这意味着你的应用做的所有事情,比如渲染页面、提供资源、流式响应,都要通过我们刚才看到的所有这些层
00:05:43所以从JavaScript到V8到Node,所有这类东西
00:05:46Next在尽管有Node运行时仍在阻止某些事情的情况下,在挤压性能方面做了令人难以置信的工作
00:05:57因为说到底,所有这些改进仍然运行在Node之上
00:06:01所以当你启动一个开发服务器或重新构建文件、热重载时,你仍然在达到那些运行时限制
00:06:09所以如果我们真的想更快,我们必须超越框架来看
00:06:13我们必须更深入一层
00:06:15我们必须重新思考运行时本身
00:06:18所以这就是BUN的用武之地
00:06:20BUN不只是像构建在Node之上的另一层
00:06:24它是为我们在2025年实际拥有的硬件从头开始构建的全新运行时
00:06:33所以BUN不是像Node那样用C++写在LibUV之上,而是用Zig构建的
00:06:40这是一种现代系统语言,运行更接近硬件
00:06:45对于JavaScript引擎,BUN使用苹果非常快的JavaScript Core引擎
00:06:51这启动非常快,主要是因为它可以延迟一些V8这样的引擎进行的初始化优化
00:06:59它也运行得非常快,这再次对我们现在使用的现代任务非常完美,比如开发服务器、无服务器环境和这些更短的构建脚本
00:07:10核心运行时本身是用Zig写的
00:07:13所以BUN的API和处理异步I/O的所有部分
00:07:17Node使用LibUV进行所有这些异步操作,比如读取文件、
00:07:24网络请求等,BUN可以将这些实现为对操作系统的直接系统调用,因为它是用Zig写的
00:07:33现在对于网络请求,我们使用useSockets,所以它有点不同
00:07:37但我们通过使用Zig而不是LibUV来去掉了这么多抽象层
00:07:44所以现在如果你想用BUN运行时读一个文件,它当然仍然从你的JavaScript代码开始
00:07:49它现在转到JSC引擎再到Zig,然后可以进行直接的系统调用
00:07:55所以再次说,我们的JavaScript代码和实际操作系统之间的层数更少
00:08:01结果是从启动到文件访问、HTTP服务器等一切都感觉快得多
00:08:09但BUN不只是关于性能
00:08:12我们也旨在100%兼容Node
00:08:15所以我们想确保所有Node自己的API都能工作
00:08:19但它还附带了许多额外的内置API,比如S3、SQL或Squeel,不管你怎么说
00:08:27Redis、哈希、shell,很多东西
00:08:30如果你使用过其他编程语言,比如Go或Python,这种电池包含的方法对你来说非常熟悉
00:08:39但作为JavaScript开发者,我们已经习惯了为几乎所有东西安装依赖
00:08:45我在几乎所有我的应用中使用密码哈希
00:08:48但我仍然每次使用它时都必须安装一个依赖
00:08:52所以BUN改变了这一点
00:08:54你几乎一直使用的东西就直接内置到运行时本身中
00:08:59它就内置在全局对象中
00:09:01再次说,这些不只是像表面级别的包装在NPM依赖之上
00:09:06它们真的是用Zig内置的
00:09:08所以它们针对现代硬件的性能进行了优化
00:09:12比如,BUN有一个内置SQL客户端
00:09:16所以你可以使用单一API直接连接到Postgres、MySQL和SQLite
00:09:23你不必安装任何额外的依赖
00:09:26再次说,这不只是调用某个NPM包
00:09:30这真的是全部BUN直接与系统交互
00:09:35有这些内置不仅仅是为了方便
00:09:38BUN的选项通常也比Node和NPM的替代品快得多
00:09:44比如这里,BUN.SQL比Node上的MySQL 2快11倍,这真的很好
00:09:51或者你可以像使用BUN的S3客户端
00:09:54这与任何S3兼容存储立即工作
00:09:58所以Amazon S3、Supabase存储、Cloudflare R2,你能想到的都行
00:10:03再次说,这个API也快得难以置信
00:10:06所以这里,我们可以看到它比Node上的AWS S3 SDK快达6倍
00:10:12当然,你仍然可以在BUN运行时使用你的普通依赖
00:10:17你不必使用这些内置API
00:10:20但它们确实能大大减少你的包大小,因为我们不再添加这些依赖
00:10:25它帮助解决我们上个月看到的NPM漏洞,因为你不必安装它们
00:10:32还有许多其他API
00:10:33我强烈推荐你也检查一下文档
00:10:37但BUN的功能远不止一个运行时
00:10:40它还附带了一个非常快的包管理器,比YARN快17倍,比NPM快7倍,比PNPM快4倍
00:10:51好消息是,你不必使用BUN运行时来使用BUN install
00:10:55你可以用Node使用BUN install
00:10:58它就能工作
00:10:59所以你不必改变关于你项目的任何东西
00:11:03它还有一个非常快的内置打包器和转译器
00:11:06所以你可以即时提供和构建你的文件
00:11:09所以你不需要Webpack、ESBuild、无需额外设置
00:11:12好消息是它也支持TypeScript和JSX开箱即用
00:11:18它还有一个非常快的测试运行器,当我们SSR如1000个React测试时,比vTest快14倍,比jest快23倍
00:11:26所以再次说,你得到了非常快的测试
00:11:29你不必安装任何东西
00:11:31所以这一切都听起来很棒,但我们如何使用BUN运行时呢?
00:11:35在Next中,说实话,这真的很简单
00:11:38安装BUN后,你只需更新你的start命令或dev命令并添加bun run --bun
00:11:45就是这样
00:11:46你现在运行BUN运行时
00:11:48现在你可能想知道,为什么我需要那个--bun
00:11:51就像,我已经在说bun run
00:11:54那个,再次说,是因为BUN真的关心节点兼容性
00:11:57所以通常,如果我们只是使用bun run next dev,BUN会检测next CLI使用该节点shebang
00:12:07在那种情况下,BUN会像,好的,我理解我必须使用node
00:12:11所以那样它就会默认回到node,即使我们说了bun run
00:12:15但使用--bun标志,我们有点强制跳过shebang并说,好的,我们只是使用bun运行时
00:12:21所以只是作为一个额外的解释
00:12:25所以现在使用这个命令,bun启动你的Next dev服务器
00:12:29打包器本身仍然是next
00:12:31所以那是,你知道,Turbo Pack
00:12:33我想是Web Pack,Turbo Pack,现在它是默认的
00:12:35但现在底层的运行时,所以执行你的JavaScript、读取文件、提供响应等的东西,那都是bun
00:12:44因为bun的设计是节点兼容的,你不应该必须改变你的代码中的任何东西
00:12:50或你的包或你的中间件
00:12:51一切应该仍然有效
00:12:53如果不是,那也被认为是bun中的一个错误
00:12:57它应该是100%节点兼容的
00:12:59所以如果你尝试这个,你遇到问题,让我们知道
00:13:02但你不应该必须重写任何东西
00:13:05现在你的应用运行在bun之上,你可以访问所有bun的内置API
00:13:10比如,我们可以直接在像服务器函数、React服务器组件中使用S3客户端等
00:13:16所以我们不必安装任何依赖
00:13:18所以只是为了比较它通常在Node中看起来会是什么样子,你可以看到使用bun,我们有少得多的代码
00:13:25我们有更少的依赖
00:13:27它也立即与所有其他S3提供商兼容
00:13:32所以如果你想从Amazon S3变为像Cloudflare R2、Supabase存储、所有这些其他提供商,那非常简单
00:13:40或一个更完整的,我们可以在React服务器组件中直接使用S3、bun shell和SQL
00:13:47所以首先,我们像用SQL查询数据库来获取博客文章、为图像生成预签名S3 URL、使用bun shell计算单词
00:13:57再次说,没有额外的API层或bun调用的第三方工具
00:14:02Bun处理运行时、数据库连接和shell都以Zig本地方式,所以接近硬件
00:14:10再次说,当然,它不只是S3 SQL
00:14:12只需在Next dev前面添加bun run --bun,我们就可以访问所有bun的API
00:14:20但当然,现在你可能在想,好的,我不使用Postgres
00:14:24我不使用S3
00:14:25我不使用任何疯狂的依赖,所以我为什么要关心
00:14:28让我进入bun之前真正吸引我的是诚实地说令人难以置信的开发体验
00:14:34你可以只运行任何JS、TS、TSX、JSX,不重要什么文件,无需任何配置
00:14:41它就工作
00:14:41你不必考虑TSNode、Babel、SWC等
00:14:46所以即使你不使用next,即使你只是开发,你想要一个快速构建脚本,只是使用bun run,只是尝试它,它会让你的生活变得更好得多,因为你不需要任何配置
00:14:59Bun也附带bun x
00:15:01这是bun的有点等价于NPX
00:15:04再次说,你不必改变任何东西
00:15:06你不必使用bun运行时为了这个
00:15:08你可以只改变NPX为bun x
00:15:11你会看到立即的启动改进
00:15:13比如,使用bun x create next step比NPX create next step快5倍
00:15:20再次说,你不必使用bun运行时为了这个
00:15:23它只是快得多
00:15:25但当然,还有bun install,再次说,不需要你改变运行时
00:15:31它只是让你的安装快得多,也是在基础next项目上
00:15:36现在显然,在本地运行bun是一回事
00:15:39但我们如何部署在bun上运行的应用?
00:15:42因为这个,当然,是一个全新的运行时
00:15:46现在你已经可以在几个平台上使用bun上的Next.js,比如render、
00:15:51railway,或使用Docker容器化你的应用
00:15:54但我们都是Next.js开发者
00:15:56理想情况下,我们也想能够部署到Vercel
00:16:00所以自然,我们推文给Guillermo,友好地请求他在Vercel上对bun的本地支持
00:16:07我们很快得到了一个相当有希望的回应
00:16:10然后几周后,bun支持至少在内部已经实现
00:16:15所以我很高兴本地bun支持将很快来到Vercel
00:16:20这意味着你会能够(掌声)
00:16:25掌声给了Vercel的伟大工程师们,他们使这成为可能
00:16:29但这非常令人兴奋,因为这意味着我们现在可以像任何其他Next项目在Vercel上一样轻松地运行bun应用
00:16:37所以也只是一个真实的例子
00:16:39我不确定你是否能在屏幕上看到它
00:16:41但在Vercel上运行一个HONO API与bun已经看到了CPU下降30%,或者通过只在Vercel上运行bun的CPU下降
00:16:49这个,当然,是一个不同的框架
00:16:50这是HONO API
00:16:52但如果这像一个服务器函数、RSC等,你会得到相同的运行时好处
00:16:57因为bun节省了很多CPU和内存使用
00:17:02现在我们,当然,不必等待本地bun支持以开始在我们的应用中使用它
00:17:06最简单的方式有点像开始使用它或逐步采用它
00:17:11所以首先,我推荐只是切换到bun install
00:17:14改变你的代码库中的任何东西
00:17:16这只是使用bun的非常快的包管理器
00:17:19另外,如果你有兴趣知道为什么bun install快得多,我不久前写了一篇关于这个的文章
00:17:24我强烈推荐你检查一下
00:17:26它只是解释了--你知道,我们不只是跳过步骤
00:17:29我们做任何事情
00:17:29它有点解释了使其快得多的系统工程
00:17:35现在在使用bun install后,然后尝试使用bun运行时
00:17:39你可以只在本地用bun run --bun使用它
00:17:42测试你的应用
00:17:42看看一切是否有效
00:17:44应该会
00:17:45如果不是,让我们知道
00:17:47最后,你可以有点逐步移动到bun的本地API,其中它有意义
00:17:53你,当然,仍然可以混合搭配这些NPM依赖
00:17:57但最好的部分也是每一步在这里是可逆的
00:18:00所以如果你确实使用了bun的本地API之一,它没有工作,你总是可以只切换回node
00:18:06但这绝对值得检查一下
00:18:08现在在我结束这次谈话之前,我只是想对bun的令人惊叹的工程师团队致以真诚的感谢
00:18:17大多数人可能知道Jared,但bun背后有整个团队每天都在努力工作,使bun更快、更稳定、更有趣
00:18:27他们真的在推动JavaScript可能的极限
00:18:32所以next重新想象了我们如何为网络构建,但bun重新想象了是什么为它供能
00:18:38非常感谢你来看我的演讲,我很兴奋看到你将用bun和Next构建什么