npm create命令详解

1. 前言

今天使用npm create tauri-app时候发现npm不是简单的创建一个nodejs工程, 其还做了很多特定于tauri相关的操作, 顿时感到这个命令不单纯, 这个命令可能还能干很多活, 迅速燃起了研究的兴趣, 于是写下了这篇文章.

2. npm create

npm create实际上是npm init 的一个别名, npm init的语法如下:

1
2
3

npm init <initializer>

所以回到我们前言中提到的npm create tauri-app, 这里的tauri-app是一个initializer.

initializer是一个名为create-<initializer>的npm包,它将由npm-exec安装,然后执行包的main bin来创建或更新package.json并运行任何其他与初始化相关的操作。

init命令转换为相应的npm exec操作,如下所示:

1
2
3
4
5
6
7

npm init foo -> npm exec create-foo
npm init @usr/foo -> npm exec @usr/create-foo
npm init @usr -> npm exec @usr/create
npm init @usr@2.0.0 -> npm exec @usr/create@2.0.0
npm init @usr/foo@2.0.0 -> npm exec @usr/create-foo@2.0.0

注意: 1, 如果用户已经全局安装了create-<initializer>包,那么npm init将使用该包。如果希望npm使用最新版本或其他特定版本,则必须指定它
2, 如果不提供initializer 即npm init, 那么init将回退到legacy模式, 它会问你一堆问题,然后为你写一个package.json。它将尝试根据现有字段、依赖项和所选选项进行合理的猜测。

3. 指定initializer版本

如果你想使用特定版本的initializer, 可以参考如下命令:

1
2
3
4
5
6
7

npm init initializer@latest # 使用最新版本的initializer

# 或者

npm init initializer@1.2.3 # 使用1.2.3版本的initializer

4. 传递参数

在使用initializer的过程中, 默认参数往往是不足够够的, 在交互模式下initializer可以通过提问的方式让用户输入参数.
在无人值守的的情况下, 或者我们需要改变initializer更多默认行为的时候, 则需要通过命令行的将参数提供给initializer, 因为这里的主命令是npm或者npm init, initializer只是其中一个子命令, 这时需要通过npm将参数传递给initializer, 其语法格式如下:

1
npm init initializer -- --hello

需要使用 -- 分割 npm参数与init参数.

为了更好地说明如何转发选项,这里有一个更为深入的示例,显示了传递给npm-cli和initializer的参数,以下两个命令是等效的:

1
2
3
npm init foo -y --registry=<url> -- --hello -a
#等效于
npm exec -y --registry=<url> -- create-foo --hello -a

这里的-y --registry=<url>npm exc的参数, 而--hello -a为create-foo这个initializer的参数.

至此npm create的基本用法讲解完了, 更多用法可以参考npm init文档

5. 相关文章

本文原文位于鹏叔的技术博客 - npm create命令详解, 需要获得最近更新请访问原文. 更多nodejs相关文章请访问鹏叔的技术博客 - nodejs

6. 参考资料

npm create 命令

npm-init