`
tobato
  • 浏览: 101820 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

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
....省略


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

解决问题的思路参考这里

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


按这个思路处理完毕以后原来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!
分享到:
评论

相关推荐

    Node.js-从nodemodules中删除不必要的文件

    标题 "Node.js-从nodemodules中删除不必要的文件" 提到的是在Node.js开发过程中优化`node_modules`目录的方法,这个目录包含了项目所依赖的所有模块。`node_modules`通常非常大,因为它包含了所有直接和间接依赖的...

    node_modules.rar

    6. **优化与体积控制**:由于 `node_modules` 可能包含大量文件,有时会影响项目的加载速度和体积。开发者可以通过使用 `npm ci` 替换 `npm install` 来加快安装速度,或者使用工具如 Webpack、Rollup 进行模块打包...

    补齐ionic项目下node_modules等文件

    在开发基于Ionic框架的移动应用时,`node_modules`目录是至关重要的,它包含了项目运行所需的依赖库。本文将深入探讨`node_modules`及其在 Ionic 项目中的作用,以及如何补充或恢复这些文件。 首先,`node_modules`...

    node_modules

    "node_modules"是Node.js项目中的一个特殊目录,它包含了项目所依赖的所有外部模块。在Node.js生态系统中,模块是代码的独立单元,允许开发者通过`require`函数来导入和使用他人的代码或者自己编写的代码。这个目录...

    node-sass 4.12、4.14.1、5 node-sass-loader node_modules 安装包

    要在项目中使用Node-Sass和Sass-Loader,首先需要在项目根目录下创建一个`node_modules`文件夹,如果没有的话。然后通过npm(Node.js包管理器)进行安装: ```bash npm install node-sass sass-loader --save-dev `...

    vue-elemnt-admin-master 带完整依赖node_modules

    3. `node_modules/` - 存储所有项目依赖的第三方库,由 `npm install` 安装得到。 4. `package.json` - 项目依赖和脚本的配置文件,用于 `npm` 命令。 5. `.gitignore` - 定义了哪些文件和目录 Git 不应跟踪。 6. `...

    node_modules.7z

    "node_modules"文件夹是Node.js项目中的一个关键组成部分,它包含了项目运行所需的全部外部依赖库。在这个场景中,我们讨论的是一个名为"node_modules.7z"的压缩文件,它是Vue项目的依赖库被压缩后的形式。 在Vue...

    node_modules.zip

    在React Native中,`node_modules` 文件夹是一个至关重要的组成部分,它包含了项目所依赖的所有npm(Node Package Manager)模块。这些模块提供了各种功能,如网络请求、UI组件、状态管理等,使得开发者能够构建功能...

    从URL而不是本地nodemodules导入模块

    在Node.js开发中,我们通常使用`require`或ES6的`import`语句从本地的`node_modules`目录加载依赖模块。然而,随着模块生态的发展和云原生技术的普及,从URL直接导入模块变得越来越常见。这种做法能够实现模块的远程...

    webpack框架node_modules.zip

    `node_modules` 文件夹在任何Node.js项目中都扮演着至关重要的角色,它包含了项目所依赖的所有外部模块。在`webpack`项目中,`node_modules`包含的是Webpack自身以及其依赖的各种插件和loader。 在深入理解Webpack...

    Node.js-ModClean2.0-删除nodemodules文件夹中不需要的文件和目录

    在 Node.js 开发过程中,`node_modules` 文件夹是存放所有依赖模块的地方,随着项目的推进,这个文件夹可能会变得非常大,其中包含了许多我们可能不再需要的文件和目录,这不仅占用硬盘空间,还可能影响项目加载速度...

    batarang with node_modules&browerify-epp

    【描述】"batarang 带node_modules&browerify-epp包"意味着用户可以立即使用完整的开发环境,无需手动安装`node_modules`中的依赖项或设置`browerify-epp`,这是一个JavaScript打包工具,专门用于处理浏览器端的模块...

    exb-1.8-node_modules-cache.zip

    "node_modules"目录是Node.js项目中存储所有第三方依赖的地方,而“cache”则意味着这些依赖已经被预先下载并存储,以便快速启动和运行项目。 在ArcGIS WebAppBuilder中,Node.js被用来管理Experience Builder的...

    gulp修改了的node_modules.zip

    `node_modules`目录是Node.js项目中存储所有依赖模块的地方,`Gulp`相关的插件通常也会被安装在这里。 `Gulp`的主要功能包括: 1. **任务管理**:开发者可以定义一系列的任务,比如编译Less/Sass到CSS,压缩...

    exb-1.4-node_modules-cache.zip

    在JavaScript开发中,`node_modules`是存储项目依赖的目录,它包含了项目运行所依赖的所有第三方模块。在ExB 1.4中,这些模块可能包括了地图渲染、交互控件、数据处理、用户界面组件等核心功能。当开发环境配置完成...

    my_node_modules.zip

    标题 "my_node_modules.zip" 暗示这是一个与 Node.js 开发相关的压缩文件,通常 `node_modules` 文件夹包含了 Node.js 项目所依赖的各种模块。这些模块是 Node.js 应用程序运行时不可或缺的部分,它们提供了各种功能...

Global site tag (gtag.js) - Google Analytics