nodejs模块化
文章目录
- 什么是模块化
- CommonJS
- 模块的导入与暴露
- 总结
什么是模块化
概念:将一个复杂的程序依据一定的规则(规范)封装成几个块(文件),并组合在一起。
模块的内部数据、实现是私有的, 只是向外部暴露一些接口(方法)与外部其它模块通信。
模块化的好处:
避免命名冲突
,减少命名空间污染降低耦合性
;更好地分离、按需加载高复用性
:代码方便重用,别人开发的模块直接拿过来就可以使用,不需要重复开发类似的功能。高可维护性
:软件的声明周期中最长的阶段其实并不是开发阶段,而是维护阶段,需求变更比较频繁。使用模块化的开发,方式更容易维护。部署方便
CommonJS
CommonJS 规范规定
:每个模块内部,module 变量代表当前模块。这个变量是一个对象,它的 exports 属性(即 module.exports)是对外的接口对象。加载某个模块,其实是加载该模块的 module.exports 对象。
模块的导入与暴露
俩个模块之间是互不影响的,为了使模块A使用模块B中的方法,就要暴露模块B中的方法,具体实现如下
- 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]));
- 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]));
- 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]));
总结
方法 | 优点 | 缺点 |
---|---|---|
CommonJS | 1. 简单易用,语法简洁,易于理解和使用。 2. 动态性高,可在运行时动态加载模块。 3. 与现有的Node.js项目和包高度兼容,向后兼容性好。 | 1. 容易产生变量冲突,不支持命名空间。 2. 不利于工具进行静态分析。 3. 原生不支持浏览器环境,需借助工具才能在浏览器中使用。 |
ES命名导出 | 1. 命名导出明确模块中的变量或函数,便于理解和维护。 2. 支持静态分析,利于工具优化和检查。 3. 支持默认和命名导出共存。 | 1. 语法稍显复杂,需用大括号导入和导出。 2. 在Node.js中使用需额外配置,如设置 "type": "module" 或使用.mjs 文件扩展名。 |
ES默认导出 | 1. 语法简洁直观,可导出整个对象或单个模块。 2. 灵活性高,可导出任意值,包括函数、对象、类等。 3. 支持静态分析,利于工具优化和检查。 | 1. 默认导出的名称在导入时可随意更改,可能导致命名不直观,影响代码可读性。 2. 在一个模块中同时使用默认导出和命名导出时,可能造成混淆。 |