如何让多个项目共享node_modules目录?

ver*_*joe 72 node.js npm

每当我创建项目时,我都必须下载节点模块的所有依赖项.在不复制node_modules的情况下,无论如何都要共享多个项目中的中心node_modules?

像下面这样,我每次都要运行很多命令..

npm install gulp-usemin                                                                        
npm install gulp-wrap
npm install gulp-connect
npm install gulp-watch
npm install gulp-minify-css
npm install gulp-uglify
npm install gulp-concat
npm install gulp-less
npm install gulp-rename
npm install gulp-minify-html
Run Code Online (Sandbox Code Playgroud)

tpi*_*pie 71

您绝对可以在项目中共享node_modules目录.

节点的文档:

如果传递给require()的模块标识符不是本机模块,并且不以'/','../'或'./'开头,则节点从当前模块的父目录开始,并添加/ node_modules,并尝试从该位置加载模块.

如果在那里找不到它,那么它将移动到父目录,依此类推,直到到达文件系统的根目录.

例如,如果'/home/ry/projects/foo.js'中的文件名为require('bar.js'),那么节点将按以下顺序查找以下位置:

/home/ry/projects/node_modules/bar.js /home/ry/node_modules/bar.js /home/node_modules/bar.js /node_modules/bar.js

因此,只需将一个node_modules文件夹放在项目目录中,然后放入所需的任何模块.只需要他们像平常一样.当节点在项目文件夹中找不到node_modules目录时,它将自动检查父文件夹.所以让你的目录结构如下:

-myProjects --node_modules --myproject1 ---sub-project --myproject2

因此,即使您的子项目的依赖项也可以在您的主node_modules存储库上绘制.

这样做的一个缺点是你必须手动构建你的package.json文件(除非有人知道用grunt或其他东西自动化它的方法).当您安装软件包并将--save arg添加到npm install命令时,它会自动将其附加到依赖项部分或package.json,这很方便.

  • 我不知道如何共享node_modules可以处理不同的软件包版本,node_modules中的软件包没有版本化,不像c:\ users(Windows)中的npm-cache,是否有人遇到过这种情况? (3认同)
  • 为什么不接受此作为答案操作?@tpie的另一个问题是,是否应该像您建议的那样构建一个项目,如何构建package.json以从父模块存储库安装。 (2认同)

Eym*_*kum 14

我找到了一个技巧,只需看看Windows或Linux上符号链接(符号链接),它就像快捷方式一样工作但功能更强大.

您只需要在任何地方Junction为您的node_modules文件夹创建一个.该结点只是原始node_modules文件夹的快捷方式.在项目文件夹中创建它,如果使用的话,将创建实际的node_modules npm install.

要实现这一点,您需要至少一个node_modules真实文件夹,然后在其他项目中与其建立连接.

在Windows上,您可以使用命令提示符,也可以使用应用程序.使用命令提示符可以提供更多控制,使用应用程序更容易我建议使用Link Shell扩展.

  • 我 cd 到目标目录,运行以下命令:`mklink /d node_modules (source dir)\node_modules`。 (3认同)
  • 但是当我运行 `npm install <new-package>` 时,所有不在当前项目的 package.json 中的包都会被删除。 (2认同)

小智 11

主目录应该是这样的

node_modules
Project 1
Project 2
Project 3
Project 4
Run Code Online (Sandbox Code Playgroud)

只需打开文件 Project 1/.angular-cli.json

更改架构

"$schema": "./node_modules/@angular/cli/lib/config/schema.json",
Run Code Online (Sandbox Code Playgroud)

"$schema": "./../node_modules/@angular/cli/lib/config/schema.json"
Run Code Online (Sandbox Code Playgroud)

并且不要忘记node_modules在项目目录中创建空文件夹


Ben*_*son 9

尝试使用pnpm而不是npm.

pnpm使用硬链接和符号链接在磁盘上只保存一次模块版本.

安装时间:

npm install -g pnpm
Run Code Online (Sandbox Code Playgroud)

要更新现有安装(和子目录),请使用:

pnpm recursive install
Run Code Online (Sandbox Code Playgroud)

  • 警告:pnpm 是出了名的不稳定。它不能可靠地完成像“自我更新”这样的基本事情,并且它会缠着你平均每周更新 3 次。截至 2021 年 8 月,它在 github 上有 500 多个未解决的问题。 (4认同)
  • pnmp 搞乱了我所有的项目。我必须删除它们并再次复制文件。它在 github 上有 850 个未解决的问题! (2认同)

Ale*_*sco 9

另请参阅 npm v7.0.0 对工作区的支持

RFC https://github.com/npm/rfcs/blob/latest/implemented/0026-workspaces.md

文档 https://docs.npmjs.com/cli/v7/using-npm/workspaces

  • 2021 年,看起来这是最好的出路。 (3认同)

Chr*_*ris 5

通过查看一些文章,Lerna似乎 是在单个目录中管理多个项目的好工具 ( monorepo)。它支持模块共享,无需复制每个文件夹中的整个包,并支持将它们安装在多个项目中的命令。

pnpm也是一个简单而高效的工具,它不会复制那些已经为其他项目安装的模块。