Files
bun.sh/docs/bundler/executables.md
Jarred Sumner e5421c56b1 feat: Support import db from './my.db' with {type: "sqlite"} (#8178)
* Support SQLite imports

* Docs

* Update executables.md

* Update loaders.md

* Update js_parser.zig

* Update loaders.md

* Update CMakeLists.txt

* Update Module.ts

* JSC got rid of `$trunc`?

---------

Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
2024-01-15 17:56:02 -08:00

2.8 KiB

Bun's bundler implements a --compile flag for generating a standalone binary from a TypeScript or JavaScript file.

{% codetabs %}

$ bun build ./cli.ts --compile --outfile mycli
console.log("Hello world!");

{% /codetabs %}

This bundles cli.ts into an executable that can be executed directly:

$ ./mycli
Hello world!

All imported files and packages are bundled into the executable, along with a copy of the Bun runtime. All built-in Bun and Node.js APIs are supported.

{% callout %}

Note — Currently, the --compile flag can only accept a single entrypoint at a time and does not support the following flags:

  • --outdir — use outfile instead.
  • --external
  • --splitting
  • --public-path

{% /callout %}

SQLite

You can use bun:sqlite imports with bun build --compile.

By default, the database is resolved relative to the current working directory of the process.

import db from './my.db' with {type: "sqlite"};

console.log(db.query("select * from users LIMIT 1").get());

That means if the executable is located at /usr/bin/hello, the user's terminal is located at /home/me/Desktop, it will look for /home/me/Desktop/my.db.

$ cd /home/me/Desktop
$ ./hello

Embedding files

Standalone executables support embedding files.

To embed files into an executable with bun build --compile, import the file in your code

// this becomes an internal file path
import icon from "./icon.png";

import { file } from "bun";

export default {
  fetch(req) {
    return new Response(file(icon));
  },
};

You may need to specify a --loader for it to be treated as a "file" loader (so you get back a file path).

Embedded files can be read using Bun.file's functions or the Node.js fs.readFile function (in "node:fs").

Embedding SQLite databases

If your application wants to embed a SQLite database, set type: "sqlite" in the import attribute and the embed attribute to "true".

import myEmbeddedDb from "./my.db" with {type: "sqlite", embed: "true"};

console.log(myEmbeddedDb.query("select * from users LIMIT 1").get());

This database is read-write, but all changes are lost when the executable exits (since it's stored in memory).

Embedding N-API Addons

As of Bun v1.0.23, you can embed .node files into executables.

const addon = require("./addon.node");

console.log(addon.hello());

Unfortunately, if you're using @mapbox/node-pre-gyp or other similar tools, you'll need to make sure the .node file is directly required or it won't bundle correctly.

Minification

To trim down the size of the executable a little, pass --minify to bun build --compile. This uses Bun's minifier to reduce the code size. Overall though, Bun's binary is still way too big and we need to make it smaller.