NPM

TIP

NPM全称node package manager,是世界上最大规模的包管理系统

一、初始化

// 基础生成
npm init

// 快捷生成命令
npm init -y
{
  "name": "my-pack",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {},
  "license": "ISC"
}
  • name:是当前包的名字,也就是最终发布的npm官网上包的名字。不能和已有的包重名哦
  • version:就是当前包的版本号,主要我们要探究如果优雅的管理版本号
  • main:就是当前包的入口文件,也就是使用require默认引入的文件
  • scripts:可以配置一些执行脚本
  • license:协议许可

二、安装

1. 安装命令

// 全局安装
npm install 包名 -g

// 本地安装到开发依赖
npm install 包名 --save-dev

npm install 包名 -D

// 本地安装到项目依赖
npm install 包名 --save

npm install 包名 -S

// 只安装生产环境下的依赖
npm install --production

2. 自定义包

// 1、创建文件 /bin/www
// #! 这句表示采用node来执行此文件,同理 shell可以表示 sh
#! /usr/bin/env node
console.log('hello word'); 

// 2、更新package.json文件
"bin": {
	"my-pack":"./bin/www" // 这里要注意名字和你建立的文件夹相同
},

// 3、建立软连
npm link

// 4、使用命令
my-pack

三、package-lock文件

  • package-lock.json 的作用是锁定依赖安装结构,保证在任意机器上执行 npm install 都会得到完全相同的 node_modules 结果,因为package-lock.json存储所有安装的信息
  • 如果手动更新了package.json文件,执行安装命令会下载对应的新版本,并且会自动更新lock文件
{
  "name": "zf-lesson",
  "version": "2.1.1",
  "lockfileVersion": 1,
  "requires": true,
  "dependencies": {
    "@webassemblyjs/ast": {
      "version": "1.9.0", // 当前依赖的版本
      "resolved": "https://registry.npm.taobao.org/@webassemblyjs/ast/download/@webassemblyjs/ast-1.9.0.tgz", // 从哪个渠道安装的
      "integrity": "sha1-vYUGBLQEJFmlpBzX0zjL7Wle2WQ=", // 内容hash
      "dev": true,
      "requires": {
        "@webassemblyjs/helper-module-context": "1.9.0",
        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
        "@webassemblyjs/wast-parser": "1.9.0"
      }
	},
	....
  }
}

四、依赖方式

1. dependencies 项目依赖

可以使用npm install -S或 npm install --save保存到依赖中,当发布到npm上时dependencies下的模块会作为依赖,一起被下载

2. devDependencies 开发依赖

可以使用npm install -D或 npm install --save-dev保存到依赖中,当发布到npm上时devDependencies下面的模块就不会自动下载了, 只在开发环境使用

3. peerDependencies 同版本依赖

如果你安装我,那么你最好也安装我对应的依赖,如果未安装会报出警告 bash

"peerDependencies": { 
	"jquery": "2.2.0" 
}

DANGER

npm WARN youxuan@1.0.0 requires a peer of jquery@2.2.0 but none is installed. You must install peer dependencies yourself.

4. bundledDependencies 捆绑依赖

使用npm pack 打包时,会将捆绑依赖一同打包

"bundleDependencies": [
	"jquery"
]

5. optionalDependencies 可选依赖

如果发现无法安装或无法找到,不会影响npm的安装

五、版本管理

npm采用了semver规范open in new window作为依赖版本管理方案,semver 约定一个包的版本号必须包含3个数字

1. 版本号格式

MAJOR.MINOR.PATCH =》 主版本号.小版本号.修订版本号

  • MAJOR:对应大的版本号迭代,做了不兼容旧版的修改时要更新 MAJOR 版本号
  • MINOR:对应小版本迭代,发生兼容旧版API的修改或功能更新时,更新MINOR版本号
  • PATCH:对应修订版本号,一般针对修复 BUG 的版本号

2. 修改规则

当我们每次发布包的时候都需要升级版本号,如果使用git管理项目会自动 git tag 标注版本号

npm version major  # 大版本号加 1,其余版本号归 0
npm version minor  # 小版本号加 1,修订号归 0
npm version patch  # 修订号加 1

3. 先行版本号

  • alpha(α):预览版,或者叫内部测试版;一般不向外部发布,会有很多bug;一般只有测试人员使用
  • beta(β):测试版,或者叫公开测试版;这个阶段的版本会一直加入新的功能;在alpha版之后推出
  • rc(release candidate):最终测试版本;可能成为最终产品的候选版本,如果未出现问题则可发布成为正式版本

4. 标识含义

range含义示例
^2.2.1指定的 MAJOR 版本号下, 所有更新的版本匹配 2.2.3, 2.3.0; 不匹配 1.0.3, 3.0.1
~2.2.1指定 MAJOR.MINOR 版本号下,所有更新的版本匹配 2.2.3, 2.2.9 ; 不匹配 2.3.0, 2.4.5
>=2.1版本号大于或等于 2.1.0匹配 2.1.2, 3.1
<=2.2版本号小于或等于 2.2匹配 1.0.0, 2.2.1, 2.2.11
1.0.0 - 2.0.0版本号从 1.0.0 (含) 到 2.0.0 (含)匹配 1.0.0, 1.3.4, 2.0.0

六、scripts配置

1、基本使用

在package.json中可以定义自己的脚本通过npm run来执行

"scripts": {
   "hello": "echo hello",
   "build": "webpack"
}

执行脚本命令

# 执行hello命令
npm run hello

# 执行build脚本 》 实际执行node_modules/.bin目录下的webpack文件
npm run build

2、原理

  • npm run 命令执行时,会把 ./node_modules/.bin/ 目录添加到执行环境的 PATH 变量中,因此如果某个命令行包未全局安装,而只安装在了当前项目的 node_modules 中,通过 npm run 一样可以调用该命令
  • 执行 npm 脚本时要传入参数,需要在命令后加 -- 标明, 如 npm run hello -- --port 3000 可以将 --port 参数传给hello 命令
  • npm run env 可以查看全局变量
  • npm 提供了 pre 和 post 两种钩子机制,可以定义某个脚本前后的执行脚本,没有定义默认会忽略
"scripts": {
   "prehello":"echo prehello",
   "hello": "echo hello",
   "posthello":"echo posthello"
}

七、开源许可证

开源许可证

八、包发布

1、发布包

# 切换到官方源
npm install nrm -g
nrm use npm

# 注册用户
npm adduser

# 登录用户
npm login

# 发布包,上传到npm服务器
npm publish

2、更新包

# 叠加版本号
npm version patch

# 手动修改package.json中的版本号也可以

3、删除包

# 删除指定版本的包
npm unpublish 包名@版本号

# 删除整个包
npm unpublish 包名 --force