什么是模块化?
模块化就是将独立的功能代码封装成一个独立的文件,其他模块需要使用,再进行引用。
模块化的作用?
模块化有利于代码的拆分和架构上的解耦。模块化再服务端邻域早已成熟,nodejs也已经支持模块化。
一.commonjs
模块加载机制被称为commonjs规范
伴随则 nodejs 而诞生的 commonjs 规范。commonjs 规范应用于nodejs应用中,在 nodejs 应用中每个文件就是一个模块,拥有自己的作用域,文件中的变量,函数都是私有的,与其他文件相隔。
commonjs 规范规定,每个模块内部,module 变量代表当前模块。这个变量是一个对象,它的 exports 属性(即 module.exports )是对外的接口。加载某个模块,其实是加载该模块的 module.exports 属性。
module 中有这些属性
module.id :模块的识别符,通常是带有绝对路径的模块文件名。
module.filename:模块的文件名,带有绝对路径。
module.loaded:返回一个布尔值,表示模块是否已经完成加载。
module.parent:返回一个module 对象,表示调用该模块的模块,如果该模块没有被引用,那么 parent 属性就为 null 。
module.children:返回一个 module 数组,表示该模块要用到的其他的模块。
module.exports:表示模块对外输出的值。
module.path:这个用于 require 查找该文件的位置。
二.require
既然有 module.exports 导出,就有与之对应的 require 导入,如下:
根据参数的不同格式,require 命令去不同的路径寻找模块文件。
- 如果参数字符串以 "/ " 开头,则表示加载的是一个绝对路径的模块文件。例如: require("/home/marco/foo.js") 将加载 /home/marco/foo.js 。
- 如果参数字符串以 "./" 开头,则表示加载的是一个位于相对路径(跟当前文件的位置相比)的模块文件。例如:require("./circle") 将加载当前脚本同一目录的 circle.js 脚本
三.module.exports 和 exports
我们还可以导出 exports 直接使用,但需要注意一点,exports 是已经定义的常量,在导出的时候不能再给它定义
exports = module.exports
当需要注意一点,在导出对象前不能修改 exports 的指向,若修改 exports 就与 module.exports 不是一个东西了,当然你可以在导出后随意修改,这时候就不影响导出。
单独使用 exports 和 module.exports 其实没啥区别,个人建议还是使用 module.exports ,毕竟这才是常规稳妥的写法。