CommonJS和ES6中的导入导出使用总结

一、CommonJS的导入导出

1、使用exports导出(注意是有s)
(1)注意:exports刚开始是一个空对象,我们可以在这个对象中添加很多个属性,添加的属性会被导出;

//这是 main.js文件
let name = 'miracle';
let age = 18;

function abc() {
  console.log('你好'+name);
}

exports.name = name;
exports.age = age;
exports.abc = abc;

(2)另外一个文件中可以导入:

//这是bar.js文件
const bar = require('./main.js');

(3)上面导入那行完成了什么操作呢?

1)意味着bar.js文件中的bar变量等于exports对象;
2)也就是require通过各种查找方式,最终找到了exports这个对象;
3)并且将这个exports对象赋值给了bar变量;
4) bar变量就是exports对象了

(4)注意:bar.js文件中的bar变量是exports对象引用赋值,所以在bar.js文件中修改bar变量的属性值,则exports中对应的属性值也会跟着变化,例如:

//这是main.js文件
let name = 'miracle';
let age = 18;
exports.name = name;
exports.age = age;
//这是bar.js文件
const bar = require('./main.js'); 
console.log(bar);//第一次输出bar

bar.name = 'abc';
console.log(bar);//第二次输出bar
//控制台输出的结果
{ name: 'miracle', age: 18 }
{ name: 'abc', age: 18 }

2、使用module.exports导出
(1)可以知道,Node中导出东西时,基本上是通过module.exports导出的,具体原因如下:

通过维基百科中对CommonJS规范的解析可知:
1)CommonJS中是没有module.exports的概念的;
2)但是为了实现模块(每一个js文件,就是一个模块)的导出,Node中使用的是Module的类,每一个模块都是Module的一个实例,也就是module
3)所以在Node中真正用于导出的其实根本不是exports,而是module.exports;
4)因为module才是导出的真正实现者;
5)但是,为什么exports也可以导出呢?
6)这是因为module对象的exports属性是exports对象的一个引用而已,即module对象的exports属性的引用指针指向exports对象;
7) 也就是说 module.exports = exports = bar.js中的bar对象;
8)所以严谨来说,本质上,Node中导出东西时,其实都是通过module.exports导出的;
9)注意(例外情况):当在一个js文件时,exports和module.exports同时存在,且导出不同对象时,要以module.exports导出的对象为准,因为本质上,Node中要导出东西时,都是通过module.exports导出的(一般情况下,module对象的exports属性的引用指针指向exports对象,但当module.exports的引用指针不指向exports时,导出的东西,要以module.exports为准);

二、ES6 模块导入导出

1、export的使用(注意,没有s)

//aaa.js文件
var name = '小明'
var age = 18
var flag = true

function sum(num1, num2) {
  return num1 + num2
}

if (flag) {
  console.log(sum(20, 30));
}

// 1.导出方式一:
export {
  flag, sum
}

// 2.导出方式二:
export var num1 = 1000;
export var height = 1.88


// 3.导出函数/类
export function mul(num1, num2) {
  return num1 * num2
}

export class Person {
  run() {
    console.log('在奔跑');
  }
}

//4.export default(只有一种方式)
//下面进行对比:

//export的两种方式
//const address = '北京市'
//export {
//  address
//}
//export const address = '北京市'

//export default的一种方式
const address = '北京市'
export default address

2、import的使用

// 1.导入的{}中定义的变量
import {flag, sum} from "./aaa.js";

if (flag) {
  console.log('小明是天才, 哈哈哈');
  console.log(sum(20, 30));
}

// 2.直接导入export定义的变量
import {num1, height} from "./aaa.js";

console.log(num1);
console.log(height);

// 3.导入 export的function/class
import {mul, Person} from "./aaa.js";

console.log(mul(30, 50));

const p = new Person();
p.run()

// 4.导入 export default中的内容
//addr的名字是随便取的
import addr from "./aaa.js";

// 5.统一全部导入
// import {flag, num, num1, height, Person, mul, sum} from "./aaa.js";

import * as aaa from './aaa.js'

console.log(aaa.flag);
console.log(aaa.height);

3、某些情况下,一个模块包含某个功能,我们并不希望给这个功能命名,而是让导入着自己命名,这个时候就可以使用export.default:

//info.js
const address = '北京市'
export default address
导入 export default中的内容
//addr的名字是自己随便取的
import addr from "./aaa.js";

4、另外,注意:export default在同一个模块中,不允许出现多个。

三、补充部分

关注公众号:【深漂程序员小庄】:
内含丰富的学习资源和面试经验(不限前端、java),还有学习交流群可加,并且还有各大厂大佬可一起交流学习,一起进步~添加小庄微信,回复【加群】,可加入互联网技术交流群:

在这里插入图片描述

  • 6
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
好的,我将根据您的要求回答您的问题。现在让我们来看一些关于 CommonJSES6 的面试题。 1. 什么是 CommonJSES6CommonJS 是一种模块化规范,用于在服务器端和客户端 JavaScript 应用程序定义模块。它定义了模块的导入导出规则,使得模块可以在应用程序重用。ES6(ECMAScript 2015)是 JavaScript 的一个版本,它引入了很多新的语言特性和功能,包括模块化机制。 2. CommonJSES6 模块化规范之间有什么区别? CommonJS 是一种同步加载模块的规范,而 ES6 则是一种异步加载模块的规范。在 CommonJS ,模块的导入导出是通过 require() 和 module.exports 或 exports 来实现的,而在 ES6 则是通过 import 和 export 语句来实现的。此外,ES6 还支持静态分析,这意味着编译器可以在编译时确定哪些模块将被导入导出,以及它们的依赖关系。 3. ES6 的模块化规范有哪些优点? ES6 的模块化规范具有以下优点: - 易于维护和调试:ES6 模块化的导入导出语句更加清晰和简洁,使得代码更易于维护和调试。 - 静态分析:ES6 模块化规范可以在编译时进行静态分析,这使得编译器可以优化代码并检测潜在的错误。 - 更好的命名空间管理:ES6 模块化规范通过使用命名空间来管理模块,从而避免了全局命名空间污染的问题。 - 支持循环依赖:ES6 模块化规范支持循环依赖,这意味着模块可以相互依赖而不会导致死循环。 4. CommonJS 的模块化规范有哪些缺点? CommonJS 的模块化规范有以下缺点: - 同步加载:由于 CommonJS 使用同步加载模块的方式,因此会导致应用程序的启动时间变慢。 - 无法进行静态分析:由于 CommonJS 的模块化规范是动态的,因此编译器无法在编译时确定模块的依赖关系,这会导致一些潜在的错误。 - 无法进行优化:由于 CommonJS 使用动态加载模块的方式,因此编译器无法对模块进行优化,这会导致应用程序的性能问题。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值