koa框架4 基础入门之node.js模块系统
node模块有三个语法:
- exports
- module
- 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,但是目前还没消息,估计要等一段时间了,因为换的话是一次较大的改动。
本文系作者 @木灵鱼儿 原创发布在木灵鱼儿站点。未经许可,禁止转载。
暂无评论数据