前言:无论是之前学的服务端的node.js还是现在做项目vue都有暴露模块和引用模块的身影,感觉挺有意思的,就整理了一下网上关于对于es6模块化的资料。
概述
在 ES6 前, 实现模块化使用的是 RequireJS 或者 seaJS(分别是基于 AMD 规范的模块化库, 和基于 CMD 规范的模块化库)。
ES6 引入了模块化,其设计思想是在编译时就能确定模块的依赖关系,以及输入和输出的变量。
ES6 的模块化分为导出(export) @与导入(import)两个模块。
个人补充:如果是在原生js上使用,在html引用js文件(有模块的)时候,比如:
<script src="./imTest.js" type="text/javascript"></script>
或者
<script src="./imTest.js" ></script>
都会报错!!!
报错的原因是用了es6的语法, 浏览器默认将它作为js解析会出现问题,需要将它作为模块导入,因此,我们需要将其修改为<script src="./imTest.js" type="module"></script>,修改之后就会出现正确的结果:
特点
ES6 的模块自动开启严格模式,不管你有没有在模块头部加上 use strict;。
模块中可以导入和导出各种类型的变量,如函数,对象,字符串,数字,布尔值,类等。
每个模块都有自己的上下文,每一个模块内声明的变量都是局部变量,不会污染全局作用域。
每一个模块只加载一次(是单例的), 若再去加载同目录下同文件,直接从内存中读取。
emmmm......再具体的用法挪步到
菜鸟教程 https://www.runoob.com/w3cnote/es6-module.html
笔者这里就简单介绍一下ES6模块比较明显的特点.。
暴露关键字:export 、export default
作用:可以把任意类似的变量暴露出去
区别:export 暴露模块需要具体变量名字,而且在import
引入时候,要用{}扩起来,当然引入全部取别名就另论。
export default 暴露的模块可以不用变量名,直接暴露就可以了,在import
引入时候,不需要{}扩起来,而且可以起任意名字。
下面是例子:
目录:
exTest.js:导出模块
imTest.js:导入模块
showTest.html:输出演示
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script src="./imTest.js" type="module"></script>
<!-- module -->
</body>
</html>
export:
exTest.js代码:
imTest.js代码:
import {name,fn} from './exTest.js';
console.log(name)
fn();
imTest.js代码也可以写成:
// import {name,fn} from './exTest.js';
// console.log(name)
// fn();
import {name} from './exTest.js';
import {fn} from './exTest.js';
console.log(name)
fn();
如果不想暴露模块的变量名,可以在导入模块部分(import)通过as来给变量命名别名:
// import {name} from './exTest.js';
// import {fn} from './exTest.js';
// console.log(name)
// fn();
import {name as uname,fn as myFn} from './exTest.js';
console.log(uname)
myFn();
输出结果:
用export default写得话,简单很多:
exTest.js代码:
export default "水晶"
export default function(){
console.log("小明")
}
imTest.js代码:
import name from './exTest.js'
import fn from './exTest.js';
fn();
console.log(name);
会报错:
因为一个模块默认导出只能有一个
exTest.js代码改写:
let name="小明";
let fn=function(){
console.log("水晶")
}
export default {name,fn}
imTest.js代码:
import obj from './exTest.js';
obj.fn();
console.log(obj.name);
输出结果: