node模块有三个语法:

  1. exports
  2. module
  3. require

require

其中require就是一个引入模块的方法,他有两个路径写法,如果你引入的是系统模块,那么直接写模块名,不需要加路径,如果你引入一个自己的模块,需要加上当前路径,或者你自己的模块丢在当前目录的node_modules目录下,你也可以省略路径。

require("http");

require("./my_http");

require("my_http");

node的模块都是js文件,所以我们可以省略这个后缀名不写

还有一种省略就是省略引入的js文件,node他支持默认引入index.js文件,有点像html的index.html,浏览器会默认读取这个index.html文件,在node里面,如果你没有指定要引入的文件名,他也会默认去找目录下的index.js文件。

假设我有一个目录为test,在test目录下有一个index.js文件,我们引入这个模块就可以这样写:

require("./test");

module和exports

注意exports是node语法,export是es6的语法,两个不一样的

其中exports就是module.exports的引用:

console.log(exports === module.exports);

//true

其原理如下:

let my_module = {
    exprots: {}
}

let my_exprots = my_module.exprots;

exports是一个变量名,他引用了module.exports对象,但是也正因为js的引用类型,导致他们俩个的用法不同,我们可以理解,node最终导入模块的是module.exports对象,所以,如果module.exports在随后代码里重新赋值了,exports导出的任何东西都会不见,因为之前的引用对象不见了,

exports.a = 1;
exports.b = 2;

module.exports = {
    c: 3
}

我们引入这个模块只能得到{c:3}

所以,这样就导致了两种导出方式,exports只能通过exports.xxx=xxx;的方式每次导出一个内容,而module.exports可以一次导出多个。

模块规则

js在最开始是没有所谓的模块化的,他就是一个js文件,直接script引入就行了。

但是后来项目的复杂,script引入很多不便,文件名还有可能相同导致冲突,于是出现了命名空间,但是这个也不能很好解决开发上的问题。

然后出现了民间的cmd规则,这也是node所使用的规则。

但是cmd在后来又发下引入太慢了,于是有了amd,异步模块规范,但是现在也用的不多,虽然很强。

amd规范不久后官方也出了自己的规范esm,但是这种规范浏览器目前还不支持,需要webpack协助编译,所以目前也不是很通用,但是node作者说以后会更换为esm,但是目前还没消息,估计要等一段时间了,因为换的话是一次较大的改动。

分类: Node 标签: nodekoaexportsmodule

评论

暂无评论数据

暂无评论数据

目录