npm node_modules 复用问题

2017-08-20 23:03:11

babelwebpack 已经成为必装 npm 包的今天,代码还没开始写就已经装了 200MB 的依赖,我真的感觉我电脑硬盘要 gg。所以很早就开始研究 npm 的共享问题。

默认安装方式

├── Sites
│   ├── PROJECT_A
│       └── node_modules
│   ├── PROJECT_B
│       └── node_modules
│   └── PROJECT_C
│       └── node_modules
│   └── PROJECT_D
│       └── node_modules
└── Other

看着那海量且重复的 node_modules,真没什么好多说的。这当然是最稳妥的方案。不过我必须要做些优化。

共享方式 1

之前我开发项目,喜欢把 node_modules 安装在 ~/Sites (下文称 ROOT_DIR) 下:

├── Sites
│   ├── node_modules
│   ├── PROJECT_A
│   ├── PROJECT_B
│   └── PROJECT_C
│       └── node_modules
│   └── PROJECT_D
└── Other

如果项目需要安装 npm 包,比如 eslint,我会 cd 到 ROOT_DIR,然后 npm i -S eslint,这样可以最大程度的实现 npm 包多项目共享。 新建项目时(下文称 PROJECT_DIR),不再需要安装诸如 node-sass,webpack,eslint 之类的常用库了。如果PROJECT_DIR 真有需要调用特定的 npm 包,那就进入 PROJECT_DIRnpm i 即可。

一切看起来很完美,既有全局共享,又能局部调用,可是 PROJECT_DIR 的 package.json 里面记录的东西不全,多人开发的时候时常会搞得对方 clone 代码后,npm i 漏装某些库搞得项目 build 失败。

共享方式 2 (新方法,待尝试)

然后今天在 Häagen-Dazs 聊天的时候,我提到这个问题,L 说可以用 ln -s 软链的方式把 PROJECT_DIR/node_module 软连接到 ROOT_DIR/node_module 下。

这样在 PROJECT_DIRnpm i 的时候,即更新了 PROJECT_DIR/package.json,又更新了全局共享的 ROOT_DIR/node_module,可谓真的两全其美。

不过我还没有实践,但已有担心的问题。假如 PROJECT_A 依赖了 jQuery1.x,PROJECT_B 依赖 jQuery3.x,然后 PROJECT 下已经有一个 ln -s 的 node_modules,不可能再建一个,这样的问题怎么解?

嗯,回头实践一下这个方法,再更新文章。

最后更新:2017-08-20 :->

- EOF -