Nodejs的模块化因为出现的较早,所以它遵循的是CommonJS规范,而非ES6的模块化。node
在Nodejs的模块化中,最经常使用到的有module对象、exports对象、require方法。git
其中module和exports用于输出模块,require用于引用模块。github
示例代码:/lesson10/module1.js、/lesson10/require.jsbash
先新建一个module1.js文件,代码以下:less
module.exports.a = 1
module.exports.b = 2
let c = 3
复制代码
在require.js中,引入模块并打印:模块化
const module1 = require('./module1')
console.log(module1)
复制代码
能够看到打印结果:{ a: 1, b: 2 }。函数
这段代码的含义以下:ui
const module2 = require('module2')
console.log(module2) // { a: 1, b: 2 }
复制代码
若此时项目目录下的node_modules文件夹下存在module2.js文件,则会引用该文件。this
若不存在,则会查找系统的node_modules文件夹下,即全局安装的模块,是否存在module2。spa
若还不存在该模块,则会报错。
经过require导入的模块,能够被任意命名,所以写成const a = require('module2')也是能够的。
上面这个例子中的模块导出,还能够省略module,直接写成exports.a = 1; exports.b = 1; ...。
但直接使用exports导出,也仅支持这种写法,若写成:
exports = {
a: 1,
b: 2
}
复制代码
在引用模块时,只能接收到{},也就是说exports只支持exports.a = 1;这样的语法。
若是要将整个模块直接定义为一个对象、函数、变量、类,则须要使用module.exports = 123。
以下:
示例代码:/lesson10/module3.js
module.exports = {
a: 1,
b: 2
}
module.exports = 123
module.exports = {
a: 1,
b: 2,
c: 3
}
module.exports = function () {
console.log('test')
}
module.exports = class {
constructor(name) {
this.name = name
}
show() {
console.log(`Show ${this.name}`)
}
}
复制代码
module.exports能够让模块被赋值成任意类型,但须要注意的是此时module.exports相似于一个模块内的全局变量。
对它的重复赋值,只有最后的值有效,以前的值会直接被覆盖。
在这个例子中,module3.js模块最终导出为一个类。
所以,一般推荐使用module.exports,能够避免出错。