一、升级依赖版本
1、检查过时依赖
npm outdated
2、根据具体情况,选择安全更新或全部更新到最新版本
2.1 安全更新(不破坏依赖间的联系)
npm update
2.2 全部更新到最新版本
首先输入命令:
npx npm-check-updates -u
执行完后,如果之前没安装,会提示安装 npm-check-updates 插件,输入 y 同意。
运行完成后会在控制台列出各依赖即将升级的情况,可以选择执行 npm install 来进行升级操作。
一旦执行升级操作,因为会忽略各依赖间的联系性并统一升级到最新版本,所以可能会出现升级失败的情况,此时会询问用户是否确定并加上 --force 强制升级,如果你仍然想升级,直接输入强制升级即可。
npm install --force
3、升级完成
二、npm安装依赖遇到冲突的peerDependencies
在新版本的npm中,默认情况下,npm install遇到冲突的peerDependencies时会失败。
解决办法:
使用 --force 或 --legacy-peer-deps 可解决这种情况。
--force:会无视冲突,并强制获取远端npm库资源,当有资源冲突时覆盖掉原先的版本。
--legacy-peer-deps:安装时忽略所有peerDependencies,忽视依赖冲突,采用npm版本4到版本6的样式去安装依赖,已有的依赖不会覆盖。
建议用--legacy-peer-deps 比较保险一点
在终端重新安装即可解决,会重新生成没有冲突的 package-lock.json 文件
npm install --legacy-peer-deps
三、前端脚手架的间接依赖升级为无风险版本
由于blackduck对于非java项目会对源代码进行依赖扫描,因此低版本webpack使用的开发依赖devdependencies中的间接依赖容易产生漏洞告警。
以下提供升级建议:
1、在组件库中查询间接依赖,库中存在无风险版本情况
npm ls @xxx
使用 npm ls <依赖> 这条命令,会搜索出指定依赖结构,因间接依赖低版本 @xxx 导致漏洞告警,修复建议以组件库建议为准。
根据组件库无风险版本,在 package-lock.json 文件中指定间接依赖的大版本或具体版本号,使用npm update <依赖> 升级指定依赖
npm update @xxx
将package-lock.json替换至代码库中
如发生npm install后 package-lock.json 发生变化,请升级npm版本至最新
不同 npm 版本下 npm i 的规则
- npm 5.0.x 版本:不管 package.json 中依赖是否有更新,npm i 都会根据 package-lock.json 下载。针对这种安装策略,有人提出了这个 issue - #16866 ,然后就演变成了 5.1.0 版本后的规则。
- 5.1.0 版本后:当 package.json 中的依赖项有新版本时,npm install 会无视 package-lock.json 去下载新版本的依赖项并且更新 package-lock.json。针对这种安装策略,又有人提出了一个 issue - #17979 ,参考 npm 贡献者 iarna 的评论,得出 5.4.2 版本后的规则。
- 5.4.2 版本后:
- 如果只有一个 package.json 文件,运行
npm i
会根据它生成一个 package-lock.json 文件。- 如果 package.json 的 semver-range version 和 package-lock.json 中版本兼容,即使此时 package.json 中有新的版本,执行
npm i
也还是会根据 package-lock.json 下载 - 实践场景1。- 如果手动修改了 package.json 的 version ranges,且和 package-lock.json 中版本不兼容,那么执行
npm i
时 package-lock.json 将会更新到兼容 package.json 的版本 - 实践场景2。
2、间接依赖的最新版本仍为风险版本或所有版本均为风险版本情况
在流水线的编译前脚本中的npm run build 后添加以下命令,确保开发依赖不进入生产。
rm -rf node_modulesnpm install --production
四、直接依赖漏洞修复
npm audit
该命令是npm6新增的,可以允许开发人员分析复杂的代码并查明特定的漏洞。
npm audit 需要包 package.json 和 package-lock.json 文件。它是通过分析 package-lock.json 文件,继而扫描我们的包分析是否包含漏洞的。
返回的漏洞数据来源于 Github Advisory Database。
使用该命令必须用npm原始源,如果有已知漏洞,会展示该漏洞的信息(包括漏洞涉及问题、漏洞危险等级、所在依赖包、依赖包的依赖层级、详细信息等)
npm audit 衍生命令
# 扫描项目漏洞把不安全的依赖项自动更新到兼容性版本
npm audit fix# 在不修改 node_modules 的情况下执行 audit fix,仍然会更改 pkglock
npm audit fix --package-lock-only# 跳过更新 devDependencies
npm audit fix --only=prod# 强制执行 audit fix 安装最新的依赖项(toplevel)
npm audit fix --force# 单纯的获取 audit fix 会做的事,并以 json 格式输出。
npm audit fix --dry-run --json# 获取详情
npm audit# 以 JSON 格式打印报告
npm audit --json# 安装单个包关闭安全审查:
npm install example-package-name --no-audit
# 安装所有包关闭安全审查 - 运行
npm set audit false - 手动将 ~/.npmrc 配置文件中的 audit 修改为 false