包管理工具/npm基础知识

112 阅读2分钟

学习资料

前端工程化(5):你所需要的npm知识储备都在这了

笔记

npm install

npm 安装 从 3.x版本开始安装的依赖将的算法从深度优先换成了广度优先

"dependencies": {
    A: "1.0.0",
    B: "1.0.0",
    C: "1.0.0"
}

依赖情况:
A@1.0.0 -> D@1.0.0

B@1.0.0 -> D@2.0.0

C@1.0.0 -> D@2.0.0

npm 2.x安装完成后是这样的包情况:
├── node_modules
│   ├── A@1.0.0
│   │   └── node_modules
│   │   │   └── D@1.0.0
│   ├── B@1.0.0
│   │   └── node_modules
│   │   │   └── D@2.0.0
│   └── C@1.0.0
│   │   └── node_modules
│   │   │   └── D@2.0.0

npm 3.x安装完成后是这样的包情况:
├── node_modules
│   ├── A@1.0.0
│   │   └── node_modules
│   │   │   └── D@1.0.0
│   ├── B@1.0.0
│   ├── C@1.0.0
│   └── D@2.0.0

package-lock.json

npm 5.x开始,执行npm install时会自动生成一个package-lock.json 文件。

package-lock.json文件精确描述了node_modules 目录下所有的包的树状依赖结构,每个包的版本号都是完全精确的。

依赖包分类

dependencies

npm i 包

这种依赖在项目最终上线或者发布`npm`包时所需要,
即其中的依赖项应该属于线上代码的一部分。

devDependencies

npm i -D 包

这种依赖只在项目开发时所需要,即其中的依赖项不应该属于线上代码的一部分。

注意

千万别以为只有在dependencies中的模块才会被一起打包,而在devDependencies中的不会!模块能否被打包,取决于项目里是否被引入了该模块! 在业务项目中dependencies和devDependencies没有什么本质区别,只是单纯的一个规范作用,在执行npm i时两个依赖下的模块都会被下载;而在发布npm包的时候,包中的dependencies依赖项在安装该包的时候会被一起下载,devDependencies依赖项则不会。

依赖包版本号介绍

1.2.3

表示精确版本号。任何其他版本号都不匹配。

^1.2.3

"^1.2.3" 等价于 ">= 1.2.3 < 2.0.0"。即只要最左侧的 "1" 不变,其他都可以改变。所以 "1.2.4", "1.3.0" 都可以兼容。

"^0.2.3" 等价于 ">= 0.2.3 < 0.3.0"。因为最左侧的是 "0",那么只要第二位 "2" 不变,其他的都兼容,比如 "0.2.4""0.2.99""^0.0.3" 等价于 ">= 0.0.3 < 0.0.4"。大版本号和小版本号都为 "0" ,所以也就等价于精确的 "0.0.3"

~1.2.3

"~1.2.3" 列出了小版本号 "2",因此只兼容第三位的修改,等价于 ">= 1.2.3 < 1.3.0""~1.2" 也列出了小版本号 "2",因此和上面一样兼容第三位的修改,等价于 ">= 1.2.0 < 1.3.0""~1" 没有列出小版本号,可以兼容第二第三位的修改,因此等价于 ">= 1.0.0 < 2.0.0"

package与package-lock版本号不同

大版本相同,小版本不同

package > package-lock 
在执行`npm install`时,会将该模块更新到`大版本下的最新的版本`,
并将版本号更新至`package-lock.json`// package.json 中修改版本
"dependencies": {
  "clipboard": "^1.5.12",
}
// package-lock.json 中原版本
"clipboard": {
  "version": "1.5.10", 
},

// 执行完 npm install 后,package-lock.json 中
"clipboard": {
  "version": "1.7.1", // 更新到大版本下的最新版本
},

package < package-lock
`package-lock.json`中的版本锁定

大版本不同

在执行`npm install`时,都将根据`package.json``大版本下的最新版本`进行更新,
并将版本号更新至`package-lock.json`// package-lock.json 中原版本
"clipboard": {
  "version": "2.0.4",
}
// package.json 中修改版本
"dependencies": {
  "clipboard": "^1.6.1",
}

// 执行完npm install后,package-lock.json 中
"clipboard": {
  "version": "1.7.1", // 更新到大版本下的最新版本
}

npm scripts脚本

串行执行

npm run script1 && npm run script2

并行执行

npm run script1 & npm run script2

env环境变量

可以通过process.env.npm_package_key1_key2获取package.json里面所有的信息

{
  "name": "xhp",
  "version": "1.1.1",
  "description": "shenhao",
  "main": "index.js",
  "repository": {
    "type": "git",
    "url": "git+ssh://git@gitlab.com/xxxx/sh.git",
    "test": "a"
  }
}

process.env.npm_package_name // xhp
process.env.npm_package_repository_test // a