npm 必知必会点

1,479 阅读4分钟

曾几何时,俺认识的npm就是 npm install npm run dev一把嗦,然后……,就没有然后了。奈何被隔壁老王秀了一波骚操作,俺当时的内心感受。。。

“😯 草,什么鬼,还能这么玩!!!”

“牛掰”

“666”

陷入沉思……

前言

这是走进 Node.js 系列基础篇,了解你常使用的 npm。

npm是 Node.js 默认包管理器,其目标是自动化依赖和包管理器,前端工程化的成功离不开 npm 的支撑。

安装

首先需要安装 Node.js,NPM 依赖 于 Node.js 环境,所以第一步,需要配置 Node.js 环境。建议使用 nvmnvs 等版本管理器管理 Node.js 版本

npm 必知必会点

语义版本

npm 的版本号管理遵循语义化版本 [major, minor, patch](主版本号.次版本号.修订号)

  1. 主版本号:一般是新增不兼容 API 修改
  2. 次版本号:向下兼容的功能性新增,功能迭代
  3. 修订号:补丁或需紧急修复 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 个是必要的字段

  1. name: 包名称。小写的一个单词,可以使用连接符号和下划线
  2. 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.jsonyarn.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集」阅读不迷路

weix.png

参考