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

时间:2015-04-22 02:53:46

标签: 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

6 个答案:

答案 0 :(得分:59)

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

来自 node's documentation

  

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

     

如果在那里找不到它,那么它会移动到父目录,然后   等等,直到达到文件系统的根目录。

     

例如,如果文件位于' /home/ry/projects/foo.js'叫   要求(' 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,这很方便。

答案 1 :(得分:10)

我找到了一个技巧,只需看看Symbolic Links (symlinks) on Windows or Linux,它就像快捷方式一样工作但功能更强大。

您只需在任意位置为node_modules文件夹制作Junction即可。该结点只是原始node_modules文件夹的快捷方式。在项目文件夹中创建它,如果使用了npm install,将创建实际的node_modules。

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

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

答案 2 :(得分:8)

尝试pnpm而不是npm。

  

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

安装时:

npm install -g pnpm

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

pnpm recursive install

答案 3 :(得分:1)

主目录应如下所示

node_modules
Project 1
Project 2
Project 3
Project 4

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

即可

更改架构

"$schema": "./node_modules/@angular/cli/lib/config/schema.json",

"$schema": "./../node_modules/@angular/cli/lib/config/schema.json"

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

答案 4 :(得分:1)

答案 5 :(得分:0)

假设有一个node_modules,它应该包含所有应用程序的所有包。因此,您的应用程序也将共享大多数唯一的package.json条目(只是名称应该更改)

我的想法是拥有一个根和多个src级别,如下所示

root\package.json
root\node_modules
root\\..
root\app1\src\\..
root\app2\src\\..

您可能面临的唯一问题是为任何应用程序备份json(或tsconfig),并在您处理它或设置启动脚本以提供任何应用程序时还原它们