乐闻世界logo
搜索文章和话题

面试题手册

npm 7+ 有哪些新功能?它们如何提升包管理?

npm 7+ 引入了重大改进,包括并行安装、工作区支持和更好的依赖解析。了解这些新特性对于现代 JavaScript 开发至关重要。npm 7 主要新特性1. 并行安装npm 7 改进了依赖安装算法,支持并行下载和安装包。性能提升:安装速度比 npm 6 快 2-3 倍更好的网络资源利用减少总体安装时间配置并行度:# 设置最大并行连接数npm config set maxsockets 50# 设置最大网络请求并发数npm config set network-concurrency 162. 工作区(Workspaces)npm 7 原生支持 monorepo 工作区,无需额外配置。配置工作区:{ "name": "my-monorepo", "version": "1.0.0", "private": true, "workspaces": [ "packages/*" ], "scripts": { "install": "npm install -ws", "build": "npm run build -ws", "test": "npm test -ws" }}目录结构:my-monorepo/├── package.json├── packages/│ ├── shared/│ │ ├── package.json│ │ └── index.js│ ├── app/│ │ ├── package.json│ │ └── index.js│ └── utils/│ ├── package.json│ └── index.js工作区命令:# 在所有工作区中运行命令npm run build -ws# 在特定工作区中运行命令npm run build --workspace=packages/app# 安装依赖到特定工作区npm install lodash --workspace=packages/app# 添加工作区依赖npm install ../shared --workspace=packages/app3. 改进的依赖解析npm 7 使用更智能的依赖解析算法,减少重复安装。依赖提升:node_modules/├── lodash/ # 提升到顶层├── package-a/├── package-b/└── package-c/配置解析策略:# 禁用依赖提升npm config set legacy-bundling true# 使用严格的 peer 依赖解析npm config set strict-peer-deps true4. package-lock.json v2npm 7 引入了新的锁文件格式,提供更好的可读性和更详细的元数据。新特性:更清晰的 JSON 结构包含包的完整性信息支持工作区更好的版本范围处理示例:{ "name": "my-project", "version": "1.0.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "my-project", "version": "1.0.0", "dependencies": { "express": "^4.18.0" } }, "node_modules/express": { "version": "4.18.2", "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", "integrity": "sha512-...", "dependencies": { "accepts": "~1.3.8" }, "engines": { "node": ">= 0.10.0" } } }}5. npm exec 和 npx 改进npm 7 改进了 npx 的实现,并引入了 npm exec 命令。npm exec:# 执行包中的二进制文件npm exec create-react-app my-app# 等同于 npxnpx create-react-app my-app# 传递参数npm exec --package=eslint -- eslint src/改进的 npx:更快的包解析更好的缓存机制支持多个包6. 自动安装 peer 依赖npm 7 默认自动安装 peer 依赖,简化依赖管理。行为变化:# npm 6: 需要手动安装 peer 依赖npm install <package>npm install <peer-dependency># npm 7: 自动安装 peer 依赖npm install <package>配置:# 禁用自动安装 peer 依赖npm config set auto-install-peers false# 使用严格的 peer 依赖解析npm config set strict-peer-deps true7. 改进的输出格式npm 7 提供更清晰、更简洁的输出格式。示例:added 1423 packages, and audited 1424 packages in 32s238 packages are looking for funding run `npm fund` for detailsfound 0 vulnerabilities8. npm fund 命令npm 7 引入了 npm fund 命令,显示项目的资金来源信息。使用:npm fund输出示例:my-project@1.0.0├── express@4.18.2│ └── https://opencollective.com/express├── lodash@4.17.21│ └── https://opencollective.com/lodash└── webpack@5.0.0 └── https://github.com/sponsors/webpack9. 支持 overridesnpm 8+ 支持 overrides 字段,强制使用特定版本的依赖。配置 overrides:{ "overrides": { "vulnerable-package": "1.2.3", "package-a": { "package-b": "2.0.0" } }}使用场景:修复安全漏洞解决版本冲突强制使用特定版本10. 改进的错误处理npm 7 提供更详细的错误信息和更好的错误恢复机制。错误信息示例:npm ERR! code ERESOLVEnpm ERR! ERESOLVE unable to resolve dependency treenpm ERR!npm ERR! While resolving: my-project@1.0.0npm ERR! Found: react@18.0.0npm ERR! node_modules/reactnpm ERR! react@"^18.0.0" from the root projectnpm ERR!npm ERR! Could not resolve dependency:npm ERR! peer react@"^16.0.0" from some-package@1.0.0npm ERR! node_modules/some-packagenpm 8 新特性1. 改进的 workspacesnpm 8 改进了工作区功能,支持更复杂的 monorepo 结构。2. npm diff 命令npm 8 引入了 npm diff 命令,比较依赖版本差异。# 比较当前安装与 package.jsonnpm diff# 比较特定包npm diff <package-name># 比较两个版本npm diff <package-name>@1.0.0 <package-name>@2.0.03. 改进的 npm querynpm 8 改进了 npm query 命令,支持更强大的依赖查询。# 查找所有过期的包npm query ":outdated"# 查找所有开发依赖npm query ":dev"# 查找特定包的依赖npm query "lodash > *"4. 支持 .npmrc 的继承npm 8 支持从父目录继承 .npmrc 配置。npm 9 新特性1. 改进的性能npm 9 进一步优化了性能,安装速度更快。2. 改进的安全性npm 9 增强了安全功能,包括更好的完整性验证。3. 改进的错误报告npm 9 提供更清晰的错误信息和更好的故障排除指导。迁移到 npm 7+1. 升级 npm# 使用 npm 自身升级npm install -g npm@latest# 使用 nvmnvm install node --latest-npm# 使用 nn latest2. 检查兼容性# 检查项目依赖npm ls# 检查 peer 依赖npm ls --depth=03. 处理 peer 依赖# 自动安装 peer 依赖npm install# 手动解决冲突npm install --force4. 更新 package-lock.json# 删除旧的锁文件rm package-lock.json# 重新安装生成新锁文件npm install最佳实践1. 使用工作区管理 monorepo{ "workspaces": [ "packages/*" ], "scripts": { "install": "npm install -ws", "build": "npm run build -ws", "test": "npm test -ws", "clean": "npm run clean -ws" }}2. 使用 overrides 管理版本{ "overrides": { "vulnerable-package": "1.2.3" }}3. 使用 npm ci 替代 npm install# CI 环境使用 npm cinpm ci4. 配置合理的并行度# 根据网络环境调整npm config set maxsockets 50npm config set network-concurrency 165. 使用 npm fund 支持开源项目# 查看项目资金来源npm fund# 支持开源项目npm fund <package-name>常见问题1. peer 依赖冲突# 使用严格的 peer 依赖解析npm config set strict-peer-deps true# 手动解决冲突npm install --force2. 工作区依赖问题# 清理工作区缓存npm cache clean --force# 重新安装npm install -ws3. 性能问题# 检查配置npm config list# 调整并行度npm config set maxsockets 50# 使用缓存npm install --prefer-offlinenpm 7+ 带来了显著的性能提升和功能改进,是现代 JavaScript 开发的理想选择。
阅读 0·2月17日 23:29

NPM Link 是如何工作的?什么时候应该用它进行本地包开发?

npm link 是一个强大的工具,用于在本地开发和测试 npm 包。它允许开发者在不发布包的情况下,将本地包链接到其他项目中。npm link 基本概念npm link 创建两个链接:全局链接:将本地包链接到全局 node_modules项目链接:将全局链接链接到项目的 node_modules基本用法1. 链接本地包步骤 1:在要链接的包目录中创建全局链接cd /path/to/my-packagenpm link这会在全局 node_modules 中创建一个符号链接指向本地包。步骤 2:在要使用该包的项目中链接cd /path/to/my-projectnpm link my-package这会在项目的 node_modules 中创建一个符号链接指向全局链接。2. 验证链接# 查看全局链接npm list -g --depth=0# 查看项目中的链接npm list my-package# 查看链接的详细信息ls -la node_modules/my-package实际应用场景场景 1:开发本地库假设你正在开发一个工具库 my-utils:# 1. 进入工具库目录cd ~/projects/my-utils# 2. 创建全局链接npm link# 3. 进入使用该库的项目cd ~/projects/my-app# 4. 链接工具库npm link my-utils# 5. 在代码中使用import { formatDate } from 'my-utils';场景 2:开发 CLI 工具开发命令行工具时,npm link 特别有用:# 1. 在 CLI 工具目录cd ~/projects/my-cli# 2. 确保 package.json 中有 bin 字段{ "name": "my-cli", "bin": { "my-cli": "./bin/cli.js" }}# 3. 创建全局链接npm link# 4. 现在可以在任何地方使用my-cli --help场景 3:开发 React 组件库# 1. 在组件库目录cd ~/projects/my-components# 2. 创建全局链接npm link# 3. 在 React 应用中链接cd ~/projects/my-react-appnpm link my-components# 4. 使用组件import { Button } from 'my-components';高级用法1. 链接 scoped 包# 链接 scoped 包cd ~/projects/@mycompany/my-packagenpm link# 在项目中链接cd ~/projects/my-projectnpm link @mycompany/my-package2. 链接多个包# 链接多个本地包cd ~/projects/package-anpm linkcd ~/projects/package-bnpm link# 在项目中链接所有包cd ~/projects/my-projectnpm link package-a package-b3. 解除链接# 解除项目中的链接cd ~/projects/my-projectnpm unlink my-package# 解除全局链接cd ~/projects/my-packagenpm unlink -g# 或者使用 unlink 命令npm unlink -g my-package常见问题1. 链接不生效问题:链接后仍然使用旧版本解决方案:# 清除缓存npm cache clean --force# 重新链接npm link# 重启开发服务器npm run dev2. TypeScript 类型错误问题:链接的包缺少类型定义解决方案:# 确保包中包含类型定义cd ~/projects/my-packagenpm run build# 在项目中重新链接cd ~/projects/my-projectnpm unlink my-packagenpm link my-package3. 依赖冲突问题:链接的包与项目依赖冲突解决方案:# 检查依赖npm ls my-package# 使用 npm link --forcenpm link my-package --force4. Windows 符号链接问题问题:Windows 上符号链接需要管理员权限解决方案:# 以管理员身份运行终端# 或启用开发者模式# 设置 -> 更新和安全 -> 开发者模式最佳实践1. 使用 package.json 脚本{ "scripts": { "link": "npm link", "link:app": "npm link my-package", "unlink": "npm unlink -g my-package" }}2. 文档化链接流程在 README 中说明如何链接本地包:## Local DevelopmentTo use this package locally without publishing:bashIn this package directorynpm linkIn your project directorynpm link my-package```### 3. 使用 watch 模式bash在包目录中使用 watch 模式cd ~/projects/my-packagenpm run watch修改代码会自动重新编译### 4. 测试链接的包bash在项目中测试cd ~/projects/my-projectnpm test手动测试功能node -e "require('my-package').test()"## 与其他工具的集成### 1. 与 Yarn 集成bashYarn 也支持 linkcd ~/projects/my-packageyarn linkcd ~/projects/my-projectyarn link my-package### 2. 与 pnpm 集成bashpnpm 使用不同的链接机制cd ~/projects/my-packagepnpm link --globalcd ~/projects/my-projectpnpm link --global my-package### 3. 与 monorepo 集成bash使用 workspaces 替代 npm linkcd ~/projects/my-monoreponpm installworkspaces 自动处理内部依赖## 实际示例### 开发一个工具函数库**my-utils/package.json**:json{ "name": "my-utils", "version": "1.0.0", "main": "dist/index.js", "types": "dist/index.d.ts", "scripts": { "build": "tsc", "watch": "tsc --watch" }}**my-utils/src/index.ts**:typescriptexport function formatDate(date: Date): string { return date.toISOString();}export function capitalize(str: string): string { return str.charAt(0).toUpperCase() + str.slice(1);}**链接和使用**:bash1. 构建包cd ~/projects/my-utilsnpm run buildnpm link2. 在项目中使用cd ~/projects/my-appnpm link my-utils3. 在代码中使用import { formatDate, capitalize } from 'my-utils';console.log(formatDate(new Date()));console.log(capitalize('hello'));## 性能考虑### 1. 链接 vs 安装| 特性 | npm link | npm install ||------|----------|--------------|| 速度 | 快(符号链接) | 慢(复制文件) || 磁盘空间 | 少(共享文件) | 多(独立副本) || 实时更新 | 是 | 否 || 生产环境 | 不推荐 | 推荐 |### 2. 何时使用 npm link- **开发阶段**:快速迭代和测试- **本地调试**:不需要发布即可测试- **多项目共享**:多个项目使用同一本地包### 3. 何时避免使用 npm link- **生产环境**:使用正式发布的版本- **CI/CD**:使用 npm install 或 npm ci- **性能敏感**:链接可能影响性能## 故障排除### 1. 检查链接状态bash查看全局链接npm list -g --depth=0 --link=true查看项目链接npm list --depth=0 --link=true### 2. 清理损坏的链接bash删除 node_modulesrm -rf node_modules重新安装npm install重新链接npm link my-package### 3. 查看链接路径bash查看链接的实际路径readlink node_modules/my-packagemacOS/Linuxls -la node_modules/my-packageWindowsdir node_modules\my-package## 替代方案### 1. 使用 npm packbash打包本地包cd ~/projects/my-packagenpm pack在项目中安装cd ~/projects/my-projectnpm install ../my-package/my-package-1.0.0.tgz### 2. 使用私有 registrybash发布到私有 registrycd ~/projects/my-packagenpm publish --registry=https://registry.yourcompany.com在项目中安装cd ~/projects/my-projectnpm install my-package --registry=https://registry.yourcompany.com### 3. 使用 workspacesjson{ "workspaces": [ "packages/*" ]}```npm link 是本地开发和测试 npm 包的强大工具,可以显著提高开发效率。理解其工作原理和最佳实践对于高效的包开发至关重要。
阅读 0·2月17日 23:28

什么是 npm 脚本,npm 的生命周期脚本是如何工作的?

npm scripts 是在 package.json 的 scripts 字段中定义的命令,用于自动化项目的常见任务。基本语法{ "scripts": { "start": "node index.js", "dev": "nodemon index.js", "build": "webpack --mode production", "test": "jest", "lint": "eslint src/" }}运行脚本使用 npm run <script-name> 或 npm <script-name>(对于 start、stop、test 等特殊命令):npm run devnpm startnpm test生命周期脚本npm 提供了特殊的生命周期脚本,在特定事件时自动执行:安装相关生命周期{ "scripts": { "preinstall": "echo 'Installing dependencies...'", "install": "node setup.js", "postinstall": "echo 'Dependencies installed!'", "preuninstall": "echo 'Uninstalling...'", "postuninstall": "echo 'Uninstalled!'" }}执行顺序:preinstallinstallpostinstall发布相关生命周期{ "scripts": { "prepublishOnly": "npm run build && npm run test", "prepack": "npm run build", "postpack": "echo 'Package packed!'", "publish": "node publish.js", "postpublish": "echo 'Published!'" }}执行顺序:prepublishOnlyprepackpreparepostpackpublishpostpublish其他生命周期{ "scripts": { "prestart": "npm run build", "start": "node index.js", "poststart": "echo 'Server started!'", "pretest": "npm run lint", "test": "jest", "posttest": "npm run coverage" }}脚本参数传递可以向脚本传递参数:{ "scripts": { "test": "jest", "test:watch": "jest --watch", "test:coverage": "jest --coverage" }}运行时传递额外参数:npm run test -- --verbose-- 后面的参数会传递给脚本命令。环境变量npm scripts 可以访问 npm 提供的环境变量:{ "scripts": { "build": "webpack --env.NODE_ENV=$npm_package_config_env", "start": "node $npm_package_main" }}常用环境变量:npm_package_name:包名npm_package_version:包版本npm_package_main:主入口文件npm_package_scripts_*:其他脚本npm_config_*:npm 配置npm_lifecycle_event:当前生命周期事件名跨平台兼容性npm scripts 在不同操作系统上的兼容性处理:使用 cross-env{ "scripts": { "build": "cross-env NODE_ENV=production webpack" }}使用 rimraf(跨平台删除){ "scripts": { "clean": "rimraf dist" }}常见脚本模式开发环境脚本{ "scripts": { "dev": "nodemon index.js", "dev:debug": "nodemon --inspect index.js", "dev:hot": "webpack serve --hot" }}构建脚本{ "scripts": { "build": "webpack --mode production", "build:dev": "webpack --mode development", "build:analyze": "webpack --mode production --analyze" }}测试脚本{ "scripts": { "test": "jest", "test:watch": "jest --watch", "test:coverage": "jest --coverage", "test:ci": "jest --ci --coverage --maxWorkers=2" }}代码质量脚本{ "scripts": { "lint": "eslint src/", "lint:fix": "eslint src/ --fix", "format": "prettier --write \"src/**/*.js\"", "typecheck": "tsc --noEmit" }}Git 钩子脚本(使用 husky){ "scripts": { "prepare": "husky install", "precommit": "lint-staged" }}并行和顺序执行使用 & 并行执行,使用 && 顺序执行:{ "scripts": { "parallel": "npm run lint & npm run test", "sequential": "npm run lint && npm run test", "all": "npm run lint && npm run test && npm run build" }}使用 npm-run-all 工具更灵活:{ "scripts": { "dev": "npm-run-all --parallel dev:*", "dev:server": "nodemon index.js", "dev:client": "webpack serve" }}最佳实践命名规范:使用冒号分隔相关脚本(如 test:watch)文档化:在 README 中说明自定义脚本的作用错误处理:确保脚本在失败时返回非零退出码性能优化:避免不必要的重复操作环境隔离:使用环境变量管理不同环境配置依赖管理:将开发工具作为 devDependencies调试技巧查看脚本执行详情npm run <script> -- --verbose查看实际执行的命令npm run <script> -n使用 npm link 调试本地包npm link ../my-local-packagenpm scripts 是项目自动化的核心,合理使用可以显著提高开发效率和项目可维护性。
阅读 0·2月17日 23:28

NPM是如何处理版本管理的?不同的版本范围符号有哪些?

npm 使用语义化版本控制(Semantic Versioning,简称 SemVer)来管理包的版本,格式为 MAJOR.MINOR.PATCH。版本号格式MAJOR(主版本号):当做了不兼容的 API 修改时递增MINOR(次版本号):当做了向下兼容的功能性新增时递增PATCH(修订号):当做了向下兼容的问题修正时递增示例:1.2.31 = 主版本号2 = 次版本号3 = 修订号版本范围符号npm 支持多种版本范围符号来指定依赖版本:1. 精确版本"express": "4.18.0"只安装精确的 4.18.0 版本2. 波浪号(~)"express": "~4.18.0"等价于 >=4.18.0 <4.19.0允许修订号更新,但主版本和次版本不变3. 插入符(^)"express": "^4.18.0"等价于 >=4.18.0 <5.0.0允许次版本和修订号更新,但主版本不变(默认行为)4. 大于/小于"express": ">4.0.0""express": "<5.0.0""express": ">=4.18.0 <5.0.0"5. 连字符范围"express": "4.16.0 - 4.18.0"包含 4.16.0 到 4.18.0 之间的所有版本6. 或符号(||)"express": "^4.0.0 || ^5.0.0"匹配任意一个满足条件的版本7. 通配符(*)"express": "4.*""express": "*"匹配任意版本8. 最新版本"express": "latest""express": "next"安装最新发布版本或下一个预发布版本预发布版本预发布版本使用连字符和标识符:"express": "5.0.0-beta.1""express": "5.0.0-rc.1""express": "5.0.0-alpha.3"常见预发布标识符:alpha:内部测试版本beta:公开测试版本rc(Release Candidate):候选发布版本package-lock.json 的作用package-lock.json 文件记录了每个依赖包的确切版本和依赖树结构:{ "name": "my-project", "version": "1.0.0", "lockfileVersion": 2, "packages": { "node_modules/express": { "version": "4.18.2", "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", "integrity": "sha512-...", "dependencies": { "accepts": "~1.3.8" } } }}作用:确保团队成员安装相同版本的依赖提高安装速度(直接使用锁定版本)防止依赖漂移导致的意外问题记录依赖的完整性校验信息版本管理最佳实践生产环境使用精确版本:确保稳定性开发环境使用范围版本:便于获取更新提交 package-lock.json:确保团队一致性定期更新依赖:npm outdated 查看过期包使用 npm audit:检查安全漏洞理解破坏性更新:主版本升级前查看变更日志常用版本管理命令# 查看当前安装的版本npm list# 查看包的最新版本npm view <package> version# 查看包的所有版本npm view <package> versions# 检查过期的包npm outdated# 更新包(遵循 package.json 中的范围)npm update# 更新到最新主版本npm install <package>@latest# 检查安全漏洞npm audit# 自动修复安全漏洞npm audit fix理解 npm 版本管理对于维护项目稳定性和安全性至关重要,特别是在团队协作和长期维护的项目中。
阅读 0·2月17日 23:27

如何发布 npm 包并配置私有注册库?

npm 允许开发者将自定义包发布到 npm registry,供他人使用。同时,企业可以使用私有 registry 管理内部包。发布 npm 包1. 准备工作注册 npm 账号:npm adduser# 或npm login验证登录:npm whoami2. package.json 配置确保 package.json 包含必要字段:{ "name": "my-awesome-package", "version": "1.0.0", "description": "An awesome npm package", "main": "index.js", "keywords": ["awesome", "package"], "author": "Your Name <email@example.com>", "license": "MIT", "repository": { "type": "git", "url": "https://github.com/username/my-awesome-package.git" }, "homepage": "https://github.com/username/my-awesome-package#readme", "bugs": { "url": "https://github.com/username/my-awesome-package/issues" }, "files": [ "dist", "README.md", "LICENSE" ], "scripts": { "prepublishOnly": "npm run build && npm run test", "build": "tsc", "test": "jest" }}重要字段说明:name:包名,必须唯一(在公开 registry)version:遵循语义化版本private:设置为 false 或删除该字段才能发布files:指定要包含在发布包中的文件3. 发布流程构建和测试:npm run buildnpm test预发布检查:npm pack这会生成 .tgz 文件,可以检查将要发布的内容。发布到公开 registry:npm publish发布特定标签:npm publish --tag beta发布到私有 scope:npm publish --access public4. 版本管理更新版本:# 补丁版本 (1.0.0 -> 1.0.1)npm version patch# 次版本 (1.0.0 -> 1.1.0)npm version minor# 主版本 (1.0.0 -> 2.0.0)npm version major# 预发布版本npm version prerelease --preid beta发布新版本:git push --follow-tagsnpm publish私有 Registry1. 配置私有 Registry设置全局 registry:npm config set registry https://registry.yourcompany.com设置项目级 registry:在项目根目录创建 .npmrc:registry=https://registry.yourcompany.com2. 使用 Scoped Packages创建 scoped 包:{ "name": "@yourcompany/package-name"}配置 scope registry:npm config set @yourcompany:registry https://registry.yourcompany.com在 .npmrc 中配置:@yourcompany:registry=https://registry.yourcompany.com3. 认证配置使用 token 认证:npm config set //registry.yourcompany.com/:_authToken YOUR_TOKEN在 .npmrc 中配置://registry.yourcompany.com/:_authToken=${NPM_TOKEN}使用环境变量:export NPM_TOKEN=your_token_here4. 发布到私有 registry发布 scoped 包:npm publish发布为公开包(在私有 registry):npm publish --access public常用发布命令# 检查包名是否可用npm view <package-name># 查看包信息npm info <package-name># 查看包的所有版本npm view <package-name> versions# 查看包的依赖npm view <package-name> dependencies# 取消发布(谨慎使用)npm unpublish <package-name>@<version># 废弃包版本npm deprecate <package-name>@<version> "This version is deprecated"# 搜索包npm search <keyword># 查看当前 registrynpm config get registry# 查看 npm 配置npm config list.npmignore 文件.npmignore 文件用于指定发布时要忽略的文件:# 源代码src/test/*.ts*.spec.js# 开发配置.eslintrc.prettierrcjest.config.jstsconfig.json# 文档docs/*.md!README.md# CI/CD.github/.gitlab-ci.yml# IDE.vscode/.idea/注意:.npmignore 会覆盖 files 字段。最佳实践1. 版本管理遵循语义化版本规范在发布前运行完整测试使用 prepublishOnly 脚本确保质量维护 CHANGELOG.md 记录变更2. 包结构my-package/├── package.json├── README.md├── LICENSE├── .npmignore├── src/│ └── index.ts├── dist/│ ├── index.js│ └── index.d.ts└── test/ └── index.test.js3. 文档提供清晰的 README.md包含安装和使用示例说明 API 和配置选项提供贡献指南4. 安全性不要在包中包含敏感信息使用 npm audit 检查安全漏洞定期更新依赖使用 .npmignore 排除敏感文件5. 持续集成# .github/workflows/publish.ymlname: Publish Packageon: push: tags: - 'v*'jobs: publish: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 with: node-version: '18' registry-url: 'https://registry.npmjs.org' - run: npm ci - run: npm test - run: npm publish env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}常见问题1. 包名冲突如果包名已被占用,考虑:使用 scoped 包:@username/package-name选择不同的名称联系包的所有者2. 发布失败常见原因:包名已被占用缺少必要字段版本号未更新认证失败3. 取消发布限制npm 限制取消发布:只能取消发布 72 小时内的版本不能取消发布超过 24 小时的主要版本使用 deprecate 替代 unpublish企业级解决方案1. Verdaccio轻量级私有 npm registry:npm install -g verdaccioverdaccio2. Artifactory企业级制品仓库,支持多种包管理器。3. Nexus Repository另一个流行的企业级制品仓库解决方案。4. GitHub Packages使用 GitHub 作为私有 registry:npm config set registry https://npm.pkg.github.comnpm login --scope=@your-username --registry=https://npm.pkg.github.com掌握 npm 发布和私有 registry 配置对于团队协作和企业级项目管理至关重要。
阅读 0·2月17日 23:27

npm 和 Yarn 的区别,以及如何选择

npm 和 Yarn 是两个最流行的 JavaScript 包管理器,各有优缺点。了解它们的区别和选择合适的工具对于项目开发很重要。基本介绍npm发布时间:2010 年开发者:Isaac Z. Schlueter维护者:npm, Inc.(现属 GitHub)默认安装:随 Node.js 一起安装Yarn发布时间:2016 年开发者:Facebook、Google、Exponent 和 Tilde维护者:Open Collective 社区安装方式:需要单独安装核心区别1. 安装速度npm:早期版本串行安装依赖npm 7+ 引入并行安装,速度显著提升使用缓存机制加速重复安装Yarn:从一开始就支持并行安装通常比 npm 6 及更早版本快与 npm 7+ 速度相当# npm 安装npm install# Yarn 安装yarn install2. 锁文件npm:使用 package-lock.jsonnpm 5+ 自动生成记录精确的依赖版本和树结构Yarn:使用 yarn.lock自动生成更详细的锁文件格式示例:// package-lock.json{ "name": "my-project", "lockfileVersion": 2, "packages": { "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-..." } }}# yarn.lock# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.# yarn lockfile v1lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#..." integrity sha512-...3. 命令差异| 功能 | npm | Yarn ||------|-----|------|| 安装依赖 | npm install | yarn install || 添加依赖 | npm install <pkg> | yarn add <pkg> || 添加开发依赖 | npm install <pkg> -D | yarn add <pkg> -D || 全局安装 | npm install -g <pkg> | yarn global add <pkg> || 更新依赖 | npm update | yarn upgrade || 删除依赖 | npm uninstall <pkg> | yarn remove <pkg> || 运行脚本 | npm run <script> | yarn run <script> 或 yarn <script> || 查看信息 | npm info <pkg> | yarn info <pkg> |4. 工作区(Workspaces)npm:npm 7+ 原生支持工作区配置简单,与 package.json 集成{ "name": "my-monorepo", "workspaces": [ "packages/*" ]}Yarn:Yarn 1+ 支持工作区更成熟的工作区功能支持 Yarn Plug'n'Play(PnP){ "name": "my-monorepo", "private": true, "workspaces": { "packages": [ "packages/*" ] }}5. 离线模式npm:npm install --offlinenpm install --prefer-offlineYarn:yarn install --offlineyarn install --prefer-offlineYarn 的离线模式更成熟,缓存管理更好。6. 输出格式npm:输出较详细显示安装进度和警告Yarn:输出更简洁使用 emoji 和颜色更好的用户体验7. 安全性npm:npm audit 内置安全审计npm 8+ 支持 overrides 强制版本与 npm registry 集成良好Yarn:yarn audit 安全审计支持 resolutions 强制版本更严格的依赖解析8. 插件和扩展npm:插件系统相对简单通过 npm scripts 扩展功能Yarn:丰富的插件生态系统支持 Yarn 2+ 的插件系统更灵活的自定义选项性能对比安装速度测试大型项目(1000+ 依赖):- npm 6: ~120s- npm 7+: ~60s- Yarn 1: ~45s- Yarn 2+: ~40s中型项目(100-500 依赖):- npm 6: ~30s- npm 7+: ~15s- Yarn 1: ~12s- Yarn 2+: ~10s磁盘空间node_modules 大小:- npm: 标准嵌套结构- Yarn 1: 标准嵌套结构- Yarn 2+ (PnP): 无 node_modules,显著减少空间选择建议选择 npm 的场景新项目:npm 7+ 性能已足够好简单项目:不需要复杂的工作区功能团队熟悉:团队已经熟悉 npmCI/CD:大多数 CI 环境默认支持 npm发布包:npm 发布流程更简单选择 Yarn 的场景大型 monorepo:Yarn 工作区更成熟需要离线支持:Yarn 离线模式更好性能敏感:Yarn 通常更快需要 PnP:Yarn 2+ 的 Plug'n'Play 功能团队偏好:团队更喜欢 Yarn 的用户体验迁移指南从 npm 迁移到 Yarn# 安装 Yarnnpm install -g yarn# 在项目目录运行yarn install# Yarn 会自动读取 package.json 并生成 yarn.lock从 Yarn 迁移到 npm# 删除 yarn.lockrm yarn.lock# 运行 npm installnpm install# npm 会生成 package-lock.json高级功能对比1. 依赖解析策略npm:嵌套依赖结构npm 7+ 使用更智能的解析算法支持依赖提升Yarn:更严格的依赖解析Yarn 2+ 支持零安装(PnP)更好的依赖去重2. 缓存机制npm:npm cache verifynpm cache clean --forceYarn:yarn cache listyarn cache cleanYarn 的缓存管理更精细。3. 版本管理npm:npm version majornpm version minornpm version patchYarn:yarn version --majoryarn version --minoryarn version --patch4. 全局包管理npm:npm list -g --depth=0npm uninstall -g <pkg>Yarn:yarn global listyarn global remove <pkg>配置文件.npmrc# npm 配置registry=https://registry.npmjs.orgcache=/path/to/cachestrict-ssl=true.yarnrc.yml# Yarn 2+ 配置nodeLinker: node-modulesenableGlobalCache: truenpmRegistryServer: "https://registry.npmjs.org"最佳实践1. 锁文件管理始终提交锁文件到版本控制不要手动编辑锁文件定期更新依赖2. 版本范围{ "dependencies": { // 生产环境使用精确版本 "critical-package": "1.2.3", // 开发环境可以使用范围版本 "dev-package": "^1.2.3" }}3. 安全审计# npmnpm auditnpm audit fix# Yarnyarn audityarn audit --json4. CI/CD 优化# GitHub Actions - npm- name: Setup Node.js uses: actions/setup-node@v3 with: node-version: '18' cache: 'npm'# GitHub Actions - Yarn- name: Setup Node.js uses: actions/setup-node@v3 with: node-version: '18' cache: 'yarn'未来趋势npm:持续改进性能和安全性Yarn:推动 PnP 和零安装概念pnpm:新兴的包管理器,使用硬链接节省空间Bun:新一代 JavaScript 运行时,内置包管理器选择 npm 还是 Yarn 主要取决于项目需求、团队偏好和具体场景。两者都是优秀的包管理器,各有优势。
阅读 0·2月17日 23:26

npm audit 是如何工作的?npm 安全的最佳实践有哪些? -

npm 提供了内置的安全审计功能来检测和修复项目依赖中的安全漏洞。了解 npm 安全机制对于维护应用程序安全至关重要。npm audit 命令基本用法# 扫描项目依赖中的安全漏洞npm audit# 显示审计结果的 JSON 格式npm audit --json# 只显示生产依赖的漏洞npm audit --production审计报告示例found 3 vulnerabilities (2 moderate, 1 high)┌───────────────┬──────────────────────────────────────┐│ Low │ Prototype Pollution │├───────────────┼──────────────────────────────────────┤│ Moderate │ Regular Expression Denial of Service │├───────────────┼──────────────────────────────────────┤│ High │ Command Injection │└───────────────┴──────────────────────────────────────┘漏洞严重级别npm 将漏洞分为以下严重级别:Low(低):影响有限,需要特定条件Moderate(中):有一定影响,需要用户交互High(高):严重影响,可能导致数据泄露Critical(严重):极高影响,可能导致系统完全被控制自动修复漏洞npm audit fix# 自动修复可修复的漏洞npm audit fix# 只修复生产依赖的漏洞npm audit fix --production# 强制修复(可能引入破坏性更改)npm audit fix --force修复策略npm audit fix 会:识别可以安全更新的依赖更新到修复了漏洞的版本更新 package-lock.json报告无法自动修复的漏洞手动修复漏洞1. 更新特定包# 更新到最新版本npm update <package-name># 安装特定版本npm install <package-name>@<version>2. 使用 overrides(npm 8+)在 package.json 中使用 overrides 强制使用特定版本:{ "overrides": { "vulnerable-package": "1.2.3" }}3. 使用 resolutions(Yarn)如果使用 Yarn,可以使用 resolutions:{ "resolutions": { "vulnerable-package": "1.2.3" }}npm audit 配置配置审计级别# 设置审计级别(默认为 low)npm config set audit-level moderate# 可选值:low, moderate, high, critical禁用审计# 全局禁用审计npm config set audit false# 安装时跳过审计npm install --no-audit安全最佳实践1. 定期审计# 在 CI/CD 流程中添加审计npm audit2. 锁定依赖版本{ "dependencies": { "package": "1.2.3" }}使用精确版本而不是范围版本。3. 提交 package-lock.json确保团队使用相同的依赖版本。4. 使用 .npmrc 配置# .npmrcaudit=trueaudit-level=moderate5. 监控依赖更新# 查看过期的包npm outdated# 查看包的安全公告npm view <package> security-advisoriesCI/CD 集成GitHub Actions 示例name: Security Auditon: push: branches: [main] pull_request: branches: [main] schedule: - cron: '0 0 * * 0' # 每周运行jobs: audit: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Setup Node.js uses: actions/setup-node@v3 with: node-version: '18' - name: Install dependencies run: npm ci - name: Run security audit run: npm audit - name: Attempt to fix vulnerabilities run: npm audit fix continue-on-error: true - name: Check for remaining vulnerabilities run: | if [ $(npm audit --json | jq '.metadata.vulnerabilities.high + .metadata.vulnerabilities.critical') -gt 0 ]; then echo "High or critical vulnerabilities found!" exit 1 fi使用第三方工具# 使用 Snyknpm install -g snyksnyk test# 使用 npm-check-updatesnpm install -g npm-check-updatesncu -u供应链安全1. 验证包完整性npm 使用 SHA-512 校验和验证包完整性:{ "integrity": "sha512-..."}2. 使用 npm provenancenpm provenance 提供包的来源验证:npm publish --provenance3. 检查包维护者# 查看包的维护者npm view <package> maintainers# 查看包的发布历史npm view <package> time常见安全问题1. 依赖混淆攻击攻击者发布与内部包同名的恶意包。预防措施:使用 scoped 包:@company/package配置私有 registry审查新安装的包2. Typosquatting 攻击攻击者发布拼写错误的包名。预防措施:仔细检查包名使用官方 registry审查包的下载量和维护者3. 恶意代码注入攻击者在包中注入恶意代码。预防措施:审查包的源代码使用 npm audit 定期检查限制包的权限安全工具1. npm audit内置的安全审计工具。2. Snyk提供更全面的安全扫描:npm install -g snyksnyk authsnyk test3. DependabotGitHub 的依赖更新和安全警报工具。4. WhiteSource企业级开源安全管理平台。5. OWASP Dependency-Check扫描项目依赖中的已知漏洞。.npmignore 和安全性确保不将敏感信息发布到 npm:# .npmignore.env*.key*.pemsecrets/config/production.json许可证合规检查依赖的许可证:# 使用 license-checkernpm install -g license-checkerlicense-checker# 使用 npm-license-crawlernpm install -g npm-license-crawlernpm-license-crawler安全配置示例package.json{ "name": "my-secure-app", "version": "1.0.0", "engines": { "node": ">=16.0.0", "npm": ">=8.0.0" }, "scripts": { "audit": "npm audit", "audit:fix": "npm audit fix", "check-licenses": "license-checker" }, "dependencies": { "express": "^4.18.0" }, "overrides": { "vulnerable-package": "1.2.3" }}.npmrc# 安全配置audit=trueaudit-level=moderatefetch-retries=3fetch-retry-mintimeout=20000fetch-retry-maxtimeout=120000strict-ssl=true常见问题解决1. 无法自动修复的漏洞# 手动查找替代包npm search <package-name># 联系包维护者npm view <package> author2. 依赖冲突# 使用 overrides 解决冲突npm install --force3. 误报# 查看漏洞详情npm audit --json# 查看包的安全公告npm view <package> security-advisoriesnpm 安全审计是保护应用程序免受已知漏洞攻击的重要工具。定期审计和及时更新依赖是维护安全性的关键。
阅读 0·2月17日 23:25

最重要的 npm 命令及其高效使用方法有哪些?

npm 提供了多种命令来管理包和项目,掌握这些命令对于高效的 JavaScript 开发至关重要。包管理命令安装包# 安装最新版本npm install <package># 安装特定版本npm install <package>@<version># 安装多个包npm install <package1> <package2> <package3># 安装为生产依赖npm install <package> --save-prodnpm install <package> -P# 安装为开发依赖npm install <package> --save-devnpm install <package> -D# 安装为可选依赖npm install <package> --save-optionalnpm install <package> -O# 安装为同伴依赖npm install <package> --save-peer# 全局安装npm install <package> --globalnpm install <package> -g# 精确安装版本npm install <package> --save-exactnpm install <package> -E# 强制重新安装npm install <package> --force更新包# 更新所有包(遵循 package.json 中的范围)npm update# 更新特定包npm update <package># 更新到最新主版本npm update <package> --latest# 检查过期的包npm outdated# 检查特定包是否过期npm outdated <package>卸载包# 卸载包npm uninstall <package># 卸载多个包npm uninstall <package1> <package2># 卸载全局包npm uninstall <package> --globalnpm uninstall <package> -g# 卸载并从 package.json 中移除npm uninstall <package> --save# 卸载开发依赖npm uninstall <package> --save-dev信息查询命令查看包信息# 查看包的基本信息npm info <package># 查看包的特定字段npm info <package> versionnpm info <package> descriptionnpm info <package> authornpm info <package> homepage# 查看包的所有版本npm info <package> versions# 查看包的依赖npm info <package> dependencies# 查看包的开发依赖npm info <package> devDependencies# 查看包的同伴依赖npm info <package> peerDependencies# 查看包的发布时间npm info <package> time# 查看包的下载量npm info <package> downloads# 查看包的维护者npm info <package> maintainers# 查看包的关键词npm info <package> keywords查看已安装的包# 查看所有已安装的包npm list# 查看顶级依赖npm list --depth=0# 查看特定包npm list <package># 查看全局安装的包npm list --global# 查看全局顶级依赖npm list --global --depth=0# 以 JSON 格式输出npm list --json# 只显示生产依赖npm list --production# 只显示开发依赖npm list --dev# 显示包的大小npm list --long搜索包# 搜索包npm search <keyword># 搜索并限制结果数量npm search <keyword> --long# 以 JSON 格式搜索npm search <keyword> --json# 搜索特定维护者的包npm search <keyword> --author <author># 搜索特定关键词的包npm search <keyword> --keywords <keywords>项目管理命令初始化项目# 初始化新项目(交互式)npm init# 使用默认值初始化npm init -ynpm init --yes# 使用特定配置初始化npm init --scope=@mycompany# 创建特定类型的包npm init react-app my-appnpm init vue-app my-app运行脚本# 运行脚本npm run <script># 运行 start 脚本(简写)npm start# 运行 stop 脚本(简写)npm stop# 运行 test 脚本(简写)npm test# 运行 restart 脚本(简写)npm restart# 列出所有脚本npm run# 传递参数给脚本npm run <script> -- --arg1 --arg2# 以静默模式运行npm run <script> --silentnpm run <script> -s版本管理# 更新补丁版本(1.0.0 -> 1.0.1)npm version patch# 更新次版本(1.0.0 -> 1.1.0)npm version minor# 更新主版本(1.0.0 -> 2.0.0)npm version major# 更新预发布版本npm version prereleasenpm version prerelease --preid betanpm version prerelease --preid alpha# 更新到特定版本npm version 1.2.3# 创建 Git 标签npm version patch -m "Bump to version %s"# 不创建 Git 标签npm version patch --no-git-tag-version发布命令发布包# 发布包npm publish# 发布特定标签npm publish --tag betanpm publish --tag next# 发布为公开包(scoped 包)npm publish --access public# 发布为受限包(scoped 包)npm publish --access restricted# 发布特定目录npm publish <directory># 发布前运行测试npm publish --dry-run# 发布并附带 provenancenpm publish --provenance取消发布# 取消发布特定版本npm unpublish <package>@<version># 取消发布整个包(谨慎使用)npm unpublish <package># 强制取消发布npm unpublish <package>@<version> --force废弃版本# 废弃特定版本npm deprecate <package>@<version> "This version is deprecated"# 废弃所有版本npm deprecate <package> "This package is deprecated"配置命令查看配置# 查看所有配置npm config list# 查看特定配置npm config get <key># 查看用户配置npm config list --user# 查看全局配置npm config list --global# 查看项目配置npm config list --project# 编辑配置文件npm config edit# 查看配置文件位置npm config get userconfignpm config get globalconfig设置配置# 设置配置npm config set <key> <value># 设置全局配置npm config set <key> <value> --global# 删除配置npm config delete <key># 删除全局配置npm config delete <key> --global常用配置# 设置 registrynpm config set registry https://registry.npmmirror.com# 设置缓存目录npm config set cache /path/to/cache# 设置前缀npm config set prefix /usr/local# 设置日志级别npm config set loglevel info# 设置代理npm config set https-proxy http://proxy.example.com:8080# 设置严格 SSLnpm config set strict-ssl true# 设置保存前缀npm config set save-prefix ^# 设置精确保存npm config set save-exact true缓存命令管理缓存# 验证缓存npm cache verify# 清理缓存npm cache clean# 强制清理缓存npm cache clean --force# 添加到缓存npm cache add <package>@<version># 查看缓存目录npm config get cache安全命令安全审计# 运行安全审计npm audit# 显示审计结果的 JSON 格式npm audit --json# 只审计生产依赖npm audit --production# 只审计开发依赖npm audit --dev# 自动修复漏洞npm audit fix# 强制修复漏洞npm audit fix --force# 只修复生产依赖的漏洞npm audit fix --production# 显示漏洞详情npm audit --audit-level=lownpm audit --audit-level=moderatenpm audit --audit-level=highnpm audit --audit-level=critical高级命令工作区命令# 在所有工作区中运行命令npm run <script> -wsnpm run <script> --workspaces# 在特定工作区中运行命令npm run <script> --workspace=<workspace># 安装到所有工作区npm install -ws# 添加到特定工作区npm add <package> --workspace=<workspace>执行命令# 执行包中的二进制文件npm exec <package># 执行特定包npm exec --package=<package> <command># 等同于 npxnpx <package># 执行并传递参数npx <package> --arg1 --arg2# 使用特定版本npx <package>@<version># 忽略本地安装npx --ignore-existing <package># 使用缓存npx --yes <package>npx -y <package>查询命令# 查询依赖npm query ":root"# 查询所有过期的包npm query ":outdated"# 查询所有开发依赖npm query ":dev"# 查询特定包的依赖npm query "lodash > *"# 查询特定路径的包npm query "#./packages/*"差异命令# 比较当前安装与 package.jsonnpm diff# 比较特定包npm diff <package># 比较两个版本npm diff <package>@1.0.0 <package>@2.0.0# 比较与 git 的差异npm diff --git其他有用命令资金命令# 查看项目的资金来源npm fund# 查看特定包的资金来源npm fund <package># 打开资金链接npm fund --which=<package>组织命令# 创建组织npm org create <organization># 添加成员npm org add <user> <organization># 移除成员npm org rm <user> <organization># 列出成员npm org ls <organization># 设置角色npm org set <user> <role> <organization>访问命令# 设置包访问权限npm access public <package># 设置包为受限访问npm access restricted <package># 添加包的协作者npm access add <user> <package># 移除包的协作者npm access rm <user> <package># 列出包的协作者npm access ls <package># 查看包的访问权限npm access status <package>登录和注销# 登录npm loginnpm adduser# 注销npm logout# 查看当前用户npm whoami# 查看用户信息npm profile get# 更新用户信息npm profile set <key> <value># 更改密码npm profile set password团队命令# 创建团队npm team create <team> <organization># 添加成员到团队npm team add <user> <team># 从团队移除成员npm team rm <user> <team># 列出团队成员npm team ls <team># 删除团队npm team destroy <team>最佳实践1. 使用 npm ci 替代 npm install# CI 环境使用 npm cinpm ci2. 使用精确版本# 生产环境使用精确版本npm install <package> --save-exact3. 定期更新依赖# 检查过期包npm outdated# 更新包npm update4. 定期运行安全审计# 运行安全审计npm audit# 修复漏洞npm audit fix5. 使用 .npmrc 配置# 项目级配置echo "registry=https://registry.npmmirror.com" > .npmrc掌握这些 npm 命令可以显著提高开发效率和项目管理能力。
阅读 0·2月17日 23:24

npm 缓存机制是怎样的?如何优化依赖安装速度?

npm 提供了多种缓存机制来加速包的安装和减少网络请求。理解缓存机制对于优化构建性能和解决安装问题非常重要。npm 缓存位置默认缓存位置npm 缓存默认存储在以下位置:macOS/Linux: ~/.npmWindows: %AppData%/npm-cache查看缓存位置:npm config get cache缓存目录结构~/.npm/├── _cacache/│ ├── content-v2/│ │ └── sha512/│ │ └── ...│ └── index-v5/│ └── ...└── _logs/缓存管理命令查看缓存信息# 查看缓存大小npm cache verify# 查看缓存目录npm config get cache清理缓存# 清理缓存(npm 5+)npm cache clean --force# 清理特定包的缓存npm cache clean <package-name>验证缓存# 验证缓存完整性npm cache verify缓存工作原理1. 包下载缓存当安装包时,npm 会:检查本地缓存是否存在该包如果存在且未过期,直接使用缓存如果不存在或已过期,从 registry 下载将下载的包存储到缓存2. 缓存键缓存使用内容的 SHA-512 哈希作为键:~/.npm/_cacache/content-v2/sha512/<hash>3. 缓存索引索引文件存储包元数据和位置信息:~/.npm/_cacache/index-v5/缓存配置配置缓存大小# 设置缓存大小限制(默认为 10GB)npm config set cache-max 10737418240# 设置缓存最小保留时间(秒)npm config set cache-min 3600配置缓存策略# 禁用缓存(不推荐)npm config set cache false# 设置缓存目录npm config set cache /path/to/cache离线安装使用缓存进行离线安装:# 使用缓存安装(不检查网络)npm install --offline# 使用缓存但允许网络回退npm install --prefer-offline# 优先使用网络,缓存作为后备npm install --prefer-onlineCI/CD 中的缓存优化GitHub Actions 示例name: Build and Teston: [push, pull_request]jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Setup Node.js uses: actions/setup-node@v3 with: node-version: '18' cache: 'npm' - name: Install dependencies run: npm ci - name: Run tests run: npm testDocker 优化FROM node:18-alpine# 复制 package 文件COPY package*.json ./# 安装依赖(利用缓存)RUN npm ci --only=production# 复制应用代码COPY . .CMD ["npm", "start"]自定义缓存目录# 设置自定义缓存目录export npm_config_cache=/custom/cache/pathnpm install缓存相关问题和解决方案1. 缓存损坏症状:安装失败或出现奇怪的错误解决方案:npm cache clean --forcenpm install2. 缓存占用过多空间解决方案:# 查看缓存大小npm cache verify# 清理缓存npm cache clean --force# 定期清理(添加到 crontab)0 0 * * 0 npm cache clean --force3. 缓存导致版本不一致解决方案:# 强制重新下载npm install --force# 删除 node_modules 和 package-lock.jsonrm -rf node_modules package-lock.jsonnpm install性能优化技巧1. 使用 npm cinpm ci 专门用于 CI 环境,比 npm install 更快:npm ci优势:直接使用 package-lock.json跳过某些用户级配置删除 node_modules 后重新安装更快的安装速度2. 并行安装npm 7+ 支持并行安装:# 设置并行安装数量npm config set maxsockets 503. 使用镜像使用国内镜像加速下载:# 使用淘宝镜像npm config set registry https://registry.npmmirror.com# 使用 cnpmnpm install -g cnpm --registry=https://registry.npmmirror.com4. 预安装常用包# 全局安装常用包npm install -g nodemon typescript# 使用 npm link 共享本地包npm link ../local-package缓存监控查看缓存统计# 查看缓存大小du -sh ~/.npm# 查看缓存目录结构tree ~/.npm/_cacache -L 2缓存分析工具# 使用 npm-cache-statsnpm install -g npm-cache-statsnpm-cache-stats最佳实践1. 开发环境保持默认缓存配置定期清理缓存(每月一次)使用 npm cache verify 检查缓存完整性2. CI/CD 环境使用 npm ci 替代 npm install配置缓存层(GitHub Actions cache、Docker volume)设置合理的缓存保留策略3. 生产环境使用 npm ci --production 只安装生产依赖考虑使用 .npmrc 锁定配置定期清理缓存以释放空间4. 离线环境预先下载所有依赖到缓存使用 npm install --offline 进行离线安装考虑使用私有 registry.npmrc 配置示例# 项目级 .npmrccache=/path/to/project/.npm-cacheregistry=https://registry.npmmirror.comprefer-offline=truefetch-retries=3fetch-retry-mintimeout=20000fetch-retry-maxtimeout=120000常见问题排查安装速度慢# 检查网络连接ping registry.npmjs.org# 使用镜像npm config set registry https://registry.npmmirror.com# 清理缓存npm cache clean --force缓存问题导致安装失败# 清理缓存npm cache clean --force# 删除 node_modules 和 lock 文件rm -rf node_modules package-lock.json# 重新安装npm install磁盘空间不足# 查看缓存大小du -sh ~/.npm# 清理缓存npm cache clean --force# 设置缓存大小限制npm config set cache-max 5368709120理解 npm 缓存机制可以帮助开发者优化构建性能、解决安装问题,并在 CI/CD 环境中提高效率。
阅读 0·2月17日 23:23

如何诊断和排查 npm 问题?常见故障处理技巧有哪些?

npm 提供了多种诊断和调试工具,帮助开发者解决包管理相关的问题。掌握这些工具可以显著提高问题排查效率。npm 诊断命令npm doctornpm doctor 检查 npm 环境的健康状况,识别潜在问题。# 运行诊断npm doctor# 检查特定方面npm doctor --registrynpm doctor --networknpm doctor --permissions输出示例:npm ERR! code ENOENTnpm ERR! syscall opennpm ERR! path /Users/user/.npm/_cacache/index-v5/npm ERR! errno -2npm ERR! enoent ENOENT: no such file or directorynpm config diagnose诊断配置问题:# 查看配置npm config list# 查看特定配置npm config get registry# 查看配置文件位置npm config get userconfignpm config get globalconfignpm config get projectconfig常见问题诊断1. 安装失败问题:网络问题# 检查网络连接ping registry.npmjs.org# 检查代理设置npm config get proxynpm config get https-proxy# 使用镜像npm config set registry https://registry.npmmirror.com问题:权限问题# 检查权限ls -la ~/.npm# 修复权限sudo chown -R $(whoami) ~/.npm# 使用 npm config 设置用户npm config set user $(whoami)问题:缓存问题# 清理缓存npm cache clean --force# 验证缓存npm cache verify# 重新安装rm -rf node_modules package-lock.jsonnpm install2. 依赖冲突问题:peer 依赖冲突# 查看依赖树npm ls# 查看特定包的依赖npm ls <package># 使用严格模式npm config set strict-peer-deps true# 强制安装npm install --force问题:版本冲突# 查看过期的包npm outdated# 更新包npm update# 使用 overridesnpm config set overrides '{"package": "1.2.3"}'3. 锁文件问题问题:package-lock.json 损坏# 删除锁文件rm package-lock.json# 重新安装npm install# 使用 npm cinpm ci问题:锁文件不一致# 查看差异npm diff# 重新生成锁文件rm package-lock.jsonnpm install4. 脚本执行问题问题:脚本找不到# 查看所有脚本npm run# 检查脚本语法cat package.json | grep scripts# 使用完整路径npm run /path/to/script.js问题:环境变量问题# 查看环境变量npm run <script> --verbose# 设置环境变量export NODE_ENV=productionnpm run build# 在脚本中使用环境变量高级诊断工具1. npm explain解释包为什么被安装:# 解释包的安装原因npm explain <package># 查看依赖树npm explain <package> --json输出示例:express@4.18.2node_modules/express express@"^4.18.0" from the root project2. npm query查询依赖信息:# 查询所有过期的包npm query ":outdated"# 查询所有开发依赖npm query ":dev"# 查询特定包的依赖npm query "lodash > *"# 查询依赖路径npm query "#./packages/*"3. npm diff比较依赖版本:# 比较当前安装与 package.jsonnpm diff# 比较特定包npm diff <package># 比较两个版本npm diff <package>@1.0.0 <package>@2.0.04. npm ls查看已安装的包:# 查看所有包npm ls# 查看顶级依赖npm ls --depth=0# 查看特定包npm ls <package># 以 JSON 格式输出npm ls --json# 查看全局包npm ls --global调试技巧1. 启用详细日志# 设置日志级别npm config set loglevel verbose# 运行命令npm install --verbose# 设置为调试级别npm config set loglevel silly2. 使用调试标志# 启用调试npm install --dd# 启用详细调试npm install --ddd# 查看网络请求npm install --loglevel=http3. 查看安装日志# 查看日志文件cat ~/.npm/_logs/*.log# 查看最新日志tail -f ~/.npm/_logs/*.log# 搜索错误grep -i error ~/.npm/_logs/*.log4. 使用 npm debug# 启用调试模式DEBUG=* npm install# 启用特定模块的调试DEBUG=npm:* npm install# 启用网络调试DEBUG=npm:request npm install性能诊断1. 安装速度慢# 检查网络速度ping registry.npmjs.org# 使用镜像npm config set registry https://registry.npmmirror.com# 增加并行度npm config set maxsockets 50npm config set network-concurrency 16# 使用缓存npm install --prefer-offline2. 磁盘空间问题# 查看磁盘使用du -sh ~/.npmdu -sh node_modules# 清理缓存npm cache clean --force# 使用 pnpm 节省空间npm install -g pnpm3. 内存问题# 增加内存限制export NODE_OPTIONS="--max-old-space-size=4096"# 使用 npm cinpm ci# 分批安装npm install --no-package-lock安全诊断1. 安全漏洞# 运行安全审计npm audit# 查看漏洞详情npm audit --json# 修复漏洞npm audit fix# 强制修复npm audit fix --force2. 供应链安全# 查看包的完整性npm view <package> integrity# 检查包的来源npm view <package> repository# 查看包的维护者npm view <package> maintainers3. 许可证问题# 检查许可证npm install -g license-checkerlicense-checker# 查看特定包的许可证npm view <package> license工具和插件1. npm-check-updates检查依赖更新:# 安装npm install -g npm-check-updates# 检查更新ncu# 更新 package.jsonncu -u2. npm-check检查包的状态:# 安装npm install -g npm-check# 检查包npm-check# 交互式更新npm-check -u3. depcheck检查未使用的依赖:# 安装npm install -g depcheck# 检查未使用的依赖depcheck# 忽略特定包depcheck --ignore-missing=package-name4. npm-why解释包的安装原因:# 安装npm install -g npm-why# 查询包npm-why <package>故障排除流程1. 通用故障排除流程# 1. 清理缓存npm cache clean --force# 2. 删除 node_modulesrm -rf node_modules# 3. 删除锁文件rm package-lock.json# 4. 重新安装npm install# 5. 如果仍然失败,使用详细日志npm install --verbose2. 特定问题流程安装失败# 1. 检查网络ping registry.npmjs.org# 2. 检查代理npm config get proxy# 3. 使用镜像npm config set registry https://registry.npmmirror.com# 4. 重新安装npm install依赖冲突# 1. 查看依赖树npm ls# 2. 查看过期的包npm outdated# 3. 更新包npm update# 4. 使用 overridesnpm config set overrides '{"package": "1.2.3"}'脚本失败# 1. 查看脚本npm run# 2. 检查语法cat package.json | grep scripts# 3. 手动运行脚本node /path/to/script.js# 4. 查看环境变量npm run <script> --verbose最佳实践1. 定期诊断# 每周运行一次npm doctornpm auditnpm outdated2. 保存诊断信息# 保存诊断结果npm doctor > npm-doctor.lognpm audit > npm-audit.lognpm outdated > npm-outdated.log3. 使用版本控制# 提交 package-lock.jsongit add package-lock.jsongit commit -m "Update lock file"# 回滚到之前的版本git checkout HEAD~1 package-lock.json4. 文档化问题在项目中创建 TROUBLESHOOTING.md:# Troubleshooting## Common Issues### Installation Failsbashnpm cache clean --forcerm -rf node_modules package-lock.jsonnpm install### Dependency Conflictsbashnpm lsnpm update掌握 npm 诊断和调试工具可以显著提高问题排查效率,减少开发中的停顿时间。
阅读 0·2月17日 23:23