谈谈node.js中的模块系统
Node.js的模块JavaScript做为一门为网页添加交互功能的简单脚本语言问世,在诞生时并不包含模块系统,随着JavaScript解决问题越来越复杂,把所有代码写在一个文件内,用function区分功能单元已经不能支撑复杂应用开发了,ES6带来了大部分高级语言都有的class和module,方便开发者组织代码import _ from 'lodash'; class Fun {} export default Fun;上面三行代码展示了一个模块系统最重要的两个要素import和export 1. export用于规定模块的对外接口2. import用于Node.js的模块系统是其核心特性之一,它允许开发者将代码组织成独立的模块,便于管理和复用。在JavaScript的早期版本中,并未内置模块系统,随着语言的发展和复杂性的增加,尤其是ES6的出现,引入了"class"和"module",使得模块化成为可能。在Node.js中,模块主要通过`require`和`module.exports`来实现。`require`函数用于导入其他模块的功能,而`module.exports`则用于规定模块对外提供的接口。例如,`circle.js`文件导出了一个计算圆面积的方法: ```javascript const { PI } = Math; module.exports = function area(r) { return PI * r ** 2; }; ```然后在其他文件如`test.js`中,可以使用`require`来引用这个模块: ```javascript const area = require('./circle.js'); console.log(`半径为4的圆的面积是${area(4)}`); ``` `module.exports`通常有以下两种使用方式: 1.为`module.exports`添加属性或赋值给新对象: ```javascript module.exports.prop1 = xxx; module.exports.funA = xxx; module.exports.funB = xxx; ```或者```javascript module.exports = { prop1, funA, funB, }; ``` 2.另外,也可以使用`exports`对象来添加属性,但不能赋值给新对象,因为`exports`是`module.exports`的一个引用,直接赋值会给`exports`新增属性而不是改变`module.exports`。 ```javascript //正确:添加属性exports.prop1 = xxx; exports.funA = xxx; exports.funB = xxx; //错误:赋值给新对象// module.exports = {prop1,funA,funB,}; //如果这样写,exports的修改无效``` `require`函数支持两种类型的参数:模块名和文件路径。模块名如`'fs'`和`'lodash'`分别代表内置核心模块和npm安装的第三方模块。对于文件路径,可以省略扩展名,Node.js会尝试`.js`、`.json`和`.node`的顺序来加载。路径可以是绝对路径(以`/`开头)或相对路径(以`./`或`../`开头),相对路径是相对于调用`require`的当前文件。当模块被`require`时,Node.js会缓存该模块,避免重复加载。如果存在循环依赖,即模块A依赖模块B,模块B又依赖模块A,Node.js会处理这种情况,确保每个模块只执行一次,并在完成初始化后返回。 Node.js的模块系统通过`require`和`module.exports`提供了一种强大的代码组织方式,使得大型项目可以被分解成可重用的模块,提高了代码的可维护性和复用性。同时,Node.js也支持多种模块引用方式,包括使用模块名和文件路径,以及处理循环依赖的能力,这使得开发者能够灵活地构建复杂的Node.js应用程序。
81.65KB
文件大小:
评论区