# npm
# npm 概述
node package module, NodeJs 的包管理工具
# package.json
NodeJs 项目必备的配置文件,常见的属性有:
# name: 模块名称,可以添加组织作用域:@scope/vue
# version: 模块的版本号,一般遵循 Semver 规范
# type: 指定项目的模块类型(module type)
- "module":表示该项目使用的是 ECMAScript 模块(ESM),所有
.js文件默认被当作ECMAScript模块进行解析。这意味着你可以使用import和export语法 - "commonjs":表示该项目使用的是 CommonJS 模块。
# main: 模块的主入口
# bin: 命令行模块命令入口
# scripts: npm run [command] 脚本的配置
# publishConfig: 发布配置
# files: 发布的目录合集
# description: 模块描述信息
# keywords: 模块关键字,一般可用于搜索
# author: 模块作者
# contributors: 模块贡献者信息
# homepage: 模块主页
# repository: 模块代码仓库地址
# dependencies: 模块所依赖的生产环境的依赖,需要该依赖才能运行
# devDependencies: 开发该模块所需要的依赖,类似 webpack,并不需要运行时加载该依赖
# peerDependencies: 模块所依赖的版本和用户所依赖的库的版本会进行对比。
# optionalDependencies: 非必须的依赖
# license: 协议
main 定义了 npm 包的入口文件,Browser 环境和 Node 环境均可使用;
module 定义 npm 包的 ESM 规范的入口文件,Browser 环境和 Node 环境均可使用;
browser 定义 npm 包在 Browser 环境下的入口文件。
# 常见参数
# --unsafe-perm : npm 默认不支持 root 用户运行,即使用了也会自动转成 nobody,会没有写入等权限,这个参数会直接切换到运行用户
# npm 模块加载方式
npm 老版本中,npm install 会有很多问题。npm 5+以后解决了依赖嵌套和依赖顺序的问题。
- npm 1: 嵌套
- npm 3: 扁平
- npm 5: 扁平+lock
在新版本的 npm 5+中,当我们执行npm i的时候,会采用扁平+lock 的模式来安装依赖。默认都会安装在一级的node_modules下面,当有相同的依赖不符合已安装的版本范围时,就会安装在当依赖模块的node_modules中。我们加载模块的顺序如下:
- 在当前模块路径下加载
- 在当前模块 node_modules 路径下加载
- 在上级模块的 node_modules 路径下加载
- 全局模块的 node_modules
同时,通过 lock 文件来锁定依赖的版本结构并且加速安装:
// package-lock.json
{
"name": "npm",
"version": "1.0.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"vue": {
"version": "2.6.11",
"resolved": "https://registry.npmjs.org/vue/-/vue-2.6.11.tgz",
"integrity": "sha512-VfPwgcGABbGAue9+sfrD4PuwFar7gPb1yl1UK1MwXoQPAw0BKSqWfoYCT/ThFrdEVWoI51dBuyCoiNU9bZDZxQ=="
},
"vue-router": {
"version": "3.3.2",
"resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.3.2.tgz",
"integrity": "sha512-5sEbcfb7MW8mY8lbUVbF4kgcipGXsagkM/X+pb6n0MhjP+RorWIUTPAPSqgPaiPOxVCXgAItBl8Vwz8vq78faA=="
}
}
}
# npm install 的流程图(网图)

# ps: 当 npm i 的时候,默认不会更新当前库(如果修改了第三方的代码就会有影响),需要 npm i [package]添加对应的包名来更新当前库
# ps: npm5.4.2 以上,默认根据 lock 安装,如果出现 lock 文件和 package.json 版本不兼容,以 package.json 为主,同时更新 lock 文件
# ps: npm 包的安装顺序对于依赖树的影响很大。模块安装顺序可能影响 node_modules 内的文件数量。
# 设置依赖安装过程中内部模块下载Node的淘宝镜像
npm config set disturl https://npm.taobao.org/mirrors/node/
# 设置常用模块的淘宝镜像
npm config set sass_binary_site https://npm.taobao.org/mirrors/node-sass/
npm config set sharp_dist_base_url https://npm.taobao.org/mirrors/sharp-libvips/
npm config set electron_mirror https://npm.taobao.org/mirrors/electron/
npm config set puppeteer_download_host https://npm.taobao.org/mirrors/
npm config set phantomjs_cdnurl https://npm.taobao.org/mirrors/phantomjs/
npm config set sentrycli_cdnurl https://npm.taobao.org/mirrors/sentry-cli/
npm config set sqlite3_binary_site https://npm.taobao.org/mirrors/sqlite3/
npm config set python_mirror https://npm.taobao.org/mirrors/python/
# 安装rimraf并设置package.json
npm i -g rimraf
# 安装前请确保当前的Node版本和node-sass版本已兼容
# 安装失败
npm cache clean -f
npm rebuild node-sass 或 npm run reinstall
# yarn
流程: 检测(checking)→ 解析包(Resolving Packages) → 获取包(Fetching Packages)→ 链接包(Linking Packages)→ 构建包(Building Packages) 执行 yarn 的时候会自动 dedupe,优化整个目录结构,使不需要的依赖被删除
# 参考
# https://zhuanlan.zhihu.com/p/37285173
# https://juejin.im/post/5df789066fb9a0161f30580c#heading-1
← 事件循环