【混淆系列】一问(module.exports、exports、export都是导出,有何区别())
大家好,我是猫小白,本文是前端混淆知识点我想大家在日常工作中做了很多项目,敲了很多代码,但是有时候很多基础的知识点是非常模糊的,或者说是处于混淆、搞不清楚的状态,当然包括我在内。第一问
,全文阅读大约需要3
分钟。
文章图片
现在一个项目的周期很短,借用我们老板的一句话(应该不会被看到吧):
客户大多数都不知道自己想要什么啥子,你只有搞快点(周五我要看,没问题涩)做出来给他体验一哈,他才知道自己应该要啥子东西
。所以为了赶进度,大部分工作都是在ctrl+c
+ctrl+v
。以至于很多基础知识都会淡忘甚至忽略,可是往往出问题的地方都是因为这些小细节。所以我想写一个【混淆系列】,在我自己学习的过程中,把前端开发过程中容易搞混淆,或者容易记错的一些知识点整理分享出来给大家,大家在评论区可以留言自己容易混淆的知识点,一起进步一起学习。好让我们开始
【混淆系类】
第一问:module.exports、exports、export有什么区别? 这三个东西其实是两个概念的区分:
先来看一个表格:
规范名称 | 导出关键词 | 导入关键词 | 重命名变量 | 集体导出 |
---|---|---|---|---|
commonjs | module.exports / exports | require | {A :B } | 不支持 |
esm | export | import | as | * as xxx |
- nodejs(webpack,babel)->commonjs,
- 浏览器(vue的script标签 或 html 中带type="module"的script标签中)-> esm。
module.exports、exports
是一伙的,他们都是基于commonjs
规范来的。export
是基于es6
的esm(ECMA Script Modules
)规范来的。
CommonJS 规范是为了解决 JavaScript 的作用域问题而定义的模块形式,可以使每个模块它自身的命名空间中执行。该规范的主要内容是,模块必须通过列子:module.exports
导出对外的变量或接口,通过require()
来导入其他模块的输出到当前模块作用域中。
// moduleA.js
module.exports.double = function( value ){
return value * 2;
}
// moduleB.js
var { double } = require('./moduleA');
var res = double(4);
console.log(res) //8
为了方便,
某些情况下
module.exports
可以简写为exports
。其实一开始exports
就是module.exports
的引用。module.exports===exports //true
所以上面的
moduleA.js
,可以这样省略掉module
// moduleA.js
exports.double = function (value) {
return value * 2;
}
// moduleB.js
var { double } = require('./moduleA');
var res = double(4);
console.log(res) //8
当
module.exports
后面跟着赋值语句时,不能省略module.
,为什么?我们接着看一开始
module.exports
全等于 exports
我们可以看成在文件开头
有这样的代码:module.exports = {};
//方便理解 一开始是空对象
let exports = module.exports;
console.log(module.exports===exports)//true
所以在
exports
对象{}
上添加任何的新属性,其实就是在module.exports
上添加属性,因为我们知道node
中对象也是引用类型的。如:
exports.double = function (value) {
return value * 2;
}exports.PAI = 3.1415926535897932384626 //233,我可以背这么多位~
exports.add = function (a, b) {
return a + b;
}
危!给exports赋值就不行了
module.exports = {};
//方便理解 一开始是空对象
let exports = module.exports;
//给exports 赋值会切断和 module.exports 的联系//这样 不要这样做~!
exports = {
name: 'zhangsan'
}
//或这样不要这样做~!
exports = function name(a) {}
//或这样不要这样做~!
exports = 3.1415926535897932384626
console.log(module.exports);
// 打印:{} 回到初始{}值
console.log(exports);
// 打印:3.1415926535897932384626console.log(module.exports === exports);
//false 你走的独木桥 我走我的阳关道 已经莫得关系了
如果要使用赋值来导出,可以这样导出一个对象:
// moduleA.js
module.exports = {
name:'法外狂徒张三',
age:'19',
wife:'隔壁小红'
}// moduleB.js
let { name, wife } = require('./moduleA');
console.log(name,age) //法外狂徒张三 隔壁小红
这样
module.exports
就能保证获取到值。【【混淆系列】一问(module.exports、exports、export都是导出,有何区别())】如何重命名
commonjs中重命名导出的变量用(
:
)符号:let { name, wife:girlfriend } = require('./moduleA');
esm(
ECMA Script Modules
)规范
现在来说我们在编写vue或者react项目中熟悉的es6 module规范。esm 是将 javascript 程序拆分成多个单独模块,并能按需导入的标准。和webpack
,babel
不同的是,esm 是 javascript 的标准功能,在浏览器端和 nodejs 中都已得到实现。使用 esm 的好处是浏览器可以最优化加载模块,比使用库更有效率。通过import
,export
语法实现模块变量的导入和导出
划重点:commonjs
中使用require
和modelue.exports
实现模块的导入导出,esm
使用import
,export
导入导出。
esm
的export
支持:let、var、const、function、class
等 以下都是正确的导出方式:
var person = {
name: '猫小白',
text: a,
}
export {
person,
}
export function showAge() {
console.log(person.age);
}
export let city = '成都'
export const PAI = '3.141592653'
注意:export
命令规定的是对外的接口,必须与模块内部的变量建立一一对应关系。
// 错误1
export 3.14;
// 错误2
var api = 3.14;
export api;
这俩种写法都是错误的,因为export后面直接跟了一个具体的,外部无法通过一个特定的标识(变量)来获取这个值。export default 默认导出 和
commonjs
规范先进一点的是 esm
提供了一种默认导出的方式。export defaul
t后面可以直接跟随:变量、具体值、function、calss
。//正确
let a = '张三';
export default a
//正确
export default 3.14export default function (a) {
return a * a
}
//正确
let sum = function (a, b) {
return a + b
}
export default sum
//正确
function calc(a, b) {
return a + b
}
export default calc
如何重命名
ESM
中提供了as
关键词对导出的变量重命名,防止变量名重复。import { wife as girlfrend } from "./moduleA.js";
想要导出所有方法或变量为指定的一个变量时,可以用
import * as mod from "xxxx"
import * as tool from "./moduleA.js";
console.log(tool.API) //3.141592
ESM
模块规范规定,在html
中 script
标签设置 type='module'
可以书写ESM
模块代码,包括导入功能:
以上。
篇幅有限,有很多没有写到的地方,不过用于区分这两者来说,已经足够了。
文章图片
下一篇写什么好呢?欢迎各位大佬评论留言或指出错误~,感谢!肯请各位大佬,不要忘了给我
点赞
、评论
、收藏
。往期精彩:
1.【包真】我的第一次webpack优化,首屏渲染从9s到1s
2. 什么是迭代器(iterator)?Generator和它有什么关联
推荐阅读
- 【故障公告】龙卷风继续袭击,服务器们顽强抵抗
- EE1612
- 基于matlab的捕食算法,【优化求解】基于matlab细菌觅食算法的函数优化分析【含Matlab源码 217期】...
- 【树 图 科 技 头 条】 2022年3月14日 星期一
- 【第四十期】shopee-golang后台一面面经
- 微服务从代码到k8s部署应有尽有系列(十四、部署环境搭建)
- 人工智能|人工智能---深度学习从感知机到神经网络
- 日常小技巧|已知点坐标,求夹角大小(0-360度)(python)
- android|android coredump,coredump功能介绍
- 手写|手写 Vue 系列 之 Vue1.x