What is NPM

Node Package Manager

https://www.npmjs.com/
This is the source code for the three-word thingies that randomly appear in the header of the npmjs.com website. Examples include:

  • Naughty Push Message 顽皮的推送消息
  • Nectar of the Programming Masses 编程群众的甘露
  • Never Push to Master 永远不要往master push代码
  • Never Program Mad 不要疯狂编程
  • Neverending Plethora of Modules 无需过多模块
  • Needless Patchouli Manufacture
  • Neil Patrick’s Mansion
  • Newton’s Programmatic Measurements
  • Newts Parading Majestically
  • Nice Poodle, Mister
  • Nickel Plated Moose
  • Nineties Party MixNull Pointer Missing

特点

  • npm is the world’s largest Software Library (Registry)
    npm 是世界上最大的软件注册中心;注册表包含超过800000个代码包;
  • 开源开发人员使用npm共享软件;
  • 许多组织还使用npm管理私有开发。
  • npm is also a software Package Manager and Installer
  • Using npm is Free
    无需任何注册或登录即可下载所有npm公共软件包
  • Command Line Client
    npm包含一个CLI,可用于下载和安装软件
    Windows示例
C:\>npm install <package>

Mac操作系统示例

>npm install <package>

安装与使用

  • npm与Node.js一起安装
  • 必须安装Node.js才能在计算机上安装npm
  • Node Package Manager这个名字源于npm第一次被创建为Node.js的包管理器
  • 所有nom包都在package.json的文件中定义
  • package.json的内容必须用JSON编写
  • 定义文件中必须至少存在两个字段:name和version
{"name" : "foo","version" : "1.2.3","description" : "A package for some things","main" : "foo.js","author" : "xiaoming","licence" : "ISC"
}
  • npm可以管理依赖项,依赖关系也在package.json中定义
    -如果想在npm registry中共享自己的软件,登录后可发布任何包含package.json文件的目录。

What is npx


npx: an npm package runner

  • npm 从5.2版开始,增加了 npx 命令。
  • npx 想要解决的主要问题,就是调用项目内部安装的模块。

npm & npx


npm 本身不运行任何包。如果要使用 npm 运行包,则必须在package.json文件中指定该包。

当通过 npm 包安装可执行文件时,npm 会创建指向它们的链接:

  • 本地安装在./node_modules/.bin/目录中创建了链接
  • 全局安装具有从全局bin/目录创建的链接(例如:在 Linux 上/usr/local/bin或在Windows 上%AppData%/npm)要使用 npm 执行包,您必须输入本地路径,如下所示:
$ ./node_modules/.bin/your-package
  • 或者通过将其添加到package.json脚本部分的文件中来运行本地安装的软件包:
{"name": "your-application","version": "1.0.0","scripts": {"your-package": "your-package"}
}

然后通过npm run命令运行脚本:

npm run your-package

eg:

// 安装mocha包
npm install -D mocha
// npm需要去到对应的bin文件下才能执行
node-modules/.bin/mocha --version

可以看出,普通的npm运行一个包需要相当多的仪式……
Then,npx派上用场啦

// 用npx可以直接执行
npx mocha --version

由于 npm 5.2.0版npx与 npm 预先捆绑在一起。所以它现在几乎是一个标准。

npx也是一个 CLI 工具,其目的是使安装和管理 npm 注册表中托管的依赖项变得容易。

现在可以很容易地运行通常通过 npm 安装的任何类型的基于 Node.js 的可执行文件。

可以运行以下命令来查看是否已为您当前的 npm 版本安装了它:

which npx

如果没有的话,可以通过下面命令安装

npm install -g npx

npx 的原理很简单,就是运行的时候,会到node_modules/.bin路径和环境变量$PATH里面,检查命令是否存在。

由于 npx 会检查环境变量$PATH,所以系统命令也可以调用。

// 等同于 ls
$ npx ls

npx使用

轻松运行本地安装的包

如果想执行一个本地安装的包,你需要做的就是输入:

$ npx your-package

npx 将检查<command>或是否<package>存在于$PATH,或在本地项目二进制文件中,如果存在,它将执行它。

执行以前未安装的包

另一个主要优点是能够执行以前未安装的包。
让我们通过运行来测试一下:

$ npx cowsay wow

避免全局安装模块

npx 还能避免全局安装的模块。比如,create-react-app这个模块是全局安装,npx 可以运行它,而且不进行全局安装。

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

上面代码运行时,npx 将create-react-app下载到一个临时目录,使用以后再删除。所以,以后再次执行上面的命令,会重新下载create-react-app。下载全局模块时,npx 允许指定版本。

$ npx uglify-js@3.1.0 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 node@12.11.0 -v
v12.11.0

上面命令会使用 12.11.0 版本的 Node 执行脚本。原理是从 npm 下载这个版本的 node,使用后再删掉。

某些场景下,这个方法用来切换 Node 版本,要比 nvm 那样的版本管理器方便一些。

-p参数

-p参数用于指定 npx 所要安装的模块,所以上面的命令可以写成下面这样。

$ npx -p node@12.11.0 node -v
v12.11.0

上面命令先指定安装node@12.11.0,然后再执行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 https://github.com/xiaoxiezz/npx.git


注意,远程代码必须是一个模块,即必须包含package.json和入口脚本。

测试不同的包版本

npx 使测试 Node.js 包或模块的不同版本变得非常容易。为了测试这个很棒的功能,我们将在本地安装create-react-app软件包并测试即将推出的版本。
这将在输出末尾附近列出一些 dist 标签。

Dist 标签为版本号提供别名,这使得输入变得更加容易。

$ npm v create-react-app

使用 npx 来试试next dist 标签create-react-app,它将在sandbox目录中创建应用程序。

$ npx create-react-app@next sandbox

npx 将临时安装 的下一个版本create-react-app,然后它将执行以搭建应用程序并安装其依赖项。

安装后,我们可以像这样导航到应用程序:

$ cd sandbox

然后使用以下命令启动它:

$ npm start

它将自动在您的默认浏览器窗口中打开 React 应用程序。现在我们有一个应用程序可以在下一版本的create-react-app包上运行!

总结

  1. npm的m是Management,npx的x可以理解为eXecute。
  2. npx 帮助我们避免版本控制、依赖问题和安装我们只想尝试的不必要的包。
  3. npx还提供了一种清晰而简单的方式来执行包、命令、模块甚至 GitHub 要点和存储库。
  4. npx执行逻辑
    1. 默认情况下,npx首先会去检查是否当前路径下(即在项目中)是否存在要执行的包;
    2. 若存在对应的包,则执行它;
    3. 若不存在,则认为路径下不存在该包,则npx会去安装最新版本的包,并且去执行它。
    4. 使用 npx 去执行包时,会保证使用的是最新的构建工具,无需担心包版本升级的问题

参考连接

npm与npx有什么区别?
npx的使用-动图好评
阮一峰npx 使用教程

npx的使用与npm相关推荐

  1. 从npm、npx说起,到shell

    背景:目前整个我们前端工程栈有多处 CLI(包括工具.模板等等),CLI 带来了巨大的便利性,但其在 Windows 下执行往往和 Mac/Unix 系统下表现不同.今天想从 npm run < ...

  2. Node.js 官网入门教程(二) npm(安装、包版本、卸载、npx)、package.json(scripts、devDependencies)package-lock.json(语义版本规则符号

    Node.js 官网入门教程(二) npm(包管理.安装.包版本.卸载.npx).package.json(scripts.devDependencies).package-lock.json(语义版 ...

  3. 【混淆系列】三问:npx、npm、cnpm、pnpm确定搞明白了?

    大家好,我是猫小白,本文继续输出前端混淆知识点系列第三问.致力于夯实基础.消灭模糊知识点. 往期[混淆知识]传送门: 一问:module.exports.exports.export都是导出,有何区别 ...

  4. 了解和理解npm、npx、nvm、nrm

    提示:了解和理解npm.npx.nvm.nrm npm.npx.nvm.nrm 前言 一.npm 是什么?npx 呢? 1.npm 2.npx 二.什么是 nvm ? 1.是什么 2.使用场景 3.常 ...

  5. npm和npx的区别

    npx是一个工具,它是npm v5.2.0引入的一条命令(npx),是npm的一个包执行器,只要为了提高从npm注册表使用软件包的体验 . npm使得它非常容易地安装和管理托管在注册表上的依赖项, n ...

  6. Vue3学习笔记- NPM包管理工具

    导语   这篇分享是关于Vue3 系列的学习知识的整理的开始,能够对大家学习带来帮助.也是对自己能力的一种提升. 学习大纲 认识NPM 安装NPM 使用NPM NPM中级用法 了解package.js ...

  7. npm和package.json那些不为常人所知的小秘密

    此文已由作者黄锴授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 强大的命令功能 如果你没使用过script,那你可算是从来没手动编辑过package.json.script作 ...

  8. nodeJS与npx之间的三两事

    Node.js 是一个基于V8 JavaScript 引擎却又运行在浏览器之外的.开源的.跨平台的 JavaScript 运行时环境.前端开发的同学都很熟悉,在安装了NodeJS之后,除了node命令 ...

  9. 如果当面试官问你懂不懂npm,你知道怎么说吗?

    1. 包管理器npm介绍 1.1 什么是npm NPM的全称是Node Package Manager,是一个NodeJS包管理和分发工具,已经成为了非官方的发布Node模块(包)的标准. 2020年 ...

最新文章

  1. MATLAB实战系列(十六)-2021年大学生数学建模美赛竞赛赛题及问题解析
  2. 计算机三级网络技术注意事项,2015计算机三级考试《网络技术》复习要点:压缩技术...
  3. 深入浅出Java多线程
  4. 为什么REST如此重要
  5. 晨风机器人怎么买奴隶_潮牌复刻和正品该怎么抉择???带你了解了解
  6. 通过反射获得私有构造器,创建对象
  7. java 超构造函数_java中的超级构造函数
  8. JAVA实现onvif的ptz控制_使用Onvif协议进行设备PTZ云台控制
  9. 枚举ENUM的tostring() valueof()name()和values()用法
  10. 任务型对话(一)—— NLU/SLU(意识识别和槽值填充)
  11. 在线二进制转文本工具
  12. sublime----------快捷键的记录
  13. 六、利用ESP32搭建网络服务器(一)
  14. 【转】虚拟 IO 服务器(VIOS)和 IBM i
  15. win 10iis php7,win10下设置IIS、安装php7.2
  16. 鲁毅智权力交接:对AMD的影响还将继续
  17. Tslint检查下代码JavaScript(angular)规范
  18. 译:Convolutional Two-Stream Network Fusion for Video Action Recognition
  19. HCIA-Intelligent Computing 题目汇总
  20. odoo中的消息通知

热门文章

  1. Vivado简单双端口RAM 使用,问题探析
  2. win10:我们无法创建新的分区,也找不到现有的分区,
  3. 基于javaweb新生入学报到系统
  4. double类型解析
  5. 如何在matlab更改simulink程序中电容元件的电容值
  6. 字符串/链接在线转二维码
  7. 微信支付同时回调多次的解决办法
  8. 电磁铁没有了磁性怎么办
  9. 郑州轻工业大学OJ-zznuoj-1007-鸡兔同笼
  10. 统信UOS系统格式化U盘方法