STPace's Studio.

module.exports and exports

Word count: 537 / Reading time: 2 min
2018/07/10 Share

Intro

commonJS 对 js 包编译处理时通过函数封装了每个包的独立作用域,并通过参数传入require module exports 等对象。
require 导入模块,module.exports 和 exports 用来导出模块。
刚开始学习 node 的大多都会有这个问题,两种导出模块的方法都在各种地方见过,貌似用法页差不多,到底有什么区别。。。

先来钢两个例子

module.exports

example1:导出一个构造函数

1
2
3
4
5
6
7
8
9
function Person(){  
};
Person.prototype.sayHi = function(){
console.log('Hi');
};
Person.sayHello = function(){
console.log('Hello');
};
module.exports = new Person();

example2:导出一个对象实例

1
2
3
4
5
6
7
8
9
function Person(){  
};
Person.prototype.sayHi = function(){
console.log('Hi');
};
Person.sayHello = function(){
console.log('Hello');
};
module.exports = Person;

分别对这两个例子 require

1
2
3
4
5
6
7
8
9
10
var person = require('./Person');
console.log(person);
// example1: Person {}
// example2: { [Function: Person] sayHello: [Function] }
person.sayHi();
// example1: Hi
// example2: TypeError: Cannot read property 'sayHi' of undefined
person.sayHello();
// example1: TypeError: person.sayHello is not a function
// example2: Hello

对于例子2这种导出时未创建实例的也可在require后创建

1
2
3
4
5
6
var Person = require('./Person');
person = new Person();
person.sayHi();
// Hi
person.sayHello();
// TypeError: person.sayHello is not a function

以第一种构造函数的方式导出,模块中需要导出的属性需要通过 property 的方式添加。例子中的 sayHello() 可以看作是模块的私有方法,不能在模块外部使用,但在模块内是可以用的,sayHi() 看作是模块的公有方法。
以第二种对象实例的方式导出,模块中需要导出的属性是通过给对象属性赋值的方式添加的。例子中的公私有方法刚好与第一种相反,property方式添加的 sayHi() 是私有方法,sayHello() 是公有的。

exports

1
2
3
exports.sayHello = function () {  
console.log('Hello');
};
1
2
var Person = require('./Person.js');  
Person.sayHello(); // Hello

从这两种导出方法的例子看,对于一般的模块,用两种方式都是可以实现相同效果的。
很奇怪,网上也没有找到有人对于这两种方法的整理文章,针对这两种使用场景的区分到底是什么。。。

CATALOG
  1. 1. Intro
  2. 2. 先来钢两个例子
    1. 2.1. module.exports
    2. 2.2. exports