不懂module.exports、exports、export的区别,我惨遭diss

简介: 【10月更文挑战第22天】不懂module.exports、exports、export的区别,我惨遭diss

背景

作为一个刚入职不久的菜鸡,我一直备受领导关注。这几天代码评审,领导问我module.exports、exports、export都有啥区别,怎么用。

仔细一想,我就好像都见过,但具体用途我还有点分不清。

我支支吾吾的说不都是导出模块引入模块的么,领导就diss我,这么基础的东西你都搞不明白,代码能写好?

我没敢顶嘴,先忍着,我先去学习吧!

模块规范简介

module.exports、exports、export的区别主要在于他们遵循的规范不同

规范名称 导出关键词 导入关键词 重命名变量 集体导出
commonjs module.exports / exports require {A :B } 不支持
esm export import as * as xxx

ES6出来以后,前端也支持模块的导入与导出了,因此,此时前端的模块规范就变成了esm。

再一个,不同规范不仅使用的关键词和特性不同,使用环境也不同:

nodejs中(webpack,babel)我们使用commonjs,浏览器中(vue的script标签 或 html 中带type="module"的script标签中)我们使用 esm

简单来说,平时开发都是基于esm规范,使用import语法,只有在脚手架的vue.config.js或者vite.config.js中使用commonjs。实际上,vite.config.js中也可以使用esm

commonjs规范

💡 commonjs规范: http://javascript.ruanyifeng.com/nodejs/module.html

CommonJS 规范是为了解决 JavaScript 的作用域问题而定义的模块形式,可以使每个模块它自身的命名空间中执行。该规范的主要内容是,模块必须通过 module.exports 导出对外的变量或接口,通过 require() 来导入其他模块的输出到当前模块作用域中。

列子:

module.exports.double = function( value ){
   
    return value * 2;
}
var {
    double } = require('./moduleA');
var res = double(4);

为了方便,某些情况下module.exports可以简写为exports。其实一开始exports就是module.exports的引用。

module.exports===exports //true

所以上面的moduleA.js ,可以这样省略掉module

exports.double = function (value) {
   
    return value * 2;
}
var {
    double } = require('./moduleA');
var res = double(4);
console.log(res) //8

ECMAScript 规范

esm是es6语法,这个经常使用,必选会!

export 和 export default

ECMAScript主要特点是静态解析模块依赖,并且支持异步加载。

export:

-   export 语句用于导出模块中的多个变量、函数或类。导出的内容可以在其他模块中通过 import 语句导入。
-   适用于导出多个命名的变量或函数。
// a.js
export const hello = () => {
   
  console.log('hello');
};

export const fuck = () => {
   
  console.log('fuck');
};

// b.js
import {
    hello, fuck } from './a';
foo(); // 输出 'hello'
bar(); // 输出 'fuck'
  1. export default:

    • export default 语句用于导出模块的默认值。每个模块只能有一个默认导出。
    • 导入时可以使用任何名字。
// a.js
const a = () => {
   
  console.log('woo');
};

export default foo;

// b.js
import myFunction from './a';
myFunction(); // 输出 'woo'

总结

CommonJS 规范:

-   使用 module.exports 和 exports 进行模块导出。
-   主要用于 Node.js 环境。
-   模块导入使用 require 语句。
-   module.exports 是实际导出对象,可以导出任何类型的值。
-   exports 是 module.exports 的别名,适用于添加多个导出属性或方法。

ECMAScript(ES6)规范:

-   使用 export 和 export default 进行模块导出。
-   适用于现代 JavaScript 环境,包括浏览器和 Node.js(通过支持 ES6 模块的运行时)。
-   模块导入使用 import 语句。
-   export 用于导出多个命名的变量、函数或类。
-   export default 用于导出模块的默认值,每个模块只能有一个默认导出。
相关文章
|
前端开发 容器
【前端】1、flex 布局详解
【前端】1、flex 布局详解
246 0
|
10月前
|
前端开发 JavaScript API
如何使用 Canvas 实现复杂的动画效果?
【10月更文挑战第24天】使用Canvas实现复杂的动画效果,需要综合运用JavaScript、数学知识以及对Canvas API的深入理解。
525 63
|
10月前
|
存储 JavaScript 前端开发
Redux原理
【10月更文挑战第26天】Redux通过单一数据源、只读状态、纯函数修改状态等核心概念,以及清晰的工作流程和中间件机制,为JavaScript应用程序提供了一种强大而可预测的状态管理方案。它与React等视图库的结合能够有效地实现数据驱动的视图更新,提高应用程序的可维护性和可扩展性。在实际应用中,根据项目的具体需求和复杂度,可以灵活地运用Redux及其相关的工具和技术,来构建高效、稳定的前端应用。
323 33
|
10月前
|
JavaScript 前端开发 Java
|
10月前
|
程序员 Go 项目管理
《黑神话:悟空》,我们程序员能从中学到什么
2024年8月,被誉为首部国产3A大作 的《黑神话:悟空》一段13分钟的实机演示视频,像是给全球玩家投下了一颗冲击弹,瞬间点燃了海内外游戏和西游文化爱好者的热情!作为程序员,我们能从这款游戏中学到什么呢?我们一起来探讨一下吧
156 7
|
10月前
|
Java
Java 异常处理下篇:11 个异常处理最佳实践
本文深入探讨了 Java 异常处理的最佳实践,包括早抛出晚捕获、只捕获可处理的异常、不要忽略捕获的异常、抛出具体检查性异常、正确包装自定义异常、记录或抛出异常但不同时执行、避免在 `finally` 块中抛出异常、避免使用异常进行流程控制、使用模板方法处理重复的 `try-catch`、尽量只抛出与方法相关的异常以及异常处理后清理资源。通过遵循这些实践,可以提高代码的健壮性和可维护性。
219 4
|
10月前
|
存储 C语言
【数据结构】手把手教你单链表(c语言)(附源码)
本文介绍了单链表的基本概念、结构定义及其实现方法。单链表是一种内存地址不连续但逻辑顺序连续的数据结构,每个节点包含数据域和指针域。文章详细讲解了单链表的常见操作,如头插、尾插、头删、尾删、查找、指定位置插入和删除等,并提供了完整的C语言代码示例。通过学习单链表,可以更好地理解数据结构的底层逻辑,提高编程能力。
783 4
|
10月前
|
开发框架 人工智能 物联网
跨平台开发框架的发展趋势
【10月更文挑战第25天】
|
10月前
|
前端开发 Java Spring
SpringBoot项目thymeleaf页面支持词条国际化切换
SpringBoot项目thymeleaf页面支持词条国际化切换
227 2
|
10月前
业务增量数据入仓以及增全量合并工作
增量数据入库与增量全合并工作
367 1