VM 开发将会继续进行!您可以将 node_modules 移动到任何您喜欢的位置并使用它!

目录
大家好,
我是Mandai,Wild团队负责开发工作的成员。
即使你不使用 Node.js 开发系统,也经常会用它来减轻工作负担。
例如,你可以使用 webpack 预编译 CSS 或转译 JS 文件,或者使用 gulp 创建用于执行例行任务的脚本并定期运行。Node.js 的应用场景非常广泛,我觉得它正在逐渐成为我们生活的一部分。
Node.js 有一个名为 npm 的包管理工具,这次我们总结了当由于某种原因需要将 node_modules 目录移动到项目目录之外时应该怎么做。
那究竟是什么确凿的理由?!
原因在于开发环境。
虚拟机通常用作开发环境,本例中的设置也很典型:主机操作系统为 Windows 10,在 VirtualBox 中运行 CentOS 7(由 Vagrant 管理)。
然而,这种常见的开发环境却存在一个意想不到的缺陷。
这或许有些突然,但我今年的个人偏好之一就是开发时始终使用 Visual Studio Code (VS Code),现在已经是八月了,我对它已经相当熟悉了。VS
Code 使用 Node.js (TypeScript) 开发,是一款基于 Electron 的跨平台编辑器。
已经变成这样了!
Linux 版 VSCode 的快捷键很难使用,因此在虚拟机上安装 VSCode 并进行开发是不可行的,这令人沮丧(Windows 版 VSCode 的易用性很可能是因为它是微软开发的)。
因此,还需要以 VSCode 为核心,对开发环境的配置进行调整。
简而言之,我只是利用 VirtualBox 的共享文件夹功能共享了整个项目目录,这样我就可以将 Windows 系统上在 VS Code 中编辑的内容共享到虚拟机中。
如果以无头模式启动虚拟机,负载会出奇地低,因此最多可以运行三个虚拟机。
陷阱一:node_modules 目录无法共享
假设您了解了情况,但仍然存在一个主要问题:
node_modules 目录无法共享。
虽然可以共享文件,但仔细想想,node_modules 是在 npm install 时为平台创建的,这可能会导致包含平台依赖二进制文件的模块出现问题。
如果能把 node_modules 放在项目目录之外,这个问题应该就能解决。
不过,这样就需要在每个开发平台上运行 `npm install`,但我并不太担心,因为 `npm install` 本来就是这样工作的。
陷阱二:“超出最大调用堆栈大小”
在共享文件夹中运行 `npm install` 时,我经常遇到“超出最大调用堆栈大小”的错误。
起初我不太明白,但似乎这个错误的原因与共享文件夹有关。参考: npm ERR! code ETXTBSY · Issue #9979 · npm/npm · GitHub
因此,可以通过将 node_modules 放在项目目录之外来解决此问题。
您可以随意安装 node_modules。
实际上,您可以使用 npm config 命令更改 node_modules 的位置。
您可以使用以下命令进行更改:
npm config set prefix "/home/vagrant"
现在 npm 识别的 node_modules 目录是“/home/vagrant/node_modules”。
然而,这只会让 npm 将 node_modules 的位置识别为“/home/vagrant/node_modules”,所以即使你在这种情况下运行 npm install,node_modules 仍然会和 package.json 处于同一目录。这很烦人……
因此,您需要在安装命令中指定前缀,并使用以下命令进行安装。
npm install --prefix "/home/vagrant"
这样做可能会导致错误。
例如这样的错误。
npm WARN saveError ENOENT: 没有该文件或目录,打开 '/home/vagrant/package.json' 时出错
我已经有了 package.json 文件
,但事实证明,你需要一个位于 --prefix 指定的目录中的 package.json 文件!
纸质文件难以管理,所以我们将使用符号链接。
cd /home/vagrant ln -s /home/vagrant/src/package.json ln -s /home/vagrant/src/package-lock.json # 某个时间
这假设 package-lock.json 文件存在,但首次安装时,该文件实际上位于“/home/vagrant”目录下,因此安装完成后,您需要执行一个奇怪的操作,将其复制到您的工作目录。
这也是 VS Code 的问题,无法避免。
然后只需运行带有前缀的 npm install 命令即可继续安装。
顺便提一下,我之前觉得 `npm install` 命令运行速度慢得惊人,但当我在共享文件夹之外运行它时,却瞬间就完成了。
共享文件夹虽然方便,但速度确实很慢,不是吗?
有时候去任何地方都是不合适的。
尽管官方声称可以安装在任何位置,但实际上并非如此。
以下内容描述了将 node_modules 安装在特定目录下,然后运行任务运行器 gulp 时会发生什么情况。
gulp sass [06:46:05] 在 ~/src 中未找到本地 gulp [06:46:05] 请尝试运行:npm install gulp
我确定全局和本地都安装了 gulp,所以我觉得问题出在 node_modules 目录和 package.json 文件不在同一个层级。
快速搜索了一下谷歌也没找到答案,于是我查看了 gulp 的源代码,大致弄明白了。→ gulp-cli/index.js at master · gulpjs/gulp-cli · GitHub
cfgLoadOrder 数组中只有“home”和“cwd”这两个字符串,所以看起来你应该直接把 node_modules 放在你的主目录下。
这就是为什么我粘贴的示例中命令前缀是你的主目录的原因。
如果在用户主目录下创建 node_modules 文件夹,即使 node_modules 不在通常的位置,也可以成功运行 gulp 任务。
我感觉编写配置文件会给我更大的自由度,但我不确定,所以有时间我会研究一下。
概括
我写这篇文章的时候经常跑题,文章也变得很杂乱,所以我在这里做个总结。
- 在某些情况下,npm install 的安装目录无法在虚拟机的共享文件夹中共享。
- 如果您使用的模块需要平台相关的二进制文件,则该模块将无法正常工作。
- 由于共享文件夹的特性,即使是 npm install 也无法在共享文件夹上执行。
- 如果主机和虚拟机都是基于 *nix 系统的,也许可以?
- 可以使用 npm install 命令选项“--prefix”更改 node_modules 的创建位置。
- 使用“--prefix”指定的目录必须已经包含 package.json(符号链接也可以)。
- 有时,例如使用 gulp 时,node_modules 的位置无法自由确定。
- Node.js 很有用
我认为直接放在我的用户目录下可能是最好的选择。
我每个项目都使用不同的虚拟机,即使我可以用配置文件来管理,但仅仅为了自己创建一个 .gitignore 文件感觉不太合适。
我很高兴 node_modules 目录与工作目录是分开的。
就这样。
0
