Transcript
00:00:00这是 Bun Image,随 Bun 1.3.14 版本发布的一个内置图像处理 API,可以调整大小、
00:00:06裁剪并在不同格式之间转换图像,无需任何原生依赖,
00:00:10而且整个过程都在主线程之外运行,意味着它在处理时不会阻塞你的服务器。
00:00:14但 Bun 本身已经是一个运行时、包管理器、打包工具、测试运行器了,
00:00:19现在又变成了图像处理器?这是否太过臃肿,还是说它在向我们暗示
00:00:24关于 Bun 未来方向的某种大动作?点击订阅,让我们一探究竟。
00:00:30如果你曾在服务器端用 JavaScript 处理过图像,可能用过一个叫
00:00:35Sharp 的库,甚至可能还没意识到,它每周在 npm 上的下载量超过 5500 万次,甚至
00:00:41被 Next.js 在底层用于图像优化。但 Sharp 依赖于一个名为 libvips 的原生二进制文件,
00:00:47这意味着每次安装都必须拉取适合你平台的构建版本。如果你曾因为这个
00:00:51而导致 Docker 构建或 CI 流水线失败,你就知道这有多让人抓狂了。所以 Bun 决定
00:00:57直接把图像处理功能内置到运行时中,而且在大多数基准测试中,它实际上比 Sharp
00:01:02更快。元数据读取速度快了 70 倍,调整大小速度快了约 30%。现在许多
00:01:08开发者真的很困惑为什么 Bun 要增加这个功能,但我大概能看出这一切的发展方向,
00:01:13之后我会详细说明。但现在,让我们通过几个演示来看看如何使用
00:01:17Bun 图像 API。我们将在我的博客上试用它,这是一个静态的 Waku 站点,上面
00:01:22有一些巨大的图片。首先,让我们通过一个简单的脚本来优化一张图片,
00:01:27就是那张我的头像,它成功将尺寸减小了 99%,这简直太疯狂了。
00:01:33来看看是怎么做的。首先,我们获取图像,注意这里我们用了 Bun.image,但你也可以用
00:01:37Bun file 配合图像函数。然后我们调整图像大小来缩小体积,设置宽度为 800
00:01:43像素,高度会根据纵横比自动计算。但如果你想的话,
00:01:47我们也可以在这里加上高度。接着我们设置输出格式为 WebP,并降低质量。当然,
00:01:52其他输出格式也支持,然后我们把新图片输出到一个文件中,
00:01:56这是一个 promise,所以需要 await 关键字。你可以看到这有多简单。
00:02:01事实上,所有这些代码都是不必要的,我们可以删掉它们,让代码更简洁。
00:02:06我们还可以设置调整大小的滤镜,更改重采样内核,进一步减小图像尺寸。
00:02:10我们可以旋转或翻转图像,这真的很酷。我们甚至可以改变亮度或
00:02:15饱和度,这可能会得到一些看起来很奇怪的图片。但有一件非常聪明的事
00:02:19你可以用来处理慢速连接,那就是使用 placeholder 函数,自动
00:02:23在主图加载时显示一张模糊的图片。为了做到这一点,我写了这个 for 循环,
00:02:29遍历包含所有块图像的目录中带有这些扩展名的每一个文件。
00:02:34所以每一张图片都在进行调整大小、缩放(不裁剪也不拉伸),
00:02:39然后我们为每张图片创建一个占位符,生成一个 thumb hash,意思是将
00:02:45任何图像编码为 28 字节的哈希值,非常适合作为模糊的图像占位符。
00:02:49这个哈希被添加到一个占位符对象中,然后写入一个文件,
00:02:53看起来是这样的。现在,占位符之所以是 base64 图像而不是
00:02:58单独的较小 WebP 图像,是为了让网络不必为了获取它而发起额外请求。
00:03:02所以我可以导入所有的占位符,并在 CSS 中将它们作为背景图片,
00:03:07同时等待主图加载完成,这对博客上的每一张图都适用。
00:03:11但如果你想在 MDX 文件中为单张图片实现这种效果,只需手动添加
00:03:16base64 代码即可,效果同样好。注意,你也可以通过
00:03:20将 progressive 设置为 true 来获得类似的 JPEG 图像效果。当然,还有许多
00:03:24Bun image 支持但我还没提到的功能,比如从 S3 兼容的
00:03:28存储桶中获取图像,或者将图像写入存储桶,将图像管道作为有效的响应体,
00:03:33以及当特定操作系统不支持某种格式时配置回退格式。
00:03:37那么这值得使用吗?嗯,如果你已经在用 Bun 了,那这绝对不用多想。
00:03:41但如果你在使用 Node,那么 Sharp 的工作表现非常好且经受过考验,
00:03:45没必要仅仅为了图像处理而更换到一个完全不同的运行时。
00:03:49还记得我说过 Bun 增加这个功能的深层原因吗?看看 Bun 在
00:03:54过去一年里所做的:内置 SQLite、S3、Postgres,现在又是图像,基本上
00:03:59就是构建全栈应用所需的一切,除了可能还有认证和邮件功能。这让我怀疑,
00:04:04Bun 是否正试图在运行时层面构建 JavaScript 的 Laravel 或 Rails?如果是这样,
00:04:11那么他们下一个工作目标就是认证。如果是的话,记住,你是从这听到的。
00:04:15但遗憾的是,如今你不能在不提及巨大的从 Zig 到 Rust
00:04:20重写的情况下谈论 Bun,希望在下一个版本中能看到它。让我们祈祷一切顺利。
00:04:25提到 Zig,如果你想进一步了解 Vercel 的 Language Zero,它看起来像 Zig,
00:04:29但又不是 Zig,并且是为 AI 代理构建的,请查看 James 的这个视频。
Community Posts
No posts yet. Be the first to write about this video!
Write about this video