浅析npx和npm之间的关系与区别、npx主要特点、使用npx主要解决什么问题、npm init与npx区别

一、npm 与 npx

1、npm 全称Node Package Manager,它是Node.js的软件包管理器,其目标是自动化的依赖性和软件包管理。这意味着,可以在package.json文件中为项目指定所有依赖项(软件包),当需要为其安装依赖项时,只要运行npm install就可以。

  npm 本身不能够执行任何包,对于本地项目的包,如果想要执行,则需要写入到 package.json 里面,然后通过 npm 来解析 package.json 文件,解析到包的 bin 文件路径,在 bash 中执行。

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

  就像npm极大地提升了我们安装和管理包依赖的体验,在npm的基础之上,npx让npm包中的命令行工具和其他可执行文件在使用上变得更加简单。它极大地简化了我们之前使用纯粹的npm时所需要的大量步骤。

  所以现在大部分的开发者都可以直接使用到 npx 的功能。npx 仍然是一个简单的 cli 工具,来让我们更加方便的执行一些 npm 包,而不用通过 npm 来将包安装到开发者的电脑上面。

3、npx 的主要特点:

(1)临时安装可执行依赖包,不用全局安装,不用担心长期的污染

(2)可以执行依赖包中的命令,安装完成自动运行

(3)自动加载node_modules中依赖包,不用指定$PATH

(4)可以指定node版本、命令的版本,解决了不同项目使用不同版本的命令的问题

二、npx 与 npm 主要区别

1、一个永远存在,一个临时安装,用完后删除

// 例子:用创建一个react项目的对比
// npm 创建
npm install -g create-react-app
create-react-app test-app

//npx 创建
npx create-react-app test-app

  区别:npm他会在本地全局性的安装create-react-app,这个包会存储在node目录下面去,以后创建react项目直接执行create-react-app命令就可以了。

  npx 命令他会把create-react-app安装包临时安装上,等项目初始化完成以后,就删除掉。

2、npx 可以执行依赖包里的二进制文件

// 例子:执行webpack里面的文件
// npm执行
npm i -D webpack ./node_modules/.bin/webpack -v
// 结果是:6.9.0
// 或者执行
npm i -D webpack `npm bin` /webpack -v

// npx执行
npm i -D webpack
npx webpack -v

  也就是说 npx 会自动查找当前依赖包中的可执行文件,如果找不到,就会去环境变量里面的 PATH 里找。如果依然找不到,就会帮你安装!

3、npx 可以执行文件,但是 npm 不可以

  npx 甚至支持运行远程仓库的可执行文件:npx github:piuccio/cowsay hello

  再比如使用命令 npx http-server 可以一句话帮你开启一个静态服务器!(第一次运行会稍微慢一些)

  指定node版本来运行npm scripts:npx -p node@8 npm run build

三、npx 解决了什么问题

1、可以运行本地的模块

  例如在vue项目中,想运行本地的 vue-cli-service serve 如果直接在命令行运行会报错:找不到命令,所以我们通常这样:

// package.json中:
"scripts": {
    "dev": "vue-cli-service serve",
 },

//然后:
npm run dev

  然而现在,通过npx可以这样:npx cli-service serve,就可以运行成功

 2、npx 方便使用一次就丢弃的情况,不会全局安装

  例如create-react-app,以往我们需要安装全局的包。但是使用一次后面几乎就不怎么使用了,非常浪费磁盘空间。现在我们可以用npx create-react-app myapp,用完就删

  如果第一次使用这个命令,npx会下载create-react-app放在临时文件中,过一段时间会自动清除,注意不会立即清除,我测试发现第二次运行npx create-react-app myapp不会重新下载,它会从缓存中获取。

3、其他功能:npx可以下载指定的版本,可以指定node版本运行等

四、npm init 和 npx 相似

  在npm@6版本中,增加了一个新命令npm init <pkg>,这两个命令是等价的:

npm init react-app myapp
npx create-react-app myapp

  npm init <pkg>对与create开头的脚手架制定了一个特殊命令,例如create-react-app、create-esmnpm init 下载时会默认对安装的pkg包添加create前缀,同时像npx一样不会全局安装,只是运行一次,后面会删除。

  但npm init <pkg>不能完全取代npx,例如运行npm init http-server 本意是想一次性启动一个本地服务 结果报错:

  途中可以看到http-server被变成了create-http-server,所以就找不到该模块,推荐用npx就好,至少使用起来更可控。

posted @ 2020-05-15 15:58  古兰精  阅读(2518)  评论(0编辑  收藏  举报