스크립트
00:00:00Bun 最大也是最具争议的更新刚刚发布了,Bun 1.4 版,使用 Rust 进行了重写。
00:00:04之前我已经做过关于重写风波的视频了,所以我们直接来看看有哪些新功能,
00:00:07因为我确实很喜欢其中的一些特性,特别是标准库相关的内容,
00:00:11因为它现在内置了无头浏览器、图像库、伪终端、Markdown 解析、
00:00:15定时任务、表格处理等功能,可以替代你可能正在使用的 15 个第三方依赖。
00:00:19过去几年里,JavaScript 最大的抱怨之一就是缺乏完善的标准库,
00:00:23而 Bun 正在解决这个问题。在这个每周都有供应链攻击的世界里,这真是一个相当不错的举措。
00:00:30首先,我们可以卸载 Playwright 和 Puppeteer,转而使用 Bun WebView。
00:00:37通过这里的代码,我可以控制无头浏览器,找到订阅按钮并点击它,
00:00:41不过我还不能在你的电脑上运行它,所以你得自己帮我点一下订阅。
00:00:44诸如 click、type、press 和 scroll 等所有输入方法都会分发原生的浏览器事件,
00:00:48所以页面会认为你是一个真实用户。在 Mac 上,它使用的是系统自带的 WebKit,
00:00:52也就是 Safari 的引擎,这意味着无需安装任何东西;但如果你想要一个 Chrome 实例,
00:00:56你可以将 backend 选项设置为 Chrome,这样它就会使用已安装的 Chrome 或 Chromium 实例,
00:01:01这也是你在 Windows 或 Linux 上会做的事情。这实际上可以运行一个无头 Chrome
00:01:04子进程,或者连接到已经运行的 Chrome 实例。所以通过这段代码,
00:01:09我可以在 Mac 上驱动打开的 Chrome 版本,全部通过 Bun 完成。除此之外,
00:01:13你还可以使用 evaluate 在页面上运行 JavaScript,并将结果作为原生的
00:01:17JavaScript 值取回。如果某个你想要的功能还没有相应的 API,你可以退回到
00:01:21原始的 CDP 命令。我认为这对于一些轻量级的浏览器自动化非常不错,
00:01:25不过我认为它还无法完全取代 Playwright,因为它没有测试运行器或轨迹查看器,
00:01:29但对于网页抓取或计算机使用(computer use)脚本等任务,它是一个不错的选择。
00:01:32接下来,让我们卸载 Sharp,转而使用 Bun.image。这是一个完整的图像库,
00:01:37允许我们读取文件,在其上调用 .image,然后链式调用各种操作,例如调整大小、旋转、
00:01:42水平翻转、垂直翻转、更改亮度、清晰度,以及将其转换为一堆
00:01:46不同的图像格式。它还允许你在不解码像素数据的情况下读取元数据,
00:01:50如宽度、高度和格式。我真的很喜欢的另一个酷炫功能是能够创建
00:01:54占位图。这是一个低质量的版本,你可以在真实图片加载之前将其内联到 HTML 中。
00:01:59Bun.image 是我最兴奋能使用的功能之一,因为我以前确实遇到过
00:02:04与 Sharp 相关的部署和构建问题。现在如果使用 Bun,我就不用再为此操心了。
00:02:08我也不用再操心 Marked 了,因为我们现在可以直接使用
00:02:12Bun.markdown 来解析 Markdown。这里总共有三个 API。
00:02:16Bun.markdown.html 将 Markdown 渲染为 HTML 字符串。Bun.markdown.render 渲染 Markdown 并为
00:02:22每个元素提供自定义回调。这为你提供了使用自定义类渲染 HTML 的灵活性,
00:02:27支持 ANSI 终端输出或任何其他字符串格式。Bun.markdown.react 将 Markdown 渲染为 React.jsx,
00:02:33并且它还允许你为每个元素传入所需的任何组件,从而让你获得外观非常精美的
00:02:37Markdown 样式。此外,还有许多选项供你切换以控制所需的 Markdown
00:02:41功能。你可以拥有诸如 GitHub 风格的表格、自动链接、
00:02:45标题 ID 和 wiki 链接等功能,不过他们指出的一个警告是 HTML 输出不会被净化,
00:02:50因此原始的 HTML、事件处理属性、JavaScript 都会直接穿透过去,所以如果你在
00:02:54渲染用户编写的 Markdown,这仍然需要由你自己来解决安全问题。无论如何,现在生成了如此多的
00:02:59Markdown,对我来说这似乎是一个相当不错的补充。接下来,
00:03:03你现在可以卸载 Node.pty 了。Bun.terminal 为你提供了一个内置的伪终端,让你能够
00:03:08从 JavaScript 中驱动 Bash、Vim 或 HTOP。如果你曾经尝试在 Electron 应用中内置终端,
00:03:12你就会懂那种痛苦。这实际上是对 Bun.spawn 的扩展。你向其传入 terminal 选项,它就会
00:03:17启动一个附加了伪终端的子进程。子进程会看到一个真实的终端,从而支持
00:03:22彩色输出、光标移动和交互式提示符。一旦有了终端,你就可以
00:03:26向该终端写入数据、调整终端大小、关闭终端等等。你还可以
00:03:31创建自己的终端,从而在多个子进程之间复用它。我开始在所有这些功能中
00:03:35看到一种模式。这些似乎都是 Claude Code 会用到的东西,所以我希望他们能
00:03:39将其开源,这样我们就能看到这些功能的大规模应用。我们要卸载的下一个依赖
00:03:43是 Node.cron,因为我们现在可以直接使用 Bun.cron。如果你向其传入一个函数,
00:03:47它就会直接在事件循环上运行,不涉及任何系统 cron;但如果你向其传入一个脚本,
00:03:51它就会注册一个操作系统级别的定时任务,在 Linux 上实际使用 crontab,在 macOS 上使用 launchd,
00:03:56在 Windows 上使用任务计划程序。你可以使用标准的 cron 语法,包括工作日和诸如
00:04:01daily(每天)之类的辅助词,它还支持解析该 cron 语法,从而返回系统
00:04:05本地时区中的下一个匹配日期。说到时区,默认情况下所有任务都在本地时间运行,
00:04:11但它确实提供了明确的选项来更改这一点,因此你可以确切知道它何时运行。
00:04:15我日程上的下一项是告诉你卸载 concurrently 或 npm run all,因为 Bun 现在拥有了
00:04:20它自己的并行选项。使用此标志可以同时运行多个 package.json 脚本,
00:04:24并且输出会很好的加上其来源的脚本名称前缀。它还允许你对脚本名称使用 glob
00:04:28匹配,拥有用于在工作区内过滤在哪些包中运行命令的过滤器,
00:04:32并且还有一个选项允许其他脚本在其中一个报错时继续运行。它也不仅仅局限于并行,
00:04:37你还可以使用 sequential 逐个运行脚本,同时保留相同的带前缀输出和过滤功能。
00:04:41这可能是我会发现自己使用得最多的功能。我们接下来要卸载的是任何 tar 归档库。
00:04:45Bun.archive 是 tar 和 gzip 的快速原生实现。
00:04:50创建一个归档只需一个对象,其中键是路径,值是内容,
00:04:55内容可以是字符串、blob、Uint8Array 或 ArrayBuffer 中的任意一种。对于压缩,
00:05:00你还可以使用设置为 gzip 的 compress 选项,以及从 1 到 12 的压缩级别。显然,你之后可以
00:05:05使用诸如仅提取特定文件的 glob 模式等选项来提取它们,而我非常喜欢的一个功能是
00:05:10你可以在不解压的情况下读取归档。这里的代码可以从 npm 注册表中拉取 lodash
00:05:14并读取其 package.json,而无需解压单个文件。到目前为止,我们已经消除了对大约 7 个
00:05:19个 npm 包的需求,还有更多功能要讲,尽管这些是较小的功能,所以我们可以
00:05:24更快地过完它们。首先,Bun.serve 现在可以提供静态文件服务,取代了对
00:05:28serve-static 的需求,这对于你网站的 public 文件夹非常棒。其次,Bun 添加了对
00:05:33JSON5 和 XML 的支持,因此你不再需要它们的专门包了。你可以在 Bun 中导入、解析和序列化
00:05:38这两种格式。最后三个是用于终端的助手。我们有 Bun.sliceAnsi、Bun.wrapAnsi、
00:05:43和 Bun.stringWidth,它们为你提供感知终端列宽的切片、换行和测量功能,
00:05:47从而取代了对 slice-ansi、cli-truncate、wrap-ansi 和 string-width 等包的需求。
00:05:52总的来说,大约有 15 个包消失了,而我只介绍了这次发布的大约一半内容。
00:05:56这篇博客文章的大致核心是:许多事情变得更快了,CPU 使用率得到了改善,启动速度
00:06:01更快,而且尽管有所有这些功能,二进制文件反而缩小了 17%。哦,对了,它是用 Rust 写的。
00:06:06还有一个值得一提的附赠功能是 Bun.install 引入了全局虚拟存储区。
00:06:10如果你启用隔离链接器(isolated linker),包在你的机器上只会解压一次,并通过符号链接
00:06:14关联到你的 node_modules,而不是被单独复制到每一个项目中。这应该
00:06:19会使速度更快,如果你有大量项目,还能节省空间。那么你现在对 Bun 有什么看法?
00:06:23你用它吗?你会使用其中的任何功能吗?请在下方评论区告诉我,
00:06:27先别走,点个订阅,一如既往,我们下期再见。
00:06:36我们下次见。
커뮤니티 글
아직 글이 없습니다. 이 영상에 대한 첫 번째 글을 작성해 보세요!
이 영상에 대해 글쓰기