当前位置: 首页 > java >正文

nodejs模块化

文章目录

    • 什么是模块化
    • CommonJS
    • 模块的导入与暴露
    • 总结


什么是模块化

概念:将一个复杂的程序依据一定的规则(规范)封装成几个块(文件),并组合在一起。

模块的内部数据、实现是私有的, 只是向外部暴露一些接口(方法)与外部其它模块通信。

模块化的好处:

  1. 避免命名冲突,减少命名空间污染
  2. 降低耦合性;更好地分离、按需加载
  3. 高复用性:代码方便重用,别人开发的模块直接拿过来就可以使用,不需要重复开发类似的功能。
  4. 高可维护性:软件的声明周期中最长的阶段其实并不是开发阶段,而是维护阶段,需求变更比较频繁。使用模块化的开发,方式更容易维护。
  5. 部署方便

CommonJS

CommonJS 规范规定:每个模块内部,module 变量代表当前模块。这个变量是一个对象,它的 exports 属性(即 module.exports)是对外的接口对象。加载某个模块,其实是加载该模块的 module.exports 对象。

模块的导入与暴露

俩个模块之间是互不影响的,为了使模块A使用模块B中的方法,就要暴露模块B中的方法,具体实现如下

  1. CommonJS
//文件:90模块化.js
const baseURL = '';
const getArraySum = arr => arr.reduce((sum, val) => sum += val, 0);module.exports = {url: baseURL,arraySum: getArraySum
};
//导入(另一个文件)
const arr = require('./90模块化.js');
console.log(arr.arraySum([1, 2, 3]));
  1. ES Module(命名导入导出)

exports对象用来导出当前模块的公共方法或属性。
export 变量实则是exports.xxx = 变量,是在给该模块的export对象添加属性

//文件93.命名导入和导出.js
export const url = "";
export function getArraySum(arr) {return arr.reduce((a, b) => a + b, 0);
}
//导入的文件(另一个文件)
import { url, getArraySum } from "./93.命名导入和导出.js";
console.log(getArraySum([1, 2, 3]));
  1. ES Module(默认导出)
//文件90模块化.jsconst baseURL = '';
const getArraySum = arr => arr.reduce((sum, val) => sum += val, 0);export default {url: baseURL,getArraySum
};//导入
import arr from './90模块化.js';
console.log(arr.getArraySum([1, 2, 3]));

总结

方法优点缺点
CommonJS1. 简单易用,语法简洁,易于理解和使用。
2. 动态性高,可在运行时动态加载模块。
3. 与现有的Node.js项目和包高度兼容,向后兼容性好。
1. 容易产生变量冲突,不支持命名空间。
2. 不利于工具进行静态分析。
3. 原生不支持浏览器环境,需借助工具才能在浏览器中使用。
ES命名导出1. 命名导出明确模块中的变量或函数,便于理解和维护。
2. 支持静态分析,利于工具优化和检查。
3. 支持默认和命名导出共存。
1. 语法稍显复杂,需用大括号导入和导出。
2. 在Node.js中使用需额外配置,如设置"type": "module"或使用.mjs文件扩展名。
ES默认导出1. 语法简洁直观,可导出整个对象或单个模块。
2. 灵活性高,可导出任意值,包括函数、对象、类等。
3. 支持静态分析,利于工具优化和检查。
1. 默认导出的名称在导入时可随意更改,可能导致命名不直观,影响代码可读性。
2. 在一个模块中同时使用默认导出和命名导出时,可能造成混淆。
http://www.xdnf.cn/news/16060.html

相关文章:

  • JS WebAPIs DOM节点概述
  • 前端_Javascript复习
  • C语言:第11天笔记
  • Python通关秘籍(四)数据结构——列表
  • 力扣 hot100 Day52
  • 网络基础DAY16-MSTP-VRRP
  • 2025 年最新 AI 技术:全景洞察与深度解析​
  • 02-netty基础-java四种IO模型
  • 深入解析 Spark:关键问题与答案汇总
  • 【Spring拦截器实战】路径拦截与访问控制系统设计
  • 期货配资软件开发注意事项?
  • Linux文件——文件系统Ext2(1)_理解硬件
  • Java (Spring AI) 实现MCP server实现数据库的智能问答
  • 2️⃣tuple(元组)速查表
  • 从“点状用例”到“质量生态”:现代软件测试的演进、困局与破局
  • vscode不识别vsix结尾的插件怎么解决?
  • 应用层攻防启示录:HTTP/HTTPS攻击的精准拦截之道
  • Datawhale AI 夏令营-心理健康Agent开发学习-Task1
  • MongoDB频繁掉线频繁断开服务的核心原因以及解决方案-卓伊凡|贝贝|莉莉|糖果
  • 【OpenCV篇】OpenCV——01day.图像基础
  • 漫画版:细说金仓数据库
  • 2025年COR SCI2区,基于多种配送模式的无人机自主配送车辆路径问题,深度解析+性能实测
  • 面试高频题 力扣 LCR 130.衣柜整理 洪水灌溉(FloodFill) 深度优先遍历(dfs) 暴力搜索 C++解题思路 每日一题
  • PACKET_HOST等宏定义介绍
  • 目标检测系列(六)labelstudio实现自动化标注
  • YOLO-实例分割头
  • 使用vue-pdf-embed发现某些文件不显示内容
  • 能协调控制器的硬件与软件组成及解决方案
  • 16.多生成树MSTP
  • 图论的整合