Skip to main content
Bun 可以将整个前端打包成一个单一的 .html 文件,零外部依赖。JavaScript、TypeScript、JSX、CSS、图片、字体、视频、WASM——所有内容都内联到一个文件中。
terminal
输出是一个自包含的 HTML 文档:没有相对路径,没有外部文件,不需要服务器。

一个文件。随处上传。

输出是一个单一的 .html 文件,你可以放在任何地方:
  • 上传到 S3 或任何静态文件托管——无需维护目录结构,一个文件搞定
  • 从桌面双击——它在浏览器中打开并可离线工作,无需 localhost 服务器
  • 嵌入到你的 webview——无需处理相对文件
  • 插入到 <iframe>——使用单个文件 URL 在另一个页面中嵌入交互式内容
  • 从任何地方提供——任何 HTTP 服务器、CDN 或文件共享
无需安装任何东西,无需部署 node_modules,无需协调构建产物,无需考虑相对路径。

真正的一个文件

通常,分发一个网页意味着管理一个资源文件夹——HTML、JavaScript 包、CSS 文件、图片。只移动 HTML 而没有其他文件,一切都会崩溃。浏览器以前尝试过解决这个问题:Safari 的 .webarchive.mhtml 本应将页面保存为单个文件,但在实践中它们会在你的计算机上解包成一个松散的文件夹——违背了目的。 独立 HTML 输出是一个纯 .html 文件:不是归档文件,不是文件夹。每张图片、每种字体、每行 CSS 和 JavaScript 都使用标准的 <style> 标签、<script> 标签和 data: URI 直接嵌入到 HTML 中。任何浏览器都可以打开它,任何服务器都可以托管它。 你可以像分发 PDF 一样分发该页面:一个可以移动、复制、上传或共享的文件,无需担心路径损坏或丢失资源。

快速开始

terminal
打开 dist/index.html——React 应用无需服务器即可工作。

所有内容都被内联

Bun 会内联在 HTML 中找到的每个本地资源:任何具有相对路径的、任何文件类型的,都会被嵌入到输出文件中。

哪些内容会被内联

图片、字体、WASM 二进制文件、视频、音频文件、SVG——任何由相对路径引用的文件都会被 base64 编码为 data: URI 并直接嵌入到 HTML 中。Bun 从文件扩展名检测 MIME 类型。 外部 URL(如 CDN 链接或绝对 URL)保持不变。

使用 React

React 应用无需额外配置:Bun 转译 JSX 并解析 npm 包。
terminal
terminal
整个 React、你的组件和你的 CSS 都被打包到 dist/index.html 中。将这一个文件上传到任何地方,它都能正常工作。

使用 Tailwind CSS

安装插件并在 HTML 或 CSS 中引用 Tailwind:
terminal
使用 JavaScript API 配合插件构建:
build.ts
terminal
生成的 Tailwind CSS 直接以内嵌 <style> 标签的形式内联到 HTML 文件中。

原理

当你使用 .html 入口点传递 --compile --target=browser 时,Bun:
  1. 解析 HTML 并发现所有 <script><link><img><video><audio><source> 和其他资源引用
  2. 将所有 JavaScript/TypeScript/JSX 打包到一个模块中
  3. 将所有 CSS(包括 @import 链和从 JS 导入的 CSS)打包到单个样式表中
  4. 将每个相对资源引用转换为 base64 data: URI
  5. 将打包后的 JS 内联为 </body> 之前的 <script type="module">
  6. 将打包后的 CSS 内联为 <head> 中的 <style>
  7. 输出一个无外部依赖的单一 .html 文件

压缩

添加 --minify 来压缩 JavaScript 和 CSS:
terminal
或使用 JavaScript API:
build.ts

JavaScript API

使用 Bun.build() 以编程方式生成独立 HTML:
build.ts
当省略 outdir 时,输出以 BuildArtifact 形式在 result.outputs 中可用:

多个 HTML 文件

你可以传递多个 HTML 文件作为入口点。每个文件都会生成自己的独立 HTML 文件:
terminal

环境变量

使用 --env 将环境变量内联到打包后的 JavaScript 中:
terminal
Bun 在构建时将 JavaScript 中对 process.env.API_URL 的引用替换为字面值。

限制

  • 不支持代码分割 —— --splitting 不能与 --compile --target=browser 一起使用
  • 大资源增加文件大小,因为它们被 base64 编码(比原始二进制文件多 33% 开销)
  • 外部 URL(CDN 链接、绝对 URL)保持不变——只有相对路径被内联