Npx vs. Npm

Link

https://docs.npmjs.com/cli/v8/commands/npm-version

npx 是什么?

npxnpm 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 xnpm 7 及以上版本提供的一个命令,其功能和 npx 类似。它允许用户直接运行 npm 包中的可执行脚本,而无需事先全局安装这些包。如果本地项目的 node_modules/.bin 目录中存在相应的可执行文件,npm x 会直接使用它;如果不存在,npm x 会临时下载对应的包,执行命令,之后(默认情况下)会删除下载的包。

image.png

通过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 命令而不是单独的参数解析器和安装过程,并具有一些功能以保持与以前版本中接受的参数的向后兼容性

image.png

some shifts:

  • 使用-y或者--yes抑制prompt
  • --no-install transfer to --no
  • -p 参数是 npm--parseable 的简写,但也是 npx--package 的简写。此参数保留,但仅适用于 npx 可执行文件

Magics

  • 向后兼容 & 向前兼容

向后兼容指的是兼容旧版本;向前兼容指的是兼容新版本

  1. 难度差异:通常情况下,实现向后兼容相对容易一些,因为开发者可以在新版本中对旧版本的特性进行保留和适配;而实现向前兼容往往更具挑战性,因为旧版本在设计时很难预见未来新版本的所有变化。
  2. 侧重点不同:向后兼容主要关注用户从旧版本升级到新版本的体验,鼓励用户及时更新软件或系统;向前兼容则更侧重于保护旧版本用户的权益,让他们在一段时间内能够继续使用旧版本并与新版本进行有限的交互。

Tech Design

  • bin 的别名设计 alias spring-cli='sc'
  • npx不再安装包
  • npx是否需要 prompt(涉及npm版本的一个兼容)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 229,565评论 6 539
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 99,115评论 3 423
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 177,577评论 0 382
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 63,514评论 1 316
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 72,234评论 6 410
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 55,621评论 1 326
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 43,641评论 3 444
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 42,822评论 0 289
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 49,380评论 1 335
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 41,128评论 3 356
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 43,319评论 1 371
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 38,879评论 5 362
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,548评论 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 34,970评论 0 28
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 36,229评论 1 291
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 52,048评论 3 397
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 48,285评论 2 376

推荐阅读更多精彩内容