Node Modules 依赖优化处理

开发Node.js项目时候,拷贝项目文件夹的时候发现竟然出现了Windows下文件名过长的问题。经过研究以后发现这个问题是项目目录当中的node_modules目录下组件间依赖关系导致的。

查看node_modules属性发现使用Yoeman创建的项目MyDemo初始就有大约80M,其中的依赖情况可以使用npm list查看

f:\MyDemo>npm list


情况大约是

MyDemo@0.0.0
├─┬ grunt@0.4.4
│ ├── async@0.1.22
│ ├── coffee-script@1.3.3
│ ├── colors@0.6.2
│ ├── dateformat@1.0.2-1.2.3
│ ├── eventemitter2@0.4.13
│ ├── exit@0.1.2
│ ├─┬ findup-sync@0.1.3
│ │ ├─┬ glob@3.2.9
│ │ │ └── inherits@2.0.1
│ │ └── lodash@2.4.1
....省略


结果就是依赖模块套依赖模块,有的模块依赖层次太深,因此项目目录出现文件名过长。

解决问题的思路参考[url=http://stackoverflow.com/questions/13318364/how-to-deploy-node-js-application-with-deep-node-modules-structure-on-windows?rq=1]这里[/url]

[list=1]
[*]使用npm 获取所有的依赖情况
[*]检查模块的重复情况,需要带上版本号
[*]使用npm install module@version --save-dev将重复的模块依赖更新到项目的package.json文件当中
[*]删除项目当中的node_modules文件夹(我的例子f:\MyDemo\node_modules)
[*]使用npm install重新安装node_modules目录
[/list]

按这个思路处理完毕以后原来80多M的node_modules减肥为40多M,拷贝项目文件可以支持更深一点的目录了。
注意:处理一遍以后重复依赖大大减少,使用npm list 可以看出依然还有重复依赖。

我npm list 出来的信息有700多,咱不能用眼睛看吧?因此就有了下面的这个工具类:

1.使用npm list > c:/node_depend.txt


import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
* find duplicate modules in node.js projects
*
* <pre>
* 1. npm ls to get a list of all installed modules.
* 2.look through those modules and identify duplicate modules (version is important)
* 3.npm install module@version --save-dev to install those modules in the root node_modules
* directory and update package.json.
* 4.rmdir node_modules to delete the node_modules directory.
* 5.npm install to pull down a fresh copy of your dependencies.
* </pre>
*
* RefURL:http://stackoverflow.com/questions/13318364/how-to-deploy-node-js-
* application-with-deep-node-modules-structure-on-windows?rq=1
*
* @author tobato@msn.com
*
*/
public class FindDupeModue {

public static void main(String[] args) {
String fileName = "c:/node_depend.txt";
List<String> moduleList = getModules(fileName);
List<String> dupeModue = checkDupeModue(moduleList);
printResult(dupeModue);
}

/**
* read modules from file
*
* @param fileName
* @return
*/
private static List<String> getModules(String fileName) {
List<String> list = new CopyOnWriteArrayList<String>();
BufferedReader br = null;
String s = null;
try {
br = new BufferedReader(new FileReader(new File(fileName)));
while ((s = br.readLine()) != null) {
list.add(format(s));
}
br.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
return list;
}

/**
* format nodeName
*
* @param modulName
* @return
*/
private static String format(String modulName) {
String patternString = "[^A-Z|^a-z|^0-9|^.|^@|^-]";
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(modulName);
return matcher.replaceAll("");
}

/**
* check out the DupeModue
*
* @param moduleList
* @return
*/
private static List<String> checkDupeModue(List<String> moduleList) {
System.out
.println("==========Begin Find DupeModule===================");
List<String> list = new ArrayList<String>();
for (String item : moduleList) {
// check in moduleList
List<String> allDupeList = getAllDupeModue(moduleList, item);
if (allDupeList.size() > 1) {
System.out.println(item + "=" + allDupeList.size());
list.add(item);
moduleList.removeAll(allDupeList);
} else {
moduleList.remove(item);
}
}
System.out.println("==========End Find DupeModule===================");
return list;
}

/**
* loop in moduleList
*
* @param moduleList
* @param item
* @return
*/
private static List<String> getAllDupeModue(List<String> moduleList,
String moduleName) {
List<String> tmpList = new ArrayList<String>();
for (String item : moduleList) {
if (moduleName.equals(item)) {
tmpList.add(item);
}
}
return tmpList;
}

/**
* printResult
* npm install module@version --save-dev
*
* @param moduleList
*/
private static void printResult(List<String> moduleList) {
System.out.println("=============Result===================");
for (String item : moduleList) {
System.out.println("npm install " + item + " --save-dev");
}
}
}


2.运行工具类看重复情况


==========Begin Find DupeModule===================
underscore@1.4.4=2
inherits@2.0.1=6
chalk@0.4.0=5
ansi-styles@1.0.0=5
....(省略)
=============Result===================
npm install underscore@1.4.4 --save-dev
npm install inherits@2.0.1 --save-dev
npm install chalk@0.4.0 --save-dev
npm install ansi-styles@1.0.0 --save-dev
npm install delayed-stream@0.0.5 --save-dev
...(省略)

Enjoy it!
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值