模块
(1)概述
- ES6 引入了模块化,其设计思想是在编译时就能确定模块的依赖关系,以及输入和输出的变量。
- ES6 的模块化分为导出(export) 与导入(import) 两个模块。
(2)特点
- ES6 的模块自动开启严格模式,不管你有没有在模块头部加上 use strict; 。
- 模块中可以导入和导出各种类型的变量,如函数,对象,字符串,数字,布尔值,类等。
- 每个模块都有自己的上下文,每一个模块内声明的变量都是局部变量,不会污染全局作用域。
- 每一个模块只加载一次(是单例的), 若再去加载同目录下同文件,直接从内存中读取。
(3)export导出
export default
-
与default关联使用,并且一个js模块中只能有一个export default语句,为模块指定默认输出。 如果想为输入的变量重新取一个名字,
import命令要使用as关键字,将输入的变量重命名。 -
使用import命令的时候,用户需要知道所要加载的变量名或函数名,否则无法加载。但是,用户肯定希望快速上手,未必愿意阅读文档,去了解模块有哪些属性和方法。
-
为了给用户提供方便,让他们不用阅读文档就能加载模块,就要用到export default命令,为模块指定默认输出。因此export default命令只能使用一次。所以,import命令后面才不用加大括号,因为只可能唯一对应export default命令。
-
其实export default,在项目里用的非常多,一般一个Vue组件或者React组件我们都是使用export default命令,需要注意的是使用export default命令时,import是不需要加{}的。而不使用export default时,import是必须加{}
//导出字符串
export default "abc";
//导出数字
export default 123;
//导出布尔值
export default true;
//导出数组
export default [1,2,3];
//导出对象
var obj = {
name: '张三',
age: 20
}
export default obj;
//导出函数
var func = function() {
console.log("func函数");
return 100;
}
export default func;
//导出类
class People {
constructor() {
this.a = 100;
}
say() {
console.log("say...");
}
}
export default People;
//按需导出,import后面需要接大括号{}接收参数,且参数需相同名,否则报错
let name="loriy"
let age="18"
let sex="woman"
export {name,age,sex}
-------------------------
import {name,age,sex} from "./a.js"
(4)import导入
- 与from关联使用,此时script标签的type必须设置为module
- 单例模式:多次重复执行同一句 import 语句,那么只会执行一次,而不会执行多次。import 同一模块,声明不同接口引用,会声明对应变量,但只执行一次 import
<script type="module">
import People from './js/myModule.js';
let p = new People();
p.say();
</script>