nodejs引入自定义模块
js
模块
nodejs
编程技术
发布日期
2023-07-15
更新日期
2023-07-15
阅读次数 57
文章字数 992
在nodejs中,每个文件都是一个单独的模块
CommonJS规范规定,每个模块内部,module
变量代表当前模块。这个变量是一个对象,是内置的
尝试打印一下console.log(module);
module
上有一些属性:
id
,模块的标识符exports
,模块的导出对象parent
,表示当前模块的父模块,当前模块是谁加载的filename
,模块的绝对路径loaded
,表示是否加载完成children
,表示当前模块加载了哪些模块paths
,表示模块的搜索路径,路径的多少取决于目录的深度,寻找第三方模块时会用到
在模块的内部,this
指向的是当前模块的导出对象:
console.log(this === module.exports); // true
console.log(this === exports); // true
NodeJS支持三种类型的文件,.js
、.json
、.node
(C++扩展二进制模块)。
模块类型分为核心模块、文件模块、第三方模块,其中核心模块是编译二进制文件,加载速度最快,比如fs/path/http
等。
当尝试加载一个不带后缀的文件时,比如require('./test')
,会依次尝试test/test.js/test.json/test.node
。
再看一下模块的缓存,缓存可以通过require.cache
查看,其返回一个对象,key
是文件绝对路径,value
是Module
对象。
- CommonJS加载的是一个对象(
module.exports
属性),只有脚本运行时该对象才会确定,所以CommonJS是运行时加载。 - CommonJS输出的是一个值的拷贝,也就是说模块输出一个值后,模块内部的变化就影响不到该值。
- CommonJS模块是同步加载,由于是运行时加载,且从写法可以看出来,没有回调或
promise.then
方法,所以是同步的。
对比一下ES6的import
语法,ES6是编译时输出接口,输出的是值的引用,且ES6模块是异步加载,有独立的模块依赖的解析阶段。
模块的exports
属性(即module.exports
)是对外的接口。加载某个模块,其实是加载该模块的module.exports
属性。
如果对exports
直接赋值,也就是给它一个新的引用地址,会切断其与module.exports
的引用关系,也就会导致require
加载不到。
简单使用例子:
aa.js
test.js
在aa.js中写入代码:
module.exports={
a:1
}
在test.js中引入
let res = require("./aa.js");
console.log(res);
console.log(res.a+1);
文章作者: 朱丰华
文章链接: https://smart.52dixiaowo.com/blog/post-447.html
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。
js
模块
nodejs
发表评论
相关推荐