* Tweaks * Add ecosystem. Add bunx. Flesh out install. * Tweaks * Add TS to installation * Tweaks * New readme * Write new readme * Tweak * Center header * Bun * tweaks * No dollar sign * Fix links * Update * Tweak
6.9 KiB
Template a new Bun project with bun create.
$ bun create <template> <destination>
{% callout %}
Note — You don’t need bun create to use Bun. You don’t need any configuration at all. This command exists to make getting started a bit quicker and easier.
{% /callout %}
A template can take a number of forms:
$ bun create <template> # an official template (remote)
$ bun create <username>/<repo> # a GitHub repo (remote)
$ bun create <local-template> # a custom template (local)
Running bun create performs the following steps:
- Download the template (remote templates only)
- Copy all template files into the destination folder. By default Bun will not overwrite any existing files. Use the
--forceflag to overwrite existing files. - Install dependencies with
bun install. - Initialize a fresh Git repo. Opt out with the
--no-gitflag. - Run the template's configured
startscript, if defined.
Official templates
The following official templates are available.
bun create next ./myapp
bun create react ./myapp
bun create svelte-kit ./myapp
bun create elysia ./myapp
bun create hono ./myapp
bun create kingworld ./myapp
Each of these corresponds to a directory in the bun-community/create-templates repo. If you think a major framework is missing, please open a PR there. This list will change over time as additional examples are added. To see an up-to-date list, run bun create with no arguments.
$ bun create
Welcome to bun! Create a new project by pasting any of the following:
<list of templates>
{% callout %}
⚡️ Speed — At the time of writing, bun create react app runs ~11x faster on a M1 Macbook Pro than yarn create react-app app.
{% /callout %}
GitHub repos
A template of the form <username>/<repo> will be downloaded from GitHub.
$ bun create ahfarmer/calculator ./myapp
Complete GitHub URLs will also work:
$ bun create github.com/ahfarmer/calculator ./myapp
$ bun create https://github.com/ahfarmer/calculator ./myapp
Bun installs the files as they currently exist current default branch (usually main). Unlike git clone it doesn't download the commit history or configure a remote.
Local templates
{% callout %}
⚠️ Warning — Unlike remote templates, running bun create with a local template will delete the entire destination folder if it already exists! Be careful.
{% /callout %}
Bun's templater can be extended to support custom templates defined on your local file system. These templates should live in one of the following directories:
$HOME/.bun-create/<name>: global templates<project root>/.bun-create/<name>: project-specific templates
{% callout %}
Note — You can customize the global template path by setting the BUN_CREATE_DIR environment variable.
{% /callout %}
To create a local template, navigate to $HOME/.bun-create and create a new directory with the desired name of your template.
$ cd $HOME/.bun-create
$ mkdir foo
$ cd foo
Then, create a package.json file in that directory with the following contents:
{
"name": "foo"
}
You can run bun create foo elsewhere on your file system to verify that Bun is correctly finding your local template.
{% table %}
postinstall- runs after installing dependencies
preinstall- runs before installing dependencies
{% /table %}
Each of these can correspond to a string or array of strings. An array of commands will be executed in order. Here is an example:
{
"name": "@bun-examples/simplereact",
"version": "0.0.1",
"main": "index.js",
"dependencies": {
"react": "^17.0.2",
"react-dom": "^17.0.2"
},
"bun-create": {
"postinstall": "echo 'Installing...'", // a single command
"postinstall": ["echo 'Done!'"], // an array of commands
"start": "bun run echo 'Hello world!'"
}
}
When cloning a template, bun create will automatically remove the "bun-create" section from package.json before writing it to the destination folder.
Reference
CLI flags
{% table %}
- Flag
- Description
--force- Overwrite existing files
--no-install- Skip installing
node_modules& tasks
--no-git- Don’t initialize a git repository
--open- Start & open in-browser after finish
{% /table %}
Environment variables
{% table %}
- Name
- Description
GITHUB_API_DOMAIN- If you’re using a GitHub enterprise or a proxy, you can customize the GitHub domain Bun pings for downloads
GITHUB_API_TOKEN- This lets
bun creatework with private repositories or if you get rate-limited
{% /table %}
{% details summary="How bun create works" %}
When you run bun create ${template} ${destination}, here’s what happens:
IF remote template
-
GET
registry.npmjs.org/@bun-examples/${template}/latestand parse it -
GET
registry.npmjs.org/@bun-examples/${template}/-/${template}-${latestVersion}.tgz -
Decompress & extract
${template}-${latestVersion}.tgzinto${destination}- If there are files that would overwrite, warn and exit unless
--forceis passed
- If there are files that would overwrite, warn and exit unless
IF GitHub repo
-
Download the tarball from GitHub’s API
-
Decompress & extract into
${destination}- If there are files that would overwrite, warn and exit unless
--forceis passed
- If there are files that would overwrite, warn and exit unless
ELSE IF local template
-
Open local template folder
-
Delete destination directory recursively
-
Copy files recursively using the fastest system calls available (on macOS
fcopyfileand Linux,copy_file_range). Do not copy or traverse intonode_modulesfolder if exists (this alone makes it faster thancp) -
Parse the
package.json(again!), updatenameto be${basename(destination)}, remove thebun-createsection from thepackage.jsonand save the updatedpackage.jsonto disk.- IF Next.js is detected, add
bun-framework-nextto the list of dependencies - IF Create React App is detected, add the entry point in /src/index.{js,jsx,ts,tsx} to
public/index.html - IF Relay is detected, add
bun-macro-relayso that Relay works
- IF Next.js is detected, add
-
Auto-detect the npm client, preferring
pnpm,yarn(v1), and lastlynpm -
Run any tasks defined in
"bun-create": { "preinstall" }with the npm client -
Run
${npmClient} installunless--no-installis passed OR no dependencies are in package.json -
Run any tasks defined in
"bun-create": { "preinstall" }with the npm client -
Run
git init; git add -A .; git commit -am "Initial Commit";- Rename
gitignoreto.gitignore. NPM automatically removes.gitignorefiles from appearing in packages. - If there are dependencies, this runs in a separate thread concurrently while node_modules are being installed
- Using libgit2 if available was tested and performed 3x slower in microbenchmarks
- Rename
{% /details %}