浅析npm参数init,create,exec

  目录

npm [init,create,exec,innit],npx的使用

npm exec

1
2
3
4
5
// pkg是包名
npm exec <pkg>
// 还有一种简写形式
// npm官方文档中指出x,其实就是exec的别名,npm exec、npm x,两个命令是完全等价的。
npm x <pkg>

npm exec <pkg>的执行流程

  • 在本地查找是否有<pkg>对应的npm包,若找到,则运行这个包的package.jsonbin字段对应的可执行文件,若未找到,在远程npm仓库查找是否有<pkg>对应的npm包,若找到,则下载到本地,下载完成后运行这个包package.jsonbin字段对应的可执行文件。
  • 在执行bin字段有几点注意的,如果bin只有一个入口,那么可以执行,如果bin有多个入口,则寻找和包名一样的那个入口,如果没找到,则npm exec <pkg>报错。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    create-vite这个npm包的package.json
    {
    "name": "create-vite"
    "bin": {
    "create-vite": "index.js",
    "cva": "index.js"
    }
    ...
    }

npm exec <pkg>的执行案例

create-vite这个包为例子
执行npm exec crate-vite这条命令后,首先本地查找是否有create-vite这个npm包,找到,则运行create-vite这个npm包中的package.jsonbin字段对应的可执行文件,即index.js这个文件。若未找到,在远程npm仓库查找是否有create-vite这个包,如果有,则下载到本地,并执行package.jsonbin字段对应的可执行文件。

npx

npm文档中提到:npx的二进制文件在npm v7.0.0中被重写,而独立的npx包在当时已弃用。npx使用npm exec命令,而不是单独的参数解析器和安装过程。并提供了一些支持,以保持与它在以前版本中接受的参数的向后兼容性。
因此:

1
2
npx = npm exec
npx = npm x

所以上面的npm exec create-vite也可以使用npx create-vite去执行

npm init

1
2
npm init
npm init <initializer>

无initializer

后面没有<initializer>是用来创建package.json文件

有initializer

这里的npm init <initializer>实际会调用npm exec create-<initializer>, 也相当于npx create-<initializer>
比如在使用vite时,npm init vite,实际是执行npm exec create-vite

npm create,npm innit

npm官方文档中指出create,innit其实就是init的别名,也就是说npm init,npm create,npm innit三个命令是完全等价的。