module.exports 和 exports,export 和export default的区别

171 阅读2分钟

1、module.exports

module变量代表当前模块,这个变量是一个对象。module对象会创建一个叫exports的属性,这个属性的默认值是一个空的对象:

module.exports = {};

例子:app.js

module.exports.name = '我是电脑';
module.exports.say = () => {
  console.log('这是一个函数');
}

// 上边这段代码就相当于一个对象
{
  name: '我是电脑',
  say: () => {
    console.log('这是一个函数');
  }
}

require方法用于加载模块

let req = require('./app.js');

req.name
req.say()

2、exports 与 module.exports的关系

Node为每个模块提供一个exports变量,指向module.exports。可以通俗的理解为:

let exports = module.exports;

// module.exports可以直接导出一个匿名函数或者一个值
module.exports = () => {
  let a = 'Hello World'; 
  return a;
}

// 但是exports是不可以的,因为这样等于切断了exports与module.exports的联系
// 错误的写法
exports = () => {
  let a = 'Hello World';
  return a;
}

3、export 和 export default的区别

exportes6引出的语法,用于导出模块中的变量,对象,函数,类。对应的导入关键字是import

例子:app.js

export const firstName = 'Michael';
export const lastName = 'Jackson';
export const year = 1958;
export const say = () => {
  console.log('Hello World');
};

 export命令对外部输出了三个变量,还可以这样写(推荐写法)

const firstName = 'Michael';
const lastName = 'Jackson';
const year = 1958;
const say = () => {
  console.log('Hello World');
};

export { firstName, lastName, year, say };

如果想为输入的变量重新取一个名字,import命令要使用as关键字,将输入的变量重命名

import { lastName as newName } from './app.js';

使用import命令的时候,用户需要知道所要加载的变量名或函数名,否则无法加载。使用export default命令,为模块指定默认输出,不知道变量名或者函数名也可以使用import加载

例子:app-default.js

const func = () => {
  console.log('Hello World');
}
export default func;

 加载该模块时,import命令可以为该匿名函数指定任意名字

import customName from './app-default';

export default就是输出一个叫做default的变量或方法,然后系统允许你为它取任意名字

// modules.js
const add = (x, y) => {
  return x + y;
}
export { add as default };
// 等同于
// export default add;

// app.js
import { default as foo } from './modules';
// 等同于
// import foo from './modules';