NODE入门
NODE本身是基于CommonJS模块规范设计的,所以模块是NODE的组成
- 内置模块:NODE天生提供给JS调取使用的
- 第三方模块:别人写好的,我们可以基于NPM安装使用
- 自定义模块:自己创建一些模块
CommonJS模块化设计的思想(AMD/CMD/ES6 MODULE都是模块设计思想)
- CommonJS规定,每一个JS都是一个单独的模块(模块是私有的:里面涉及的值和变量以及函数等都是私有的,和其他JS文件中的内容是不冲突的)
- CommonJS可以允许模块中的方法互相的调用
导出
CommonJS给每一个模块(每个JS)中都设置了内置的变量/属性/方法
(1)module:代表当前这个模块(object)
(2)module.exports:模块的这个“属性”是用来导出当前模块属性方法的(object)
(3)exports:是内置的一个“变量”,也是用来导出当前模块属性方法的,虽然和module.exports不是一个东西,但是对应的值是同一个(module.exports = exports 值都是对象)
导入
require:CommonJS提供的内置变量,用来导入模块的(其实导入的就是module.exports暴露出来的东西):导入的值也是[object]类型的
注:require是一个同步操作:只有把导入的模块代码执行完成,才可以获取值,然后继续执行本模块下的代码
CommonJS特点
- 所有代码都运行在模块作用域,不会污染全局作用域(每一个模块都是私有的,包括里面所有东西都是私有的,不会和其他模块产生干扰)
- 模块可以多次加载,但是只会在第一次加载时运行一次,然后运行结果就被缓存了,以后再加载,就直接读取缓存结果。要想让模块再次运行,必须清除缓存
- 模块加载的顺序,按照其在代码中出现的顺序,CommonJS规范加载模块是同步的,也就是说只有加载完成才能执行后面的操作
注:exports = {}是无法导出内容的:默认和module.exports是同一个堆内存,但是这种操作让exports指向新的堆内存,而module.exports不受影响(require导入的是module.exports对应的堆内存,而不是exports的)