曾几何时,俺认识的npm
就是 npm install
npm run dev
一把嗦,然后……,就没有然后了。奈何被隔壁老王秀了一波骚操作,俺当时的内心感受。。。
“😯 草,什么鬼,还能这么玩!!!”
“牛掰”
“666”
陷入沉思……
前言
这是走进 Node.js 系列基础篇,了解你常使用的 npm。
npm是 Node.js 默认包管理器,其目标是自动化依赖和包管理器,前端工程化的成功离不开 npm 的支撑。
安装
首先需要安装 Node.js,NPM 依赖 于 Node.js 环境,所以第一步,需要配置 Node.js 环境。建议使用 nvm
、nvs
等版本管理器管理 Node.js 版本
npm 必知必会点
语义版本
npm 的版本号管理遵循语义化版本 [major, minor, patch]
(主版本号.次版本号.修订号)
- 主版本号:一般是新增不兼容 API 修改
- 次版本号:向下兼容的功能性新增,功能迭代
- 修订号:补丁或需紧急修复 API 问题
其次,在package.json
中常会看到版本号前有个符号
-
^
: 表示安装最新次版本号。规则有:^1.2.3
范围是:>=1.2.3
<2.0.0-0
的版本^0.2.3
的范围是: >=0.2.3
<0.3.0-0
^0.0.3
的范围是:>=0.0.3
<0.0.4-0
-
~
:表示安装最新的修订版本号。规则有:~1.2.3
范围是: >=1.2.3
<1.3.0-0
~1.2
范围是: >=1.2.0
<1.3.0-0
~1
范围是:>=1.0.0
<2.0.0-0
~0.2.3
范围是: >=0.2.3
<0.3.0-0
更详细的 SemVer 规范semver.org
package.json
一个 package.json 文件包含有
- 项目的所有依赖列表
- 项目的版本号等信息
package.json 字段比较多,但有 2 个是必要的字段
- name: 包名称。小写的一个单词,可以使用连接符号和下划线
- version: 字段值必须遵循版本语义版本控制指南
dependencies
vs devDependencies
前者是生产环境所需依赖,后者是本地开发所需依赖,npm install xxx --save
安装依赖到 dependencies
下,npm install xxx --save-dev
安装依赖到 devDependencies
下
详细了解 scirpt 的使用www.ruanyifeng.com/blog/2016/1…
package-lock.json
如上文讲到,npm 包中采用的语义化版本管理,导致安装依赖时,可能会出现依赖版本不一致的问题。
package-lock.json
的目的就是让所有的使用环境在安装依赖时,都能实现百分百的依赖版本号一致, package-lock.json
生成 node_modules 树大致的文件结构:
- name:同 package.json 的 name 一样
- version:同 package.json 的 version 一样
- lockfileVersion:从 1 开始的整数版本号,npm v7 后,此数值为 2 开始
- packages:package.json 的键值对象
- dependencies:node_modules 的所有依赖包列表
"dependencies": {
"@cspotcode/source-map-consumer": {
"version": "0.8.0",
"resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz",
"integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg=="
},
"@cspotcode/source-map-support": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz",
"integrity": "sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==",
"requires": {
"@cspotcode/source-map-consumer": "0.8.0"
}
}
}
字段列表表示
- version:版本号,具体的版本号
- resolved:依赖包的下载地址
- integrity:hash 值,用于完整性验证
- requires:依赖包的 dependencies (并不是所有的子依赖都有 dependencies 属性,只有子依赖的依赖和当前已安装在根目录的 node_modules 中的依赖冲突之后,才会有这个属性)
.npmrc
npm 的配置文件
npm 从命令行、环境变量和.npmrc
文件获取配置设置。 读取配置的优先级顺序为:项目配置文件 > 电脑不同登录用户配置文件 > 电脑全局配置文件 > npm 内置配置文件
常见的配置项
# 指定淘宝源
registry=https://registry.npm.taobao.org/
# 公司内部私有npm库
@xx:registry=https://npm.[xxx].com/
npm install
npm install
命令执行后,会读取配置,优先级如上。然后,会判断是否存在package-lock.json
、yarn.lock
文件,(最新版本下npm init
会初始化package-lock.json
文件或者 yarn 作为管理,会有yarn.lock
)
package-lock.json
yarn.lock
默认情况下,npm install
将安装所有的依赖包生成node_modules
目录,当 NODE_ENV为production参数时,
npm install只安装
dependencies` 下的依赖包
npm install xxx
安装具体包,默认情况下,保存在dependencies
,可以通过参数控制安装行为。
-D, --save-dev
: 保存到devDependencies
--save
: 保存到dependencies
-B, --save-bundle
: 保存到bundleDependencies
中
安装算法
遵循扁平化安装优先原则。默认优先安装到node_modules
根目录下
package{dependencies}结构 A{B,C}, B{C}, C{D}安装算法
A
+-- B
+-- C
+-- D
对于 A{B,C}, B{C,D@1}, C{D@2}此算法生成
A
+-- B
+-- C
`-- D@2
+-- D@1
npx
npx 是一个用于执行 Node 包的 tool,npm5.2 版本后,默认携带
当需要使 Cli 包时,往往都是全局安装包,npx 允许本地或远程运行 npm 包的命令,避免--global 安装,非常的便利。
npx 的作用
- 默认情况下,它首先检查要执行的包是否存在于路径中
- 如存在,则执行
- 否则,意味着包没有被安装,npx 会安装包 和 执行它
如果想要阻止这个默认安装包的行为,可以使用 npx xxx-package --no-install
没有 npx 以前,如果想要执行一个包,像这样
./node_modules/.bin/xxx-package
// 或者在package.json 的script定义,npm run xxx-package
"scirpt": {
"xxx-package": "./node_modules/.bin/xxx-package"
}
npx 很容易执行
npx xxx-package
应该要掌握的常见命令行
命令 | 作用 |
---|---|
npm install <包> | 安装依赖包 |
npm i <包> | 安装依赖包缩写 |
npm uninstall <包> | 卸载依赖包 |
npm un <包> | 卸载依赖包缩写 |
npm update <包> | 更新最新版本的依赖包 |
npm up <包> | 更新最新版本的依赖包缩写 |
npm deprecate <包>[<版本>] <消息> | 发出弃用消息来更新包 |
npm list | 打印所有的依赖包和版本号信息 |
npm view <包名> <版本号> | 打印包数据 |
npm help > | 帮助命令 |
行文仓促,如果文中有表述不准确的地方,欢迎指正。
我是废材壶,前端开发者,欢迎微信搜一搜「 CodeLife集」阅读不迷路