npm 是 Node.js 的包管理工具,Node.js package manger,包就是别人写的 Node.js 模块。我们通过 npm,可以方便的使用第三方开发的开源模块,同时也可以把自己的模块发布到 npm 供其它开发者使用。
在初始化 Node.js 项目的时候我们需要通过 npm init 命令,把自己的代码初始化成为 npm 包,这样我们才能更加方便地去使用别人的 npm 包。
npm 通过 Node.js 模块根目录的 package.json 文件获取模块元数据和依赖关系等。
yarn 是由 Facebook、Google、Exponent 和 Tilde 为了解决当时 npm 的一些缺陷而新推出的包管理工具。当时 npm 有以下问题:
1.速度慢:npm 按照队列执行安装每个 package,只有当前 package 安装完成之后,才会进行后面的安装。
2.同一个项目,npm 安装的时候无法保持一致性,由于 package.json 文件中版本号的特点,下面三个版本号在安装的时候代表不同的含义:
"5.0.3", //安装指定的5.0.3版本
"~5.0.3", //安装5.0.X中的最新版本
"^5.0.3" //安装5.X.X中的最新版本
3.npm 安装的时候,一个包抛出错误,npm 会继续下载安装包,而且因为 npm 会把所有的日志输出到终端,有关错误包的错误信息就会淹没在 npm 打印的警告中,你甚至不会发现错误的产生。
不过现在两个差异不大,可根据喜好选择。
Yarn 和 npm 命令对比:
npm install (npm i) === yarn
npm install xxx === yarn add xxx
npm uninstall xxx === yarn remove xxx
npm install xxx --dev === yarn add xxx --dev
npm install xxx --global === yarn global add xxx
npm update === yarn upgrade
全局安装与本地安装
全局安装:全局安装的包提供可以直接执行的命令。比如全局安装 http-server:
yarn global add http-server
之后便可以全局使用 http-server 命令:
原理:全局安装的 http-server 会将其 package.json 中的 bin 命令注入全局环境,使其可以全局执行
本地安装:
一个包通常会在不同的项目上重复用到,如果只是全局安装,那么当某个项目需要更新包的版本的时候,可能会影响其他项目。因此我们需要本地安装,来避免全局安装产生的包污染问题。
本地安装有两种方式:
yarn add xxx
yarn add xxx --dev
前者安装项目本身需要用到的依赖,参与上线打包,存储在 package.json 文件中的 "dependencies" 配置下;
后者安装项目仅在本地开发使用到的依赖,不参与上线打包,存储在 package.json 文件中的 "devDependencies" 配置下。(如 @types/node,以获取 node.js 更加友好的代码提示)
语义化版本号
x.y.z
z:修复 bug
y:增加新特性,保证兼容
x:大版本更新,不保证兼容
什么是 npx?
在创建 React 应用的时候,官网给出的命令是:
npxcreate-react-appmy-app
其中 npx 可以让你在没有全局安装 create-react-app 这个包的情况下使用 create-react-app 命令。