通过软链接减小node_modules文件夹的大小

时间:2017-05-26 10:33:17

标签: node.js npm

我注意到正在运行find node_modules -path '*/lodash' 很多软件包都包含lodash,通过查看package.json它甚至是完全相同的版本。

因为lodash很重(4.5MB),如果它们共享完全相同的内存分配(通过使用符号链接),我应该能够将node_modules文件夹的大小减少至少20MB ,只需将lodash模块链接在一起。

一个好的脚本应该能够找到更多的包而不仅仅是lodash,并且可能会节省更多的空间。

有没有人知道能够做到这一点的脚本/模块? 或者我应该自己实施?

2 个答案:

答案 0 :(得分:0)

肯定你没有检查它们是否有相同的版本,对吧? 在每个npm包中,在package.json文件中有特定版本或'*'。 我没有检查,但我确定它被npm正确地处理了。

只需quick google result - 这可能有助于您确定。

答案 1 :(得分:0)

我使用这个自定义脚本解决了它:

import json
from itertools import groupby
from pprint import pprint
import os
import subprocess

allPackages = subprocess.check_output("find node_modules/ -name 'package.json'", shell=True).splitlines()

# Collect all modules
allModules = {}
for filePath in allPackages:
    with open(filePath.strip()) as data_file:
        data = json.load(data_file)
        packageKey = data['name'] + data['version']
        if packageKey not in allModules:
            allModules[packageKey] = list()
        allModules[packageKey].append(os.path.dirname(filePath))

# Remove not duplicated ones
for packageKey, paths in allModules.items():
    if (len(paths) > 1):
        original = allModules[packageKey].pop()
        for module in allModules[packageKey]:
            originalRelativeToModule = os.path.relpath(original,os.path.dirname(module))
            print('delete folder ', module, 'and symlink to ', originalRelativeToModule)
            print(subprocess.check_call(["rm","-rf",module]))
            print(subprocess.check_call(["ln","-s",originalRelativeToModule,module]))