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

大家好,
我是开发团队野生队的成员 Mandai。

即使你不使用 Node.js 开发系统,我认为用它来减轻工作量也很常见。
例如,你可以使用 webpack 预编译 CSS 和转译 JS 文件,或者使用 gulp 创建用于执行日常任务的脚本并定期运行。它的应用场景非常广泛,我感觉它正逐渐成为我生活的一部分。

Node.js 有一个名为 npm 的包管理工具,这次我们总结了当由于某种原因需要将 node_modules 目录移动到项目目录之外时应该怎么做。

 

那究竟是什么确凿的理由?!

原因在于开发环境。

我认为虚拟机通常被用作开发环境,但在这个案例中,宿主机操作系统是 Windows 10,而 CentOS 7 运行在 Virtualbox 上(并使用 Vagrant 进行管理),这是一种常见的基于虚拟机的开发环境配置。
然而,这种常见的开发环境却存在一个意想不到的陷阱。

这或许有点突然,但我今年的首要任务之一就是在开发过程中始终使用 Visual Studio Code(以下简称 VSCode)。现在已经是八月了,我对它已经相当熟悉了。VSCode
使用 Node.js(TypeScript)开发,是一款基于 Electron 的跨平台编辑器。

已经变成这样了!

Linux 版 VSCode 的快捷键很难使用,因此在虚拟机上安装 VSCode 并进行开发是不可行的,这令人沮丧(Windows 版 VSCode 的易用性很可能是因为它是微软开发的)。

因此,还需要以 VSCode 为核心,对开发环境的配置进行调整。

总之,通过使用 VirtualBox 的共享文件夹功能共享整个项目目录,您可以将 Windows 系统上 VSCode 中编辑的内容共享到虚拟机。就是这样。
如果您以无头模式启动虚拟机,负载会显著降低,因此您最多可以运行大约三个虚拟机。

 

陷阱一: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 文件!但实际上有!
然后我想:“package.json 文件必须位于 --prefix 指定的目录中!”

纸质文件难以管理,所以我们将使用符号链接。

cd /home/vagrant ln -s /home/vagrant/src/package.json ln -s /home/vagrant/src/package-lock.json # 某个时间

 

如果 package-lock.json 文件存在则没问题,但如果是首次安装,该文件会位于“/home/vagrant”目录下,因此安装完成后,您需要执行一些操作,例如将其复制到工作目录。
这也是 VSCode 的缘故,无法避免。

然后只需运行带有前缀的 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 直接移动到 home 目录下应该没问题。
这就是为什么示例中的命令前缀是 home 目录的原因。

如果在用户主目录下创建 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
加载中...
0票,平均分:0.00/10
40,406
X Facebook Hatena书签 口袋

这篇文章的作者

关于作者

万代洋一

我的主要工作是开发社交游戏的Web API,但我也很荣幸能够从事其他各种工作,包括市场营销。
我在Beyond中的肖像权采用CC0协议。