运行时包管理器打包器测试运行器代码检查格式化指南参考博客反馈

bun create

从 React 组件、create-<template> npm 包、GitHub 仓库或本地模板创建新的 Bun 项目


使用 bun create 创建新的 Bun 项目。它可以从 React 组件、create-<template> npm 包、GitHub 仓库或本地模板创建项目。

要创建空项目,请使用 bun init。

从 React 组件创建

bun create ./MyComponent.tsx 会将已有的 React 组件转变成一个包含热重载和生产构建的一体化开发环境。

bash
bun create ./MyComponent.jsx # 同时支持 .tsx

工作原理

当你运行 bun create <component> 时,Bun 会:

  1. 使用 Bun 的 JavaScript 打包器 分析你的模块图。
  2. 收集运行该组件所需的所有依赖。
  3. 扫描入口点导出中是否存在 React 组件。
  4. 生成包含所需依赖和脚本的 package.json 文件,用来运行该组件。
  5. 使用 bun install --only-missing 安装缺失的依赖。
  6. 生成以下文件:
    • ${component}.html
    • ${component}.client.tsx (前端入口点)
    • ${component}.css
  7. 启动前端开发服务器。

在 Bun 中使用 TailwindCSS

TailwindCSS 是一个用于为 Web 应用程序设置样式的实用优先 CSS 框架。

当你运行 bun create <component> 时,Bun 会扫描你的 JSX/TSX 文件(以及它导入的任何文件)中的 TailwindCSS 类名。如果 Bun 检测到 TailwindCSS 类名,它会将以下依赖添加到你的 package.json 中:

package.json
{
  "dependencies": {
    "tailwindcss": "^4",
    "bun-plugin-tailwind": "latest"
  }
}

Bun 还会配置 bunfig.toml,以便通过 Bun.serve() 使用其 TailwindCSS 插件:

bunfig.toml
[serve.static]
plugins = ["bun-plugin-tailwind"]

Bun 还会写入一个 ${component}.css 文件,并在文件顶部添加 @import "tailwindcss";:

MyComponent.css
@import "tailwindcss";

在 Bun 中使用 shadcn/ui

shadcn/ui 是一个用于构建 Web 应用程序的组件库工具。

bun create <component> 会扫描是否有任何从 @/components/ui 导入的 shadcn/ui 组件。

如果找到,它会执行:

terminal
# 假设 bun 检测到导入了 @/components/ui/accordion 和 @/components/ui/button
bunx shadcn@canary add accordion button # 以及其他组件

由于 shadcn/ui 本身使用 TailwindCSS,bun create 还会将 TailwindCSS 依赖添加到你的 package.json 中,并配置 bunfig.toml,以便通过 Bun.serve() 使用 Bun 的 TailwindCSS 插件,如前文所述。

bun create 还会设置:

  • tsconfig.json,将 "@/*" 别名指向 "src/*" 或 .(具体取决于是否存在 src/ 目录)
  • components.json,以便 shadcn/ui 知道这是一个 shadcn/ui 项目
  • styles/globals.css 文件,按照 shadcn/ui 的预期配置 Tailwind v4
  • ${component}.build.ts 文件,该文件使用配置了 bun-plugin-tailwind 的方式为生产环境构建组件

使用 bun create ./MyComponent.jsx 可以在本地运行由 Claude 或 ChatGPT 等 LLM 生成的代码。

从 npm 创建

terminal
bun create <template> [<destination>]

如果你没有名称相同的本地模板,此命令会从 npm 下载并运行 create-<template> 包。以下两个命令是等效的:

terminal
bun create remix
bunx create-remix

有关使用说明,请参阅 create-<template> 包的文档。对于 react 和 next,Bun 不会运行任何包;它只会打印一条消息,指向 react-app/vite 和 next-app。

从 GitHub 创建

bun create <user>/<repo> 会将 GitHub 仓库的内容下载到磁盘。

terminal
bun create <user>/<repo>
bun create github.com/<user>/<repo>

可以选择为目标文件夹指定名称。如果不指定,Bun 将使用仓库名称。

terminal
bun create <user>/<repo> mydir
bun create github.com/<user>/<repo> mydir

然后,Bun 会:

  • 下载模板
  • 将所有模板文件复制到目标文件夹
  • 使用 bun install 安装依赖
  • 初始化一个全新的 Git 仓库。使用 --no-git 标志可选择退出。

从本地模板创建

你可以在本地文件系统上定义自定义模板。将它们放在以下目录之一:

  • $HOME/.bun-create/<name>:全局模板目录
  • <项目根目录>/.bun-create/<name>:项目专属模板目录

要创建本地模板,请在 $HOME/.bun-create 中创建一个以模板命名的目录。

bash
cd $HOME/.bun-create
mkdir foo
cd foo

然后,在该目录下创建 package.json 文件,内容如下:

package.json
{
  "name": "foo"
}

在文件系统的其他位置运行 bun create foo,以验证 Bun 是否能找到你的本地模板。

设置逻辑

你可以在本地模板的 package.json 的 "bun-create" 字段中指定安装前后运行的脚本。

package.json
{
  "name": "@bun-examples/simplereact",
  "version": "0.0.1",
  "main": "index.js",
  "dependencies": {
    "react": "^17.0.2",
    "react-dom": "^17.0.2"
  },
  "bun-create": {
    "preinstall": "echo 'Installing...'", // 单条命令
    "postinstall": ["echo 'Done!'"], // 命令数组,会依次执行
    "start": "bun run echo 'Hello world!'"
  }
}

preinstall 和 postinstall 接受字符串或字符串数组。数组中的命令会按顺序运行。

FieldDescription
postinstall在安装依赖后运行
preinstall在安装依赖前运行
startBun 完成后在“To get started, run:”下方打印的命令;默认为 bun dev

克隆模板后,bun create 会从 package.json 中移除 "bun-create" 部分,然后再将其写入目标文件夹。

参考

CLI 参数

参数描述
--force覆盖已存在的文件
--no-install跳过安装 node_modules 和相关任务
--no-git不初始化 git 仓库
--open运行完成后启动并在浏览器中打开

环境变量

名称描述
GITHUB_API_DOMAINBun 下载内容所用的 GitHub 域名。如果你使用 GitHub Enterprise 或代理,请设置此项
GITHUB_TOKEN (or GITHUB_ACCESS_TOKEN)允许 bun create 访问私有仓库并避免速率限制。如果两者都存在,Bun 会优先使用 GITHUB_TOKEN。
关于 bun create 的工作流程

当你运行 bun create ${template} ${destination} 时,流程如下:

如果是远程模板(elysia、elysia-buchta 或 stric;对于任何其他 npm 模板名称,Bun 会将其交给 bunx create-${template} 处理;react 和 next 除外,它们只会打印一条消息,指向 react-app/vite 和 next-app)

  1. GET registry.npmjs.org/@bun-examples/${template}/latest 并解析它
  2. GET registry.npmjs.org/@bun-examples/${template}/-/${template}-${latestVersion}.tgz
  3. 将 ${template}-${latestVersion}.tgz 解压并提取到 ${destination}
    • 如果文件将被覆盖,Bun 会警告并退出,除非你传入 --force

如果是 GitHub 仓库

  1. 从 GitHub 的 API 下载 tarball
  2. 解压并提取到 ${destination}
    • 如果文件将被覆盖,Bun 会警告并退出,除非你传入 --force

如果是本地模板

  1. 打开本地模板文件夹
  2. 递归删除目标目录
  3. 使用可用的最快系统调用递归复制文件(在 macOS 上使用 fcopyfile;在 Linux 上使用 copy_file_range)。如果 node_modules 文件夹存在,请勿复制或遍历该文件夹(仅此一项就使其速度快于 cp)

然后,对于远程模板、GitHub 仓库和本地模板,一律执行以下操作:

  1. 再次解析 package.json,将 name 更新为 ${basename(destination)},从 package.json 中移除 bun-create 部分,并将更新后的 package.json 保存到磁盘。
  2. 运行 "bun-create": { "preinstall" } 中定义的任何任务
  3. 除非你传入 --no-install 或 package.json 中没有依赖,否则运行 bun install
  4. 运行 "bun-create": { "postinstall" } 中定义的任何任务
  5. 运行 git init; git add -A .; git commit -am "Initial Commit";
    • 将 gitignore 重命名为 .gitignore。npm 会从已发布的包中移除 .gitignore 文件。
    • 如果存在依赖,此步骤会在单独的线程中运行,同时 Bun 安装 node_modules
    • 我们测试过在可用时使用 libgit2,它在微基准测试中的速度慢了 3 倍