Link
https://docs.npmjs.com/cli/v8/commands/npm-version
npx 是什么?
npx
是 npm 5.2
版本及以上自带的一个工具,主要的功能是便捷地帮助用户执行pkg
中的某个可执行的文件
npx 的作用?
无需全局安装某个包就能直接运行其提供的命令,并且还能临时使用特定版本的包。
当使用 npx
执行某个包的命令时,它会先检查本地项目的 node_modules/.bin
目录中是否存在该可执行文件。若不存在,npx
会临时下载该包,执行命令,之后(默认情况下)会删除下载的包。
npx 的使用
使用方式1:npx --<pkg>[@version] [args]
使用npx
执行指定的包,并且可以传递任意数量的参数
e.g. npx -- eslint@7 --fix src
Hint:
你可以选择指定包的版本。如果不指定版本,npx
会使用包的最新稳定版本
使用方式2: npx --package=<pkg>[@<version>] -- <cmd> [args...]
npx --package=eslint@7.32.0 -- eslint --fix src
使用方式3:npx -c '<cmd> [args...]'
npx -c 'prettier --write src && eslint src'
使用方式4: npx --package=foo -c '<cmd> [args...]'
npx --package=eslint -c 'eslint --fix src'
and the like. === etc.
解释
npx
指令允许你运行来自包(本地安装的或者是从远程拉取的)中的任意指令,类似于通过 npm run
运行的上下文通过
--package
选项指定的任意包将会被提供到PATH
的可执行指令之中,也会在本地安装包的可执行文件。--package
选项在一个环境中可以被指定多次,来执行包提供的指令。如果需要的包不在本地依赖中,
npx
会将包安装在npm cache
中,也就是在可执行的进程中提供需要的指令。会打印一个提示(可以通过 --yes
或者 --no
来抑制这个弹框)
未使用说明符的包名成,npx 会自动来匹配本地项目的任意版本。 带有说明符的包只会在本地的拥有相同的名称和版本的时候相匹配。
如果-c
或-call
选项未被提供,该位置的参数会用来生成一个指令字符串。假如--package
未被提供,npm 将会尝试尝试决定可以执行包的说明符。
- 假如包在
package.json
存在一个bin
入口,或者所有的入口通过相同的指令定义别名,然后指令会被使用。 - 假如包存在多个
bin
入口,并且其中的一个bin
入口,匹配名称未受范围限制的一部分,这个指令会被使用 - 假如这不会导致任意确认的参数(要么没有
bin
入口,要么没有全部不匹配),npm exec
会抛出错误
要运行除命名二进制文件之外的二进制文件,请指定一个或多个--package 选项
,这将阻止 npm 从第一个命令参数推断包
npm exec vs. npx
npm x
npm x
是 npm 7
及以上版本提供的一个命令,其功能和 npx
类似。它允许用户直接运行 npm 包中的可执行脚本,而无需事先全局安装这些包。如果本地项目的 node_modules/.bin
目录中存在相应的可执行文件,npm x
会直接使用它;如果不存在,npm x
会临时下载对应的包,执行命令,之后(默认情况下)会删除下载的包。
通过npx
二进制运行指令时,所有的标志和参数必须在任意参数之前设置。当通过npm exec
运行指令时,可以通过--
标志来抑制npm
解析对应该发送到指令指令的参数和开关.
比如:
npx foo@latest bar --package=@npmcli/foo
foo bar --package=@npmcli/foo
其中--package=@npmcli/foo
被视作指令的参数.
相反,由于npm exec
的解析逻辑不同,执行指令的结果是不同的.
npm exec foo@latest bar --package=@npmcli/foo
npm 会先解析--package
选项,解析@npmcli/foo
包,最后运行指令
foo@latest bar
此时需要添加--
npm -- exec foo@latest bar --package=@npmcli/foo
版本更新&兼容性
npx
二进制文件在 npm v7
(Node 15) 中被重写,并且独立 npx
包当时已被弃用。npx
使用 npm exec
命令而不是单独的参数解析器和安装过程,并具有一些功能以保持与以前版本中接受的参数的向后兼容性
some shifts:
- 使用
-y
或者--yes
抑制prompt -
--no-install
transfer to--no
-
-p
参数是npm
中--parseable
的简写,但也是npx
中--package
的简写。此参数保留,但仅适用于npx
可执行文件
Magics
- 向后兼容 & 向前兼容
向后兼容指的是兼容旧版本;向前兼容指的是兼容新版本
- 难度差异:通常情况下,实现向后兼容相对容易一些,因为开发者可以在新版本中对旧版本的特性进行保留和适配;而实现向前兼容往往更具挑战性,因为旧版本在设计时很难预见未来新版本的所有变化。
- 侧重点不同:向后兼容主要关注用户从旧版本升级到新版本的体验,鼓励用户及时更新软件或系统;向前兼容则更侧重于保护旧版本用户的权益,让他们在一段时间内能够继续使用旧版本并与新版本进行有限的交互。
Tech Design
-
bin
的别名设计alias spring-cli='sc'
-
npx
不再安装包 -
npx
是否需要prompt
(涉及npm
版本的一个兼容)