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 foo | npm exec create-foo |
npm create @usr/foo | npm exec @usr/create-foo |
npm create @usr | npm exec @usr/create |
npm create @usr@2.0.0 | npm exec @usr/create@2.0.0 |
npm create @usr/foo@2.0.0 | npm 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 命令精讲(原生模块源码重编译)