写点什么

npm 必知必会点

作者:废材壶
  • 2021 年 11 月 16 日
  • 本文字数:2427 字

    阅读完需:约 8 分钟

npm必知必会点

曾几何时,俺认识的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 的使用https://www.ruanyifeng.com/blog/2016/10/npm_scripts.html

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 的所有依赖包列表


json"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
复制代码

应该要掌握的常见命令行


行文仓促,如果文中有表述不准确的地方,欢迎指正。


我是废材壶,前端开发者,欢迎微信搜一搜「 CodeLife 集」阅读不迷路


参考

发布于: 2021 年 11 月 16 日阅读数: 6
用户头像

废材壶

关注

还未添加个人签名 2018.06.09 加入

我是废材壶,前端开发者,欢迎微信搜一搜「 CodeLife集」阅读不迷路

评论

发布
暂无评论
npm必知必会点