1、包管理器
-
npm:
-
历史:从早期版本到 npm v5 的演进,引入 package-lock.json 等特性。
-
关键特性:本地安装、依赖树展平、缓存机制。
-
-
Yarn:
-
历史:由 Facebook 等开发,解决 npm 早期版本的效率问题。
-
与 npm 区别:确定性安装、更好的网络性能、扁平依赖结构。
-
-
其他管理器:如 pnpm,强调磁盘空间优化。
2、安装机制
-
npm 安装:
-
配置文件:.npmrc 的优先级(项目>用户>全局>默认)。
-
package-lock.json:确保一致性,缓存版本和下载链接。
-
依赖解析:递归构建依赖树,展平处理重复依赖。
-
缓存机制:从 npm v5 开始,缓存目录如 /Users/cehou/.npm/_cacache,提升重复安装速度。
-
-
Yarn 安装:
-
五步过程:检查、解析包、获取包、链接包、构建包。
-
yarn.lock:确保确定性安装,锁定依赖版本。
-
扁平依赖结构:减少冗余,优化磁盘使用。
3、依赖管理
-
依赖类型:
-
dependencies:生产环境依赖。
-
devDependencies:开发环境依赖,如构建工具。
-
peerDependencies:指定对等依赖,避免重复安装。
-
optionalDependencies:可选依赖,安装失败不中断。
-
bundledDependencies:打包时包含的依赖。
-
-
版本控制和 SemVer:
-
语义化版本:主版本.次版本.补丁版本,遵循重大变更规则。
-
工具如 Create React App 强制版本检查,确保兼容性。
-
-
处理版本冲突:
- npm 通过展平依赖树解决,Yarn 优先使用最高兼容版本。
4、锁文件
-
用途:确保跨机器一致安装,解决 npm 早期版本的不确定性。
-
package-lock.json vs yarn.lock:前者锁定所有依赖版本,后者更灵活。
-
最佳实践:应用提交到仓库,库需谨慎以避免重复依赖。
5、私有注册表和企业解决方案
-
好处:提升下载速度、安全发布私有模块、质量控制。
-
工具:Nexus、Verdaccio、cnpm,支持代理和分组仓库。
-
配置:通过 npm config set 切换注册表,项目级 .npmrc 优先。
5、CI/CD 集成
-
npm ci vs npm install:前者专为 CI,依赖 package-lock.json,速度更快。
-
优化:上传 package-lock.json 缓存,减少网络请求。
-
实践:缓存 node_modules 目录,提升 CI 效率。
6、安全
-
依赖漏洞:使用 npm audit 检查,修复安全问题。
-
最佳实践:定期更新依赖,监控漏洞数据库。
7、发布包
-
过程:使用 npm publish,设置作用域(如 @organization)。
-
最佳实践:版本控制、文档完善、测试发布。
8、单体仓库
-
定义:单一仓库管理多个包,适合大型项目。
-
工具:Lerna、Yarn workspaces,支持依赖共享。
-
挑战:构建复杂性、依赖管理难度。
9、高级主题
-
定制:修改 .npmrc 或 yarnrc 配置。
-
脚本:package.json 中的 scripts 自动化任务。
-
性能优化:树摇(tree shaking)、减少冗余依赖。
面试题目的设计
基于上述知识图谱,设计20个问题,涵盖基础到高级,评估候选人对包管理的理解:
-
npm install和npm ci区别?使用场景? -
package-lock.json用途?应用 vs 库的提交策略? -
npm 依赖解析和展平过程?
-
package.json依赖类型及使用场景? -
Yarn 和 npm 的安装理念差异?
-
私有 npm 注册表的好处?
-
确定性安装的概念及 Yarn 实现?
-
缓存在包管理中的作用?
-
处理依赖版本冲突的方法?
-
团队依赖管理的最佳实践?
-
Yarn vs npm 的优势和场景选择?
-
npm 缓存工作原理?
-
peerDependencies的作用? -
发布包到 npm 的过程?
-
处理依赖安全漏洞?
-
单体仓库的定义和优劣?
-
SemVer 的解释和应用?
-
优化大型项目依赖安装?
-
常见包管理问题及排查?
-
package.json脚本的作用?
总结与建议
通过学习上述知识图谱和准备面试问题,您可以系统掌握前端包管理的核心技能。建议结合实践,如在项目中使用 npm/Yarn、配置 CI/CD、发布私有包,强化实际应用能力。