1. 依赖声明与解析
- 开发者在 package.json 文件的 dependencies 与 devDependencies 字段中声明项目所需的包及其版本范围
- npm 读取 package.json 后,根据语义化版本(semver)规则解析每个依赖应安装的具体版本
- 递归解析传递依赖(依赖的依赖),构建完整的依赖树
2. 本地安装机制
- npm 默认将依赖安装到项目根目录下的 node_modules 文件夹中,而非系统全局目录
- 采用扁平化(hoisted)目录结构:尽可能将依赖提升到 node_modules 顶层,减少嵌套层级
- 当不同包依赖同一包的不兼容版本时,npm 会在对应包的目录下创建嵌套 node_modules 以隔离版本冲突
3. 版本范围与锁定
- package.json 中使用 ^(兼容版本)与 ~(补丁版本)等范围符号表达版本兼容性
- package-lock.json 文件记录依赖树中每个包的确切版本、下载地址与完整性校验值
- 通过锁定文件确保不同开发者、不同时间安装得到的依赖树完全一致