ES6之模块化

125 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第19天,点击查看活动详情

什么是模块化

由于前端代码规模逐渐庞大,代码逻辑逐渐复杂,模块化概念逐渐进入前端工程中。
通过script标签引入代码块的方式会造成一个很大的问题就是变量污染,所以在ES5标准中会采取AMD、CMD来实现前端的模块化,比较典型的框架就是sea.js以及require.js
ES6标准出现后,提供了自己的模块化方式,如果使用ES6标准中的模块化工具,必须在script标签里声明type='module',代码如下:

<script type='module'></script>

导入导出基本使用

在ES6标准中导出用关键字export或者export default,后者是默认导出,导入用import...from...,代码如下:
a.js:

image.png
上面的代码a模块导出了变量a同时obj被默认导出了,因为使用了export default
注意:
export 导出是可以导出多个的,export default 在每个模块中只能导出一个index.html:

image.png
这里需要注意:
通过export导出的需要大括号{}解构变量,如代码中的{a},然而通过export default导出的可以自定义变量来接受参数,如代码中的B变量对应的就是导出的对象obj

导入导出变式写法

除了上述的模块的基本写法之外,导入导出还有很多变式写法,在导出的过程中可以导出多个,并且可以通过as来默认导出。如下:
a.js:

image.png

index.html:
image.png 上述代码里导出了3个变量,其中,a,b直接用export导出的,而obj使用as default默认导出的。
然后index.html接受变量时,用{}接受的是export出来的变量,而默认导出的变量是直接用一个变量接受的。
同样在导入导出时都可以使用‘as’关键字来起别名,如下:
a.js:

image.png

index.html: image.png
上述代码中,a变量以c变量的名称导出,obj依旧是默认导出,同时导入的过程中将c起别名来导入,再倒入过程中也可以通过通配符来将所有导出全部获取,如下:
index.html:

image.png
*通配符获取的是a.js里面导出的所有变量,包含export的和export default的。

按需导入

在使用ES6模块化导入模块的时候,会发现在页面加载的时候就会加载导入的模块文件,很多情况下需要延迟导入,但需要加载的时候再加载对应的模块来节约性能。这时可以通过import()函数来实现。

image.png import()函数会返还一个promise对象,所以可以调取then方法通过回调拿到导出的结果,同样可以通过asyncawait改造上述代码写法:

image.png