Appearance
npm create xxx / npx create-xxx 里 create 到底做了什么
更新: 6/28/2026 字数: 0 字 时长: 0 分钟
先给结论:create 不是一个独立命令,它是一个"包名简写约定"。 当你敲 npm create vite,npm 会把 vite 自动补全成包名 create-vite,下载并运行这个脚手架包,由它替你把整个项目目录生成出来。整个过程的本质,就是"下载一个专门负责建项目的工具包并执行它"。
下面把这套机制按执行顺序讲清楚。
一、create 的本质:包名约定,不是新功能

npm 生态有个命名约定:脚手架工具包都以 create- 开头命名,比如 create-vite、create-react-app、create-next-app。
npm create 和 npm init 是同一个命令(create 是 init 的别名)。它的规则很简单:
- 你写
npm create vite→ npm 理解成"我要用create-vite这个包来初始化项目"; - 你写
npm create react-app→ 对应create-react-app。
所以 create 本身没有"创建"的魔法,它只是约定了一条路径:把你给的名字补成 create-xxx 包名,然后去把这个包跑起来。真正干活、生成文件的是那个脚手架包,不是 npm。
二、名称补全与包查找

补全规则有几种情况,理解了就不会被各种写法绕晕:
- 普通包:
create vite→create-vite。 - 带作用域的包(scoped):
npm create @scope/my-app→@scope/create-my-app。补全时把create-插到作用域后面,而不是最前面。 - 只写作用域:
npm create @scope→@scope/create(用作用域下默认的 create 包)。
补全出完整包名后,npm 会去 npm 仓库查找并下载这个包。@latest 这类标签(如 npm create vite@latest)就是告诉它每次都拉取最新版本,避免用到本地缓存的旧脚手架。
三、完整执行流程(四步)

以 npm create vite@latest my-app 为例,从敲回车到项目生成,内部走了这几步:
- 补全包名:把
vite补全成create-vite。 - 获取并执行包:
npm create底层调用npx去下载create-vite,放进一个临时缓存目录(不会污染全局,也不会装进当前项目的依赖里)。 - 运行脚手架的可执行文件:每个
create-xxx包的package.json里都声明了bin字段,指向它的入口脚本。npx 找到这个bin并执行它。 - 脚手架接管,生成项目:从这一步起就是脚手架自己的逻辑了——询问你项目名、选模板(Vue/React/TS…)、然后把模板文件拷贝到目标目录,生成
package.json、src、配置文件等完整结构。你后面看到的交互式选项,全是脚手架包提供的,跟 npm 无关。
跑完后,临时下载的脚手架包用完即弃,你的机器上只留下生成好的项目目录。
四、npm 不同版本的行为差异
npm create 的可用性和底层实现,和 npm 版本强相关:
- npm 5.2 以前:没有
npx,也没有这套create简写。想用脚手架得先npm install -g create-react-app全局安装,再手动运行命令。麻烦,而且全局装的工具容易版本过时。 - npm 5.2+(2017 年起):内置了
npx,create简写开始可用。npm init <name>/npm create <name>会借助 npx 临时下载并运行create-<name>,不用再全局安装。 - npm 6.x:这套机制稳定下来,成为社区主流用法,
create-react-app、create-vite等大量脚手架都基于它。 - npm 7+ / 较新版本:
npx行为更严格——如果要执行的包本地没有,会先弹出确认提示(防止误执行同名恶意包),确认后才下载执行。补全规则、scoped 包的处理也更规范。
npm create xxx、npm init xxx、npx create-xxx 三者最终殊途同归:都是"找到 create-xxx 包并运行它的 bin"。区别只是 npm create/npm init 帮你做了 create- 前缀补全,而 npx create-xxx 需要你写全包名。
五、常见误区
- 误区一:以为
create是 npm 内置的"创建项目"功能。实际它只是包名简写,真正建项目的是create-xxx那个第三方脚手架包。 - 误区二:以为脚手架包被安装到了项目里或全局。它只是临时下载到缓存执行,用完即弃,不进
dependencies,也不常驻全局。 - 误区三:分不清
npm create vite和npx create-vite。两者等价,前者是后者的简写形式,npm 自动补上了create-前缀。 - 误区四:忽略
@latest导致用了旧脚手架。不带版本标签时可能命中本地缓存的旧版本,生成过时的模板。建项目时建议带上@latest确保用最新脚手架。 - 误区五:把脚手架的交互选项当成 npm 的功能。选模板、配 TS、装不装路由这些问答,都是脚手架包自己实现的,跟 npm/npx 没关系。
一句话总结
| 概念 | 真相 |
|---|---|
create 是什么 | npm init 的别名,一个包名简写约定,非创建功能本身 |
| 补全规则 | xxx → create-xxx;@scope/xxx → @scope/create-xxx |
| 谁在建项目 | 下载下来的 create-xxx 脚手架包,通过它的 bin 执行 |
| 包去哪了 | 临时缓存、用完即弃,不入项目依赖、不常驻全局 |
| 版本要求 | npm 5.2+ 才支持,npm 7+ 执行更严格、会提示确认 |