不懂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 用于导出模块的默认值,每个模块只能有一个默认导出。
相关文章
|
3月前
|
存储 JavaScript 前端开发
[JS] ES Modules的运作原理
【9月更文挑战第16天】ES Modules(ECMAScript Modules)是 JavaScript 中的一种模块化开发规范,适用于浏览器和 Node.js 环境。它通过 `export` 和 `import` 关键字实现模块的导出与导入。模块定义清晰,便于维护和测试。JavaScript 引擎会在执行前进行静态分析,确保模块按需加载,并处理循环依赖。ES Modules 支持静态类型检查,现代浏览器已原生支持,还提供动态导入功能,增强了代码的灵活性和性能。这一规范显著提升了代码的组织和管理效率。
|
Web App开发 Dart JavaScript
剖析require、import、export、exports、module.exports以及export default 的基本用法
剖析require、import、export、exports、module.exports以及export default 的基本用法
107 0
导出与导入(require,import,module.exports,exports,export,export default)
导出与导入(require,import,module.exports,exports,export,export default)
70 0
|
JavaScript 前端开发 编译器
CommonJS与ES6 Module的本质区别
文章主要讨论了CommonJS和ES6 Module两种JavaScript模块系统的核心区别,包括动态与静态解决依赖方式,值拷贝与动态映射,以及如何处理循环依赖的问题。
248 0
|
缓存 JavaScript 算法
每天3分钟,重学ES6-ES12(十八) CJS
每天3分钟,重学ES6-ES12(十八) CJS
96 0
|
JavaScript 前端开发
每天3分钟,重学ES6-ES12(十八)ES Module(一)
每天3分钟,重学ES6-ES12(十八)ES Module
90 0
|
JavaScript 前端开发
每天3分钟,重学ES6-ES12(十八)ES Module(二)
每天3分钟,重学ES6-ES12(十八)ES Module
91 0
|
前端开发 API
每天3分钟,重学ES6-ES12(九)Promise简单介绍
每天3分钟,重学ES6-ES12(九)Promise简单介绍
85 0
|
JavaScript 小程序 前端开发
(区别、详解、使用)module.exports与exports,export与export default,import 与require
变量的导出涉及到四个关键字module.exports与exports,export与export default, 其中module.exports与exports是符合CommonJS模块规范的。
413 0
(区别、详解、使用)module.exports与exports,export与export default,import 与require
|
JavaScript 开发者
exports和module.exports的区别|学习笔记
快速学习 exports 和 module.exports 的区别
exports和module.exports的区别|学习笔记