通常规则是:打包器和运行时都支持相同的一组文件类型。
.js .cjs .mjs .mts .cts .ts .tsx .jsx .css .json .jsonc .toml .yaml .yml .txt .wasm .node .html .sh
Bun 使用文件扩展名来确定应该使用哪个内置加载器解析文件。每个加载器都有一个名称,比如 js、tsx 或 json。这些名称用于构建扩展 Bun 的自定义加载器插件时。
你可以使用 'type' 导入属性显式指定使用哪个加载器。
内置加载器
js
JavaScript 加载器。 默认用于 .cjs 和 .mjs。
解析代码并应用一组默认转换,如死代码消除和摇树优化。注意目前 Bun 不尝试对语法进行向下转换。
jsx
JavaScript + JSX 加载器。 默认用于 .js 和 .jsx。
与 js 加载器相同,但支持 JSX 语法。默认情况下,JSX 会被向下转换成普通 JavaScript;转换的具体方式依赖于你 tsconfig.json 中的 jsx* 编译选项。详情请参考 TypeScript 关于 JSX 的文档。
ts
TypeScript 加载器。 默认用于 .ts、.mts 和 .cts。
剥离所有 TypeScript 语法,然后行为与 js 加载器完全相同。Bun 不执行类型检查。
tsx
TypeScript + JSX 加载器。 默认用于 .tsx。
将 TypeScript 和 JSX 转译成普通 JavaScript。
json
JSON 加载器。 默认用于 .json。
可以直接导入 JSON 文件。
.json 文件作为打包入口传入,它会被转换成一个 .js 模块,export default 导出解析后的对象。
jsonc
含注释的 JSON(JSONC)加载器。 默认用于 .jsonc。
可以直接导入 JSONC(带注释的 JSON)文件。Bun 会解析并去除注释和尾随逗号。
json 加载器相同。
Bun 会自动针对
tsconfig.json、jsconfig.json、package.json 和 bun.lock 文件使用 jsonc 加载器。toml
TOML 加载器。 默认用于 .toml。
可以直接导入 TOML 文件。Bun 使用其快速的本地 TOML 解析器解析。
.toml 文件作为打包入口传入,它会被转换成一个 .js 模块,export default 导出解析后的对象。
yaml
YAML 加载器。 默认用于 .yaml 和 .yml。
可以直接导入 YAML 文件。Bun 使用它快速的本地 YAML 解析器解析。
.yaml 或 .yml 文件作为打包入口传入,它会被转换成一个 .js 模块,export default 导出解析后的对象。
text
文本加载器。 默认用于 .txt。
将文本文件内容读取并以内联字符串的形式插入包内。可以直接导入文本文件。文件内容会被读取并作为字符串返回。
.txt 文件作为入口传入,会被转换成一个 .js 模块,export default 导出文件内容。
napi
本地扩展加载器。 默认用于 .node。
在运行时,可以直接导入本地扩展。
在打包器中,
.node 文件使用文件加载器处理。sqlite
SQLite 加载器。 需要使用 with { "type": "sqlite" } 导入属性。
运行时和打包器中可以直接导入 SQLite 数据库文件。将使用 bun:sqlite 加载数据库。
"embed" 属性改变此行为:
使用独立可执行文件时,数据库会嵌入独立可执行文件内。否则,嵌入的数据库会被复制到输出目录
outdir,并带有哈希文件名。html
HTML 加载器。 默认用于 .html。
html 加载器处理 HTML 文件,并打包所有引用的资源。它会:
- 打包并哈希引用的 JavaScript 文件(
<script src="...">) - 打包并哈希引用的 CSS 文件(
<link rel="stylesheet" href="...">) - 哈希引用的图片(
<img src="...">) - 保留外部 URL(默认以
http://或https://开头的)
src/index.html
dist/index.html
lol-html 来提取脚本和链接标签作为入口点,其他资源视为外部资源。
支持的 HTML 选择器列表
支持的 HTML 选择器列表
当前支持的选择器包括:
audio[src]iframe[src]img[src]img[srcset]link:not([rel~='stylesheet']):not([rel~='modulepreload']):not([rel~='manifest']):not([rel~='icon']):not([rel~='apple-touch-icon'])[href]link[as='font'][href], link[type^='font/'][href]link[as='image'][href]link[as='style'][href]link[as='video'][href], link[as='audio'][href]link[as='worker'][href]link[rel='icon'][href], link[rel='apple-touch-icon'][href]link[rel='manifest'][href]link[rel='stylesheet'][href]script[src]source[src]source[srcset]video[poster]video[src]
HTML 加载器在不同场景下的行为
html 加载器的行为取决于它的使用方式:- 静态构建:运行
bun build ./index.html时,Bun 生成包含所有资源的静态站点,且资源已打包并哈希。 - 运行时:运行
bun run server.ts(其中server.ts导入 HTML 文件)时,Bun 开发期间动态打包资源,支持热模块替换等功能。 - 全栈构建:运行
bun build --target=bun server.ts(其中server.ts导入 HTML 文件)时,导入解析为清单对象,供Bun.serve高效地在生产环境提供预打包资源。
css
CSS 加载器。 默认用于 .css。
可以直接导入 CSS 文件。打包器会解析并打包 CSS 文件,支持 @import 语句和 url() 引用。
.css 文件输出到目标目录。
sh
Bun Shell 加载器。 默认用于 .sh 文件。
此加载器用于解析 Bun Shell 脚本。仅在启动 Bun 本身时支持,因此在打包器或运行时不可用。
file
文件加载器。 默认用于所有未识别的文件类型。
该加载器将导入解析为导入文件的路径或 URL,通常用于引用媒体或字体资源。
logo.svg 文件是否存在,并将其转换为该文件在磁盘上的绝对路径。
outdir,导入解析为指向复制文件的相对路径。
publicPath 指定了值,导入会使用该值作为前缀,构造绝对路径或 URL。
| 公共路径 | 解析导入 |
|---|---|
""(默认) | /logo.svg |
"/assets" | /assets/logo.svg |
"https://cdn.example.com/" | https://cdn.example.com/logo.svg |
复制的文件位置和文件名由
naming.asset 的值决定。此加载器将文件原样复制到 outdir,复制文件名根据 naming.asset 决定。