As a rule of thumb: the bundler and the runtime both support the same set of file types out of the box.
.js .cjs .mjs .mts .cts .ts .tsx .jsx .toml .json .txt .wasm .node .html
Bun uses the file extension to determine which built-in loader should be used to parse the file. Every loader has a name, such as js, tsx, or json. These names are used when building plugins that extend Bun with custom loaders.
You can explicitly specify which loader to use using the 'loader' import attribute.
Built-in loaders
js
JavaScript loader. Default for .cjs and .mjs.
Parses the code and applies a set of default transforms like dead-code elimination and tree shaking. Note that Bun does not attempt to down-convert syntax at the moment.
jsx
JavaScript + JSX loader. Default for .js and .jsx.
Same as the js loader, but JSX syntax is supported. By default, JSX is down-converted to plain JavaScript; the details of how this is done depends on the jsx* compiler options in your tsconfig.json. Refer to the TypeScript documentation on JSX for more information.
ts
TypeScript loader. Default for .ts, .mts, and .cts.
Strips out all TypeScript syntax, then behaves identically to the js loader. Bun does not perform typechecking.
tsx
TypeScript + JSX loader. Default for .tsx.
Transpiles both TypeScript and JSX to vanilla JavaScript.
json
JSON loader. Default for .json.
JSON files can be directly imported.
.json file is passed as an entrypoint to the bundler, it will be converted to a .js module that export defaults the parsed object.
toml
TOML loader. Default for.toml.
TOML files can be directly imported. Bun will parse them with its fast native TOML parser.
.toml file is passed as an entrypoint, it will be converted to a .js module that export defaults the parsed object.
text
Text loader. Default for.txt.
The contents of the text file are read and inlined into the bundle as a string. Text files can be directly imported. The file is read and returned as a string.
.txt file is passed as an entrypoint, it will be converted to a .js module that export defaults the file contents.
napi
Native addon loader. Default for.node.
In the runtime, native addons can be directly imported.
In the bundler,
.node files are handled using the file loader.sqlite
SQLite loader. Requireswith { "type": "sqlite" } import attribute.
In the runtime and bundler, SQLite databases can be directly imported. This will load the database using bun:sqlite.
This is only supported when the target is
bun."embed" attribute:
When using a standalone executable, the database is embedded into the single-file executable.Otherwise, the database to embed is copied into the
outdir with a hashed filename.html
Thehtml loader processes HTML files and bundles any referenced assets. It will:
- Bundle and hash referenced JavaScript files (
<script src="...">) - Bundle and hash referenced CSS files (
<link rel="stylesheet" href="...">) - Hash referenced images (
<img src="...">) - Preserve external URLs (by default, anything starting with
http://orhttps://)
src/index.html
dist/index.html
lol-html to extract script and link tags as entrypoints, and other assets as external.
List of supported HTML selectors
List of supported HTML selectors
Currently, the list of selectors is:
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 Loader Behavior in Different ContextsThe
html loader behaves differently depending on how it’s used:- Static Build: When you run
bun build ./index.html, Bun produces a static site with all assets bundled and hashed. - Runtime: When you run
bun run server.ts(whereserver.tsimports an HTML file), Bun bundles assets on-the-fly during development, enabling features like hot module replacement. - Full-stack Build: When you run
bun build --target=bun server.ts(whereserver.tsimports an HTML file), the import resolves to a manifest object thatBun.serveuses to efficiently serve pre-bundled assets in production.
sh
Bun Shell loader. Default for.sh files.
This loader is used to parse Bun Shell scripts. It’s only supported when starting Bun itself, so it’s not available in the bundler or in the runtime.
file
File loader. Default for all unrecognized file types. The file loader resolves the import as a path/URL to the imported file. It’s commonly used for referencing media or font assets.logo.svg file exists and converts it to an absolute path to the location of logo.svg on disk.
outdir as-is, and the import is resolved as a relative path pointing to the copied file.
publicPath, the import will use value as a prefix to construct an absolute path/URL.
| Public path | Resolved import |
|---|---|
"" (default) | /logo.svg |
"/assets" | /assets/logo.svg |
"https://cdn.example.com/" | https://cdn.example.com/logo.svg |
The location and file name of the copied file is determined by the value of
naming.asset.This loader is copied into the outdir as-is. The name of the copied file is determined using the value of naming.asset.