es6 Module语法

Module语法

1.异步加载
2.私密不漏
3.重名不怕
4.依赖不乱
5.两种写法
一、异步加载
我们先生成三个JS文件方便演示,在第一个JS文件中,我们写入了一个需要访问dom节点的变量。
如果在文件头引入JS文件,此时dom还没有加载,直接报错,在Module语法出现之前有三个解决办法
在这里插入图片描述
在这里插入图片描述
module写法

    <script src="01.js" type="module"></script> 

在引入加上**type=“module”**直接变成模块化加载,类似于defer的异步加载形式,在dom加载完成后才会执行js

二、私密不漏

function A1(){
    console.log("A1")
}
function a1(){
    console.log("a1")
}

在01.js中定义两个函数,假如A1是我们希望公开的函数,而a1则是我们只想在01.js内部使用的函数。如果不加type=“module”。在html文件中,两个函数都可访问得到,这样我们的私密函数a1也就泄露出去了。
在这里插入图片描述
而使用module模块化引入,也就是加上type=“module”,则两个函数都访问不到,
在这里插入图片描述
所以正确的module写法是导入和导出,在需要使用的文件中导入,在需要到处的内容进行导出
在01.js中

function A1(){
    console.log("A1")
}
function a1(){
    console.log("a1")
}
// 导出方法
export default A1

在html中

    <script type="module">
    	// 导入方法
        import A1 from "./01.js"
        A1() // A1
        a1() // 报错
    </script>

这样就实现私密不漏,导出多个方法

function A1(){
    console.log("A1")
}
function a1(){
    console.log("a1")
}
// 导出方法
export default {
    A1,
    a1
}
    <script type="module">
        import obj from "./01.js"
        obj.A1() // A1
        obj.a1() // a1
    </script>

三、重名不怕
在传统的写法中,引入两个js文件,但是这个文件中存在重名的方法,那么一定会有一个方法被覆盖掉,但是使用module则不要担心。
01.js

function A1(){
    console.log("A1")
}
function a1(){
    console.log("a1")
}

function text(){
    console.log("01.js---text")
}

// 导出方法
export default {
    A1,
    a1,
    text
}

02.js

function text(){
    console.log("02.js---text")
}
function B1(){
    console.log("B1")
}
export default {
    text,
    B1
}

html

 <script type="module">
        import obj1 from "./01.js"
        import obj2 from "./02.js"

        obj1.A1() // A1
        obj1.a1() // a1
        obj1.text() // 01.js---text
        obj2.text() // 02.js---text
        obj2.B1() // B1
    </script>

如此就实现了重名不怕

四、依赖不乱
我们在03.js中写入一下内容

A1()
B1()
export default {}

然后在html中一起导入

  		import obj1 from "./01.js"
        import obj2 from "./02.js"
        import obj3 from "./03.js"

你觉得03.js中的内容会成功执行吗,答案是一定的,在03.js中A1和B1是未定义的,所以会报错。
我们在03.js之中导入

import obj1 from "./01.js"
import obj2 from "./02.js"
obj1.A1()
obj2.B1()
export default {}

最后的执行结果是
在这里插入图片描述

这里可以看出,传统的引入相当于把几个文件合并成一个文件,而module模块化的写法,任然是把文件之间隔离开的,你要用就必须先导入,而且导入的东西还必须是目标文件导出的内容。如此逻辑清晰,依赖不乱。

五、两种写法
刚刚所演示的导出导入,在导出端,要么只导出一个方法,要么就是导出多个方法的对象,而导入端对于多个方法只能全盘接收,通过对象的方式点点调用。所以es6提供了第二种导入方法,可以实现按需导入。

function A1(){
    console.log("A1")
}
function a1(){
    console.log("a1")
}

function text(){
    console.log("01.js---text")
}

// 导出方法
export  {
    A1,
    text
}

去掉default直接大括号导出

        import {text} from "./01.js"
        text() // 01.js---text

使用大括号导入,需要什么用什么,但是要注意方法名字必须相同。
你肯定想问,这样重名怎么解决,es6 提供了一个 as 写法,即取别名。

        import {text as text1,A1} from "./01.js"
        import {text as text2,B1} from "./02.js"
        // import obj3 from "./03.js"
        text1() // 01.js---text
        A1() // A1
        text2() // 02.js---text
        B1() // B1

扩展一下as,可以使用*号来代替所以导出的方法,在用as取别名,这样就实现了用第二种写法达到第一种的感觉。

        import * as obj from "./01.js"
        import {text as text2,B1} from "./02.js"
        // import obj3 from "./03.js"
        obj.text() // 01.js---text
        obj.A1() // A1
        text2() // 02.js---text
        B1() // B1

第二种写法导出时还等同于直接在方法前面加export

function text(){
    console.log("02.js---text")
}
export function B1(){
    console.log("B1")
}
export  {
    text,
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值