网站首页 > 教程文章 正文
1. 关于项目隔离性
- node_modules 目录的作用: node_modules 目录确实提供了项目级别的依赖隔离。当使用 pnpm install(或 npm install/yarn install)时,项目 package.json 文件中声明的依赖库会被下载并存放在该项目的 node_modules 文件夹中。这是 Node.js 包管理器的核心功能之一。
- NVM 的作用: NVM (Node Version Manager) 提供的是 Node.js 运行时环境的版本隔离。它允许你在同一台机器上安装多个不同版本的 Node.js,并能在不同的项目或终端会话中轻松切换使用哪个版本的 Node.js(以及该版本 Node.js 附带的 npm/pnpm)。
2. 关于操作顺序 (Was the order of operations correct?)
- 推荐顺序: 更规范、更安全的做法是先确定并切换到项目所需的 Node.js 版本,然后再安装依赖。进入项目目录。使用 nvm use <version> (或者,如果配置了 .nvmrc 文件,可以直接用 nvm use) 来切换到指定的 Node.js 版本。运行 pnpm install (或其他包管理器安装命令) 来安装依赖。
原因:
- 确保兼容性, 保证了安装依赖和后续运行项目代码使用的是同一个、也是项目期望的 Node.js 版本,避免了因 Node.js 版本不匹配可能引起的兼容性问题(特别是对于需要编译原生模块的依赖)。
- 环境一致性: 确保开发环境与项目要求一致,减少“在我机器上能跑”的问题。
3. NVM 管理 Node 开发环境的最佳工程实践 (NVM Best Practices)
最佳实践的核心思想是:让项目明确指定它应该使用的 Node.js 版本,并让 nvm 帮助你轻松地切换到这个版本。最佳实践的目标旨在确保一致性、可复现性和易用性:
使用 .nvmrc 文件:
- 在你的项目根目录下创建一个名为 .nvmrc 的文件。在该文件中只写入项目所需的 Node.js 版本号 (例如 18.17.0, lts/hydrogen, 或者只写主版本号如 18)。将 .nvmrc 文件添加到你的版本控制系统 (如 Git) 中。
好处:
- 明确版本: 清晰地记录了项目使用的 Node 版本。
- 团队协作: 团队所有成员都能知道并使用统一的 Node 版本。
- 自动化: 当你进入项目目录后,可以直接运行 nvm use (不带版本号),NVM 会自动读取 .nvmrc 文件并切换到指定的版本。同样,运行 nvm install (不带版本号) 也会读取 .nvmrc 并安装该版本(如果尚未安装)。
- CI/CD 集成: 在持续集成/持续部署 (CI/CD) 流程中,可以读取 .nvmrc 来设置正确的 Node 版本。
进入项目后立即切换版本:
- 养成习惯,每次开始处理一个项目时,进入项目目录后,首先运行 nvm use。
- 有些开发者会配置 shell (如 zsh, bash) 插件或脚本,使得 cd 进入带有 .nvmrc 文件的目录时自动执行 nvm use,进一步提升效率。
设置默认版本 (可选但推荐):
- 使用 nvm alias default <version> (例如 nvm alias default lts/*) 来设置一个默认的 Node.js 版本。当你打开一个新的终端会话,且没有进入特定项目目录执行 nvm use 时,这个默认版本会被激活。推荐使用最新的 LTS (长期支持) 版本作为默认。
保持 NVM 更新:
- 偶尔运行 NVM 的更新命令(通常可以在 NVM 的 GitHub 仓库找到更新说明),以获取最新的功能和 Node 版本列表。
理解全局包:
- 用 npm install -g <package> 或 pnpm add -g <package> 安装的全局包是与特定的 Node.js 版本关联的。如果你切换了 Node.js 版本,之前版本下安装的全局包在新版本下是不可用的,需要重新安装。
- 因此,尽量将项目运行所必需的工具(如 typescript, nodemon, eslint 等)作为项目的开发依赖 (devDependencies) 安装,而不是依赖全局安装。
总结:
你看到的 node_modules 提供了依赖隔离,但 NVM 提供的 Node.js 版本隔离需要你主动使用 nvm use 命令来激活。最佳实践是使用 .nvmrc 文件来声明项目所需的 Node 版本,并在开始工作(特别是安装依赖)前,通过 nvm use 切换到该版本,以确保开发环境的一致性和项目的稳定性。你的操作顺序虽然能生成 node_modules,但不是最理想的,建议今后先切换 Node 版本再安装依赖。
转发请注明出处
猜你喜欢
- 2025-05-09 esbuild:一款快 10-100 倍的 JS 打包 / 压缩工具
- 2025-05-09 ESM 内功心法:化解 require 中的夺命一击!
- 2025-05-09 webpack中exportsFields和mainFields的用法
- 2025-05-09 Rust cargo 命令行工具使用教程(rust指令怎么用)
- 2025-05-09 Axios CORS 问题处理(axios设置cors)
- 2025-05-09 Nodejs 第七十四章(微服务)(nodejs微服务是什么)
- 2025-05-09 11个web前端开发人员必备的在线工具,功能强大,值得收藏
- 2025-05-09 新一代Python包管理工具来了(python community包)
- 2025-05-09 开发者提示工程实用指南(工程师开发使用中)
- 2025-05-09 软件构建工具汇总与选择指南(软件构造工具)
- 最近发表
-
- 一课译词:一刀两断(一刀两断成语解释)
- 核心短语break up用法解析(breakd短语)
- HTML+CSS 实现商品图片列表放大视觉效果 复制完整代码即可马上调用
- 前端实现右键自定义菜单(前端实现右键自定义菜单怎么设置)
- Python中docx与docxcompose批量合并多个Word文档并添加分页符
- Java 将Excel转为XML(java将xls转换成xlsx)
- jq+ajax+bootstrap改了一个动态分页的表格
- css兼容性问题及一些常见问题汇总大全,赶快收藏!
- Java 的业务逻辑验证框架 之-fluent-validator
- 小程序cover-view踩坑系列2(微信小程序overflow)
- 标签列表
-
- location.href (44)
- document.ready (36)
- git checkout -b (34)
- 跃点数 (35)
- 阿里云镜像地址 (33)
- qt qmessagebox (36)
- mybatis plus page (35)
- vue @scroll (38)
- 堆栈区别 (33)
- 什么是容器 (33)
- sha1 md5 (33)
- navicat导出数据 (34)
- 阿里云acp考试 (33)
- 阿里云 nacos (34)
- redhat官网下载镜像 (36)
- srs服务器 (33)
- pico开发者 (33)
- https的端口号 (34)
- vscode更改主题 (35)
- 阿里云资源池 (34)
- os.path.join (33)
- redis aof rdb 区别 (33)
- 302跳转 (33)
- http method (35)
- js array splice (33)