慣性聚合 高效追蹤和閱讀你感興趣的部落格、新聞、科技資訊
閱讀原文 在慣性聚合中打開

推薦訂閱源

博客园 - 司徒正美
V
V2EX
T
Tailwind CSS Blog
有赞技术团队
有赞技术团队
aimingoo的专栏
aimingoo的专栏
Apple Machine Learning Research
Apple Machine Learning Research
IT之家
IT之家
Blog — PlanetScale
Blog — PlanetScale
A
About on SuperTechFans
月光博客
月光博客
T
The Blog of Author Tim Ferriss
宝玉的分享
宝玉的分享
Martin Fowler
Martin Fowler
博客园 - 聂微东
The GitHub Blog
The GitHub Blog
V
Visual Studio Blog
WordPress大学
WordPress大学
酷 壳 – CoolShell
酷 壳 – CoolShell
Engineering at Meta
Engineering at Meta
GbyAI
GbyAI

阮一峰的网络日志

科技爱好者周刊(第 396 期):互联网通信的替代方案 科技爱好者周刊(第 396 期):互联网通信的替代方案 - 阮一峰的网络日志 科技爱好者周刊(第 395 期):软件开发的第三种方式 科技爱好者周刊(第 395 期):软件开发的第三种方式 - 阮一峰的网络日志 科技爱好者周刊(第 393 期):脑腐状态 科技爱好者周刊(第 392 期):axios 投毒与好莱坞式骗术 科技爱好者周刊(第 391 期):AI 的贫富分化 科技爱好者周刊(第 390 期):没有语料,大模型就是智障 套壳中国大模型撑起500亿美元估值?扒一扒 Cursor 的"套壳"疑云 科技爱好者周刊(第 389 期):未来如何招聘程序员 科技爱好者周刊(第 388 期):测试是新的护城河 零安装的"云养虾":ArkClaw 使用指南 科技爱好者周刊(第 387 期):你是领先的 科技爱好者周刊(第 386 期):当外卖员接入 AI 字节全家桶 Seed 2.0 + TRAE 玩转 Skill 科技爱好者周刊(第 385 期):马斯克害怕中国车企吗? 智谱旗舰 GLM-5 实测:对比 Opus 4.6 和 GPT-5.3-Codex 科技爱好者周刊(第 384 期):为什么软件股下跌 科技爱好者周刊(第 383 期):你是第几级 AI 编程 Kimi 的一体化,Manus 的分层 科技爱好者周刊(第 382 期):独立软件的黄昏 AI native Workspace 也许是智能体的下一阶段 科技爱好者周刊(第 381 期):中国 AI 大模型领导者在想什么 科技爱好者周刊(第 380 期):为什么人们拥抱"不对称收益" 科技爱好者周刊(第 379 期):《硅谷钢铁侠》摘录 我如何用 AI 处理历史遗留代码:MiniMax M2.1 升级体验 科技爱好者周刊(第 378 期):预测是新的互联网热点 科技爱好者周刊(第 377 期):14万美元的贫困线 科技爱好者周刊(第 376 期):太空数据中心的争议 科技爱好者周刊(第 375 期):一扇门的 Bug 终于有人做了 Subagent,TRAE 国内版 SOLO 模式来了 科技爱好者周刊(第 374 期):6GHz 的问题 VS Code 使用国产大模型 MiniMax M2 教程 科技爱好者周刊(第 373 期):数据模型是新产品的核心 国产大模型接入 Claude Code 教程:以 Doubao-Seed-Code 为例 科技爱好者周刊(第 372 期):软件界面如何设计 大模型比拼:MiniMax M2 vs GLM 4.6 vs Claude Sonnet 4.5 科技爱好者周刊(第 371 期):一个乐观主义者的专访 科技爱好者周刊(第 370 期):正确的代码高亮 错误处理:异常好于状态码 科技爱好者周刊(第 369 期):Tim 与罗永浩的对谈 科技爱好者周刊(第 368 期):不要这样管理软件团队 一天之内,智谱和 Anthropic 都发了最强编程模型 科技爱好者周刊(第 367 期):Nano Banana 的几个妙用 科技爱好者周刊(第 366 期):旧金山疯狂的 AI 广告 科技爱好者周刊(第 365 期):流量变现正在崩塌 科技爱好者周刊(第 364 期):最难还原的魔方 科技爱好者周刊(第 363 期):最好懂的神经网络解释 科技爱好者周刊(第 362 期):GitHub 工程师谈系统设计 科技爱好者周刊(第 361 期):暗网 Tor 安全吗?
npx 使用教程
阮一峰 · 2019-02-09 · via 阮一峰的网络日志

npm 從5.2版開始,增加了 npx 命令。它有很多用處,本文介紹該命令的主要使用場景。

Node 自帶 npm 模塊,所以可以直接使用 npx 命令。萬一不能用,就要手動安裝一下。


$ npm install -g npx

調用項目安裝的模塊

npx 想要解決的主要問題,就是調用項目內部安裝的模塊。比如,項目內部安裝了測試工具 Mocha


$ npm install -D mocha

一般來說,調用 Mocha ,只能在項目腳本和 package.json 的scripts字段裡面, 如果想在命令行下調用,必須像下面這樣。


# 項目的根目錄下執行
$ node-modules/.bin/mocha --version

npx 就是想解決這個問題,讓項目內部安裝的模塊用起來更方便,只要像下面這樣調用就行了。


$ npx mocha --version

npx 的原理很簡單,就是運行的時候,會到node_modules/.bin路徑和環境變量$PATH裡面,檢查命令是否存在。

由於 npx 會檢查環境變量$PATH,所以系統命令也可以調用。


# 等同於 ls
$ npx ls

注意,Bash 內置的命令不在$PATH裡面,所以不能用。比如,cd是 Bash 命令,因此就不能用npx cd

避免全局安裝模塊

除了調用項目內部模塊,npx 還能避免全局安裝的模塊。比如,create-react-app這個模塊是全局安裝,npx 可以運行它,而且不進行全局安裝。


$ npx create-react-app my-react-app

上面代碼運行時,npx 將create-react-app下載到一個臨時目錄,使用以後再刪除。所以,以後再次執行上面的命令,會重新下載create-react-app

下載全局模塊時,npx 允許指定版本。


$ npx [email protected] main.js -o ./dist/main.js

上面代碼指定使用 3.1.0 版本的uglify-js壓縮腳本。

注意,只要 npx 後面的模塊無法在本地發現,就會下載同名模塊。比如,本地沒有安裝http-server模塊,下面的命令會自動下載該模塊,在當前目錄啟動一個 Web 服務。


$ npx http-server

--no-install 參數和--ignore-existing 參數

如果想讓 npx 強制使用本地模塊,不下載遠程模塊,可以使用--no-install參數。如果本地不存在該模塊,就會報錯。


$ npx --no-install http-server

反過來,如果忽略本地的同名模塊,強制安裝使用遠程模塊,可以使用--ignore-existing參數。比如,本地已經全局安裝了create-react-app,但還是想使用遠程模塊,就用這個參數。


$ npx --ignore-existing create-react-app my-react-app

使用不同版本的 node

利用 npx 可以下載模塊這個特點,可以指定某個版本的 Node 運行腳本。它的竅門就是使用 npm 的 node 模塊


$ npx [email protected] -v
v0.12.8

上面命令會使用 0.12.8 版本的 Node 執行腳本。原理是從 npm 下載這個版本的 node,使用後再刪掉。

某些場景下,這個方法用來切換 Node 版本,要比 nvm 那樣的版本管理器方便一些。

-p 參數

-p參數用於指定 npx 所要安裝的模塊,所以上一節的命令可以寫成下面這樣。


$ npx -p [email protected] node -v 
v0.12.8

上面命令先指定安裝[email protected],然後再執行node -v命令。

-p參數對於需要安裝多個模塊的場景很有用。


$ npx -p lolcatjs -p cowsay [command]

-c 參數

如果 npx 安裝多個模塊,默認情況下,所執行的命令之中,只有第一個可執行項會使用 npx 安裝的模塊,後面的可執行項還是會交給 Shell 解釋。


$ npx -p lolcatjs -p cowsay 'cowsay hello | lolcatjs'
# 報錯

上面代碼中,cowsay hello | lolcatjs執行時會報錯,原因是第一項cowsay由 npx 解釋,而第二項命令localcatjs由 Shell 解釋,但是lolcatjs並沒有全局安裝,所以報錯。

-c參數可以將所有命令都用 npx 解釋。有了它,下面代碼就可以正常執行了。


$ npx -p lolcatjs -p cowsay -c 'cowsay hello | lolcatjs'

-c參數的另一個作用,是將環境變量帶入所要執行的命令。舉例來說,npm 提供當前項目的一些環境變量,可以用下面的命令查看。


$ npm run env | grep npm_

-c參數可以把這些 npm 的環境變量帶入 npx 命令。


$ npx -c 'echo "$npm_package_name"'

上面代碼會輸出當前項目的項目名。

執行 GitHub 源碼

npx 還可以執行 GitHub 上面的模塊源碼。


# 執行 Gist 代碼
$ npx https://gist.github.com/zkat/4bc19503fe9e9309e2bfaa2c58074d32

# 執行倉庫代碼
$ npx github:piuccio/cowsay hello

注意,遠程代碼必須是一個模塊,即必須包含package.json和入口腳本。

參考鏈接

(完)