2017-05-26 88 views
0

我注意到運行find node_modules -path '*/lodash' 很多軟件包都包含lodash,並且通過查看package.json它甚至是完全相同的版本。因爲lodash很重(4.5MB),如果它們都共享完全相同的內存分配(通過使用符號鏈接),我應該能夠將node_modules文件夾的大小減少至少20MB,只能通過將lodash模塊鏈接在一起。通過軟鏈接減小node_modules文件夾的大小

一個好的腳本應該能夠找到更多的包而不是簡單的lodash,並且可能會節省更多的空間。

有誰知道能夠做到這一點的腳本/模塊? 或者我應該自己實現它?

+0

什麼版本的NPM您使用的是?運行'npm -v'。如果您使用的版本低於NPM 3,則應該升級 - 在該版本中進行了大量的軟件包重複數據刪除。 –

+0

我使用npm 4.2.0和節點7.9.0 –

+0

啊,好的。規則一件事,至少:)你試過運行'npm dedupe'嗎? –

回答

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])) 
0

當然,你沒有檢查他們是否有相同的版本,對不對? 在每個npm包中,package.json文件中都有特定的版本或'*'。 我沒有檢查,但我確定這是由npm妥善處理。

只需quick google result - 這可能會幫助您確定。

+0

是的,我檢查過,是完全相同的版本(其中7箇中的5個是版本「4.17.4」)。我檢查它們是否是符號鏈接,因爲我認爲npm應該處理的第一件事 –

+0

這很奇怪,他們不應該這樣做,假設需要工作... – Lazyexpert

+0

我嘗試了符號鏈接,並且在node_modules文件夾,可以工作,如果有多個回購可用 –