当前位置:首页 > 理解nodejs模块系统,nodejs模块的引用

理解nodejs模块系统,nodejs模块的引用

发布于 2018-07-05 阅读 598 次 NodeJs Javascript
###nodejs的模块系统 nodejs的模块分为两类,一种是nodejs提供的核心模块,一种是用户编写的模块,成为文件模块。 模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的。可以理解为,一个 Node.js 文件就是一个模块,这个文件可能是JavaScript 代码、JSON 或者编译过的C/C++ 扩展。 #####创建一个nodejs模块 ```javascript exports.xiaoyaoji = function() { console.log('Hello Xiaoyaoji'); } ``` exports是module.exports的一个引用,如果我们想把一个对象封装在模块里可以使用: ```javascript module.exports={ name: function(){ console.log("Xiaoyaoji"); }, age: function(){ console.log("Her age is 18 for ever"); } } ``` 这里不能使用exports因为exports只是module.exports的一个引用,在node模块的上下文中有一个module对象,实际导出的是这个module对象,因为exports是module.exports的引用,他们指向同一个地址空间,所以修改了exports就相当于修改了module.exports,但是如果 exports重新赋值就会切断这种联系,下面用代码说明: ```javascript //正确做法,只修改exports的属性值 module.exports = {}; var exports = module.exports; exports.name="xiaoyaoji"; console.log(module.exports) //{name : 'xiaoyaoji'}; console.log(exports) //{name : 'xiaoyaoji'}; //错误做法,重新赋值exports会切断它和module.exports的联系 module.exports = {}; var exports = module.exports; exports={name:"xiaoyaoji"}; console.log(module.exports) //{}; console.log(exports) //{name : 'xiaoyaoji'}; ``` #####nodejs模块的引用 nodejs里面模块的引用是通过关键字require来实现的。 require的几种方式 - 核心模块,如http、fs、path等。 - .或..开始的相对路径文件模块。 - 以/开始的绝对路径文件模块。 - 非路径形式的文件模块,如自定义的connect模块。 #####扩展名分析 CommonJS模块规范也允许在标识符中不包含文件扩展名,这种情况下,Node会按.js、.json、.node的次序补足扩展名,依次尝试。在尝试的过程中,需要调用fs模块同步阻塞式地判断文件是否存在。因为Node是单线程的,所以这里是一个会引起性能问题的地方。小诀窍是:如果是.node和.json文件,在传递给require()的标识符中带上扩展名,会加快一点速度。 require("http"), 那么该http查找顺序如下图,查找的时候会做扩展名分析: ![](http://image.w2le.com/148ab4550131e23a724e530773d36b9b) require()通过分析文件扩展名之后,可能没有查找到对应文件,但却得到一个目录,具体过程会如下图: ![](http://image.w2le.com/04c29de1e71b2b6d30fec91a4a5bc2cc) 参考网址: https://blog.csdn.net/u012422829/article/details/52760981 https://blog.csdn.net/w_vc_love/article/details/51137948 https://blog.csdn.net/ityqing/article/details/78458647