ECMAScript6--模块化

138 阅读3分钟

正如前文说到,模块化的核心就是导入和导出,所以还是从这两个方面入手。

ES6模块化的导出

ES6模块化的导出的关键字就是export

export的基本使用

  1. 声明变量/函数时,将其导出
export let a = "aaa";
export let b = "bbb"
export function sum (){}
  1. 导出一个对象
 let a = "aaa";
 let b = "bbb"
 function sum (){}
 export {a,b,sum}//(这是对象字面量的增强写法,前面的文章有讲)

这两种形式是完全可以共存的,实际上,所有要导出的东西都放在一个对象种,变量名/函数名作为属性名/方法名,变量值/函数体作为属性值/方法。

默认导出

模块可以设置一个默认导出的值,通过export default关键字。

let a  = "a";
export default  a 

这里存在两个问题:

  1. 什么时候接收默认导出?
    这个要结合导入的相关知识才能很好的解释。那先描述几种接收的情况(写一些伪代码)
// a.js
export let a  ="aaa";
export function sum(){}
let b = "bbb"
export default b


// b.js(接收a导出的东西)
//接收方式一   
import { a, sum }  from("a.js的路径");//这是通过解构赋值的形式进行接收,那么就是把导出的对象(其实导出的对象应该是这个{a:"aaa",sum:function(){}}  )进行解构赋值。所以我们可以在b.js中拿到a.js中的变量a的值,以及函数sum。**并且他们的变量名和函数名还没变  **
//接收方式二
import  任意变量名  from("a.js的路径");//接收方式二,是最容易陷入误区的情况,可能大多数人都认为这个任意变量名接收的是那个导出的对象{a:"aaa",sum:function(){}} ,其实不然,他这种情况下,传递的恰恰是默认导出的东西。比如说这里:任意变量名="bbb" 我觉得这是特别容易陷入误区的,因为CommonJS其实接收方式二正好是接收整个对象。
//接收方式三
通过上面两种方式我们不禁产生疑问:难道我们不能直接接收这个导出的对象{a:"aaa",sum:function(){}}嘛,只能使用解构赋值的形式来接收嘛。方法总比困难多,我们当然有方法接收这整个对象,再通过对象的属性名/方法名使用特定的变量值/函数。那么我们该怎么接收呢?
import * as info(任意命名的)  from("a.js的路径");那么这个info就是我们导出的对象{a:"aaa",sum:function(){}}使用a的话,就是info.a
  1. 默认导出有什么作用呢?
    默认导出有什么作用呢?我们不禁发问,其实也很明显,不管是解构赋值的形式import { a, sum } from("a.js的路径");,还是import * as info(任意命名的) from("a.js的路径"),他们都无法做到重命名,就是比如说你要使用sum函数,a.js叫sum函数,b.js同样是叫sum函数。而使用默认导出,就可以给这个函数重命名。

ES6模块化的导入

ES6模块化的导入的关键字就是import。其实导入方式我在讲默认导入的时候基本已经讲完了。。。。。

导入方式一:结合解构赋值

import { a, sum } from("a.js的路径");

导入方式二:获取模块的默认导出

import 任意变量名 from("a.js的路径"); 相当于把默认导出的内容赋值给这个变量了
example:

//a.js
export default function (){
}
// b.js
export aaa  from ("a.js")//实际上就是  aaa  = function(){}

导出方式三,获取整体导出的对象

前文我们说过,不管是声明的时候导出export let b = "bbb",还是export {a,sum}。实际上他们都算导出的内容,会一起组成一个对象{b,a,sum}。如果我们要整体接收这个对象就得使用这个第三种接收方式了:

import * as info(任意命名的) from("a.js的路径");
那么这个info就是我们导出的对象