文章目录
- 基础概念篇
- 使用技巧篇
- 高级应用篇
- 工程化篇
- 安全与优化篇
- 综合实战篇
基础概念篇
-
什么是NPM?它的主要作用是什么?
- 解析:NPM(Node Package Manager)是Node.js的包管理工具,用于安装、共享和管理JavaScript依赖。主要作用包括:依赖管理、脚本执行、版本控制和包发布。
-
package.json文件的作用是什么?
- 解析:项目配置文件,记录项目元数据(名称、版本等)、依赖包列表、脚本命令等。NPM根据它来管理项目依赖和配置。
-
package-lock.json的作用是什么?为什么需要它?
- 解析:锁定依赖树的具体版本,确保不同环境安装完全相同的依赖版本。解决package.json中版本范围(~^)导致的安装不一致问题。
-
^和~在版本号前有什么区别?
- 解析:
^1.2.3
允许更新次版本和修订号(如1.3.0),~1.2.3
只允许更新修订号(如1.2.4)。*
或省略则允许更新主版本。
- 解析:
-
devDependencies和dependencies有什么区别?
- 解析:dependencies是生产环境需要的依赖,devDependencies是开发时需要的工具(如测试框架)。生产环境安装时可用
--production
跳过devDependencies。
- 解析:dependencies是生产环境需要的依赖,devDependencies是开发时需要的工具(如测试框架)。生产环境安装时可用
使用技巧篇
-
如何全局安装一个包?什么情况下需要全局安装?
- 解析:
npm install -g 包名
。工具类包(如cli工具)适合全局安装,项目依赖不建议全局安装。
- 解析:
-
npm install和npm ci有什么区别?
- 解析:
npm install
会更新依赖树和lock文件,npm ci
严格按lock文件安装(不修改lock),适合自动化环境确保一致性。
- 解析:
-
如何更新项目中的所有依赖包?
- 解析:1)
npm outdated
查看可更新包 2)npm update
更新 3) 或使用工具如npm-check-updates
。
- 解析:1)
-
npx是什么?它解决了什么问题?
- 解析:npx是npm5.2+自带的包执行工具,无需全局安装即可临时运行包。解决了全局污染和版本冲突问题。
-
如何发布一个npm包?主要步骤是什么?
- 解析:1)
npm init
创建package.json 2) 编写代码 3)npm login
登录 4)npm publish
发布。注意包名唯一性和版本号规范。
- 解析:1)
高级应用篇
-
npm scripts的原理是什么?如何自定义脚本?
- 解析:npm通过package.json的"scripts"字段定义,使用Shell执行。自定义脚本如
"build": "webpack --mode production"
,通过npm run build
运行。
- 解析:npm通过package.json的"scripts"字段定义,使用Shell执行。自定义脚本如
-
npm link的作用是什么?使用场景?
- 解析:将本地包链接到全局,再链接到其他项目进行测试。常用于开发调试本地未发布的npm包。
-
如何解决npm安装慢的问题?
- 解析:1) 使用国内镜像(如淘宝镜像) 2) 使用yarn或pnpm 3) 使用
--registry
参数 4) 使用nrm管理registry。
- 解析:1) 使用国内镜像(如淘宝镜像) 2) 使用yarn或pnpm 3) 使用
-
peerDependencies的作用是什么?
- 解析:声明宿主环境必须提供的依赖(如插件需要宿主框架),避免重复安装和版本冲突。npm7+会自动安装peer依赖。
-
如何安全地删除node_modules?为什么直接删除可能有问题?
- 解析:使用
rimraf
工具(跨平台支持)。直接删除可能因路径过长(Windows)或文件权限问题失败。
- 解析:使用
工程化篇
-
monorepo是什么?npm如何支持monorepo?
- 解析:多包单仓库管理模式。npm7+通过workspaces支持,在根package.json中配置
"workspaces": ["packages/*"]
。
- 解析:多包单仓库管理模式。npm7+通过workspaces支持,在根package.json中配置
-
如何为npm包编写TypeScript类型声明?
- 解析:1) 在包内编写.d.ts文件 2) 通过package.json的"types"字段指定 3) 或发布到@types/空间。
-
npm shrinkwrap和package-lock.json有什么区别?
- 解析:功能类似,shrinkwrap是手动生成的(可发布),lock是自动生成的(不应发布)。npm5+推荐使用lock文件。
-
如何实现npm包的按需加载?
- 解析:1) 分包设计 2) 使用ES模块的tree shaking 3) 动态import() 4) 组件库提供单组件导入支持。
-
npm run的生命周期钩子有哪些?
- 解析:pre和post钩子,如
pretest
、test
、posttest
。执行npm run test
时会自动按顺序执行这三个脚本。
- 解析:pre和post钩子,如
安全与优化篇
-
npm audit的作用是什么?如何修复安全漏洞?
- 解析:检查依赖中的已知漏洞。修复方式:1)
npm audit fix
自动修复 2) 手动更新有漏洞的依赖版本。
- 解析:检查依赖中的已知漏洞。修复方式:1)
-
如何锁定依赖的安装版本?
- 解析:1) 使用精确版本(无^~前缀) 2) 提交package-lock.json 3) 使用
npm ci
安装 4) 考虑使用shrinkwrap。
- 解析:1) 使用精确版本(无^~前缀) 2) 提交package-lock.json 3) 使用
-
如何减小node_modules的体积?
- 解析:1) 使用
npm prune
清理无用包 2) 使用pnpm或yarn的优化策略 3) 按需引入依赖 4) 使用webpack等打包工具tree shaking。
- 解析:1) 使用
-
npm的缓存机制是怎样的?如何清理缓存?
- 解析:npm缓存下载的包以便复用。清理命令:
npm cache clean --force
。缓存位置可通过npm config get cache
查看。
- 解析:npm缓存下载的包以便复用。清理命令:
-
如何防止误提交敏感信息到npm包?
- 解析:1) 使用.npmignore或.gitignore 2) 避免在代码中硬编码敏感信息 3) 使用环境变量 4) 发布前检查包内容(npm pack测试)。
综合实战篇
-
如何为一个大型项目设计npm依赖架构?
- 解析:1) 分层管理(核心依赖、业务依赖、开发依赖) 2) 使用workspaces分模块 3) 统一版本管理 4) 制定依赖更新规范。
-
如何处理npm包之间的版本冲突?
- 解析:1) 使用
npm ls
分析依赖树 2) 升级或降级冲突包 3) 使用resolutions字段(yarn) 4) 考虑peerDependencies。
- 解析:1) 使用
-
如何实现私有npm仓库?有哪些方案?
- 解析:1) 使用Verdaccio搭建 2) 使用Nexus Repository 3) 付费服务如GitHub Packages 4) npm Enterprise。
-
npm7的workspaces和lerna有什么区别?
- 解析:npm workspaces是内置的monorepo支持,lerna是功能更全面的第三方工具。npm7+的workspaces可替代lerna基础功能。
-
如何设计一个高可用的npm发布流程?
- 解析:1) 自动化测试 2) 语义化版本控制 3) CI/CD集成 4) 灰度发布策略 5) 回滚机制 6) 变更日志生成。