node模块有三个语法：exportsmodulerequirerequire其中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，但是目前还没消息，估计要等一段时间了，因为换的话是一次较大的改动。