为什么需要CommonJs规范:
JS没有模块系统、标准库较少、缺乏包管理工具;为了让JS可以在任何地方运行,以达到Java、C#、PHP这些后台语言具备开发大型应用的能力;
定义和加载模块
在CommonJs规范中:
-
一个文件就是一个模块,拥有单独的作用域;
-
普通方式定义的变量、函数、对象都属于该模块内;
-
通过
require
来加载模块; -
通过
exports
和modul.exports
来暴露模块中的内容;
模块中的所有代码都运行在模块作用域,不会污染全局作用域;同一个模块可以多次加载,但只会在第一次加载的时候运行一次,然后运行结果就被缓存了,以后再加载,就直接读取缓存结果;模块的加载顺序,按照代码的出现顺序是同步加载的;
__dirname
代表当前模块文件所在的文件夹路径,__filename
代表当前模块文件所在的文件夹路径+文件名;
require
(同步加载)基本功能:读取并执行一个JS文件,然后返回该模块的exports
对象,如果没有发现指定模块会报错;
模块内的exports
:为了方便,node为每个模块提供一个exports
变量,其指向module.exports
,相当于在模块头部加了这句话: var exports = module.exports
,在对外输出时,可以给exports
对象添加方法,PS:不能直接赋值(因为这样就切断了exports
和module.exports
的联系);
划重点:
- 一个文件就是一个模块,模块中所有的代码都运行在模块作用域中。在模块中定义的变量、函数、对象都属于模块,不会污染全局作用域。
- 同一个模块可以加载多次,但只会在第一次加载的时候运行一次,然后运行结果就被缓存了,以后再加载就直接读取缓存结果。模块的加载方式是同步顺序加载。