npm 自带的项目脚手架入口,本质是 npm init 的别名(npm init 有两个别名:create 和 innit)。带模板名时把请求转发给 npm exec 去执行对应的 create-* 包,一条命令拉好项目骨架,无需全局安装脚手架工具;不带参数则退回 legacy 行为,交互式生成 package.json。

机制一句话

npm create <x>  ≡  npm init <x>  ≡  npm exec create-<x>

create-<x> 由 npm 按 npx 的机制临时下载并执行其主 bin,用完不留在项目依赖里。所以 npm create 只是比 npx create-* 更语义化的糖。

映射规则

命令实际执行
npm create foonpm exec create-foo
npm create @usr/foonpm exec @usr/create-foo
npm create @usrnpm exec @usr/create
npm create @usr@2.0.0npm exec @usr/create@2.0.0
npm create @usr/foo@2.0.0npm exec @usr/create-foo@2.0.0

注意 scoped 包的映射:create- 插在 scope 之后(@usr/create-foo),不是拼在最前面,这是最容易记反的地方。

常用脚手架

npm create vite@latest          # 多框架(react/vue/svelte/solid/lit/preact/qwik,可加 -ts)
npm create next-app             # Next.js
npm create nuxt                 # Nuxt 3
npm create astro                # Astro
npm create remix                # Remix
npm create t3-app               # T3 Stack(Next+tRPC+Prisma+Tailwind)
npm create electron             # Electron 应用

裸 init:只生成 package.json

不带 initializer 时退回 legacy 行为:

npm create            # 交互式问答生成 package.json(基于现有字段做合理猜测,纯增量不覆盖已有值)
npm create -y         # --yes,跳过问答直接生成默认 package.json
npm create --scope=@myorg   # 生成带 scope 的包名 @myorg/<dir>

选项透传

-- 之后的参数原样转发给脚手架工具,之前的留给 npm:

npm create vite my-app -- --template react-ts
# 等价于
npm exec -- create-vite my-app --template react-ts
 
# npm 选项与 create 选项混用(两条等价)
npm create foo -y --registry=<url> -- --hello -a
npm exec -y --registry=<url> -- create-foo --hello -a

版本控制

npm create vite           # 用本地/全局已有版本
npm create vite@latest    # 强制从 registry 拉最新
npm create vite@5         # 锁定大版本

坑:若本机已全局安装过 create-vite,npm create vite 会直接用全局那份;想要最新必须显式 @latest。

Workspaces(monorepo)

npm create -w packages/foo          # 在 monorepo 里新建子包,并自动登记到根 package.json 的 workspaces
npm create -w packages/app react-app .   # 用 create-react-app 生成嵌套 workspace("." 表示当前新建目录)

npm exec 在新建的 workspace 目录上下文里执行,所以 initializer 后用 . 指代目标目录。

自定义 init 模板与默认值

  • 自定义 legacy init 的问答/字段:在家目录建 ~/.npm-init.js(init-module 配置),用 prompt() 加问题、导出对象加自定义字段。
  • 预填生成字段:npm config set init-author-name / init-author-url / init-license / init-version,或 .npmrc 里的 init.*。

踩坑点

  • npm create foo 与 npx create-foo 完全等价,create 只是更顺手的别名,不是新机制。
  • 全局装过的 create-* 会被优先使用,要最新需显式 @latest。
  • 透传参数必须走 --,否则会被 npm 自己吃掉。
  • scoped 映射是 @usr/create-foo(scope 后插 create-),易记反。
  • npm create(无参)/ npm create -y 只生成 package.json,不搭项目骨架。

与同类工具对比

  • vs npx create-*:完全等价,npm create 更语义化。
  • vs npm init:同一命令,create 是 init 的别名。
  • vs pnpm / yarn / bun:各家都提供等价的 pnpm create / yarn create / bun create 入口,沿用同一套 create-* 约定。

相关

  • README — npm 命令总览(本页是其中的脚手架能力展开)
  • npx — npm exec/npx 执行机制(npm create 的底层依赖)
  • package-json — 裸 init 生成的目标文件
  • npm-rebuild-build-from-source — npm rebuild 命令精讲(原生模块源码重编译)