• ES模块化的导入和导出


    我们定义两个文件aaa.js和bbb.js。
    aaa.js:

    let name="Tom";
    let age=20;
    console.log("name:"+name+" age:"+age+" in aaa.js")
    
    • 1
    • 2
    • 3

    bbb.js:

    let name="Jack";
    let age=22;
    console.log("name:"+name+" age:"+age+" in bbb.js")
    
    • 1
    • 2
    • 3

    然后我们在html里面引入这两个js文件。

        <script src="aaa.js"></script>
        <script src="bbb.js"></script>
    
    • 1
    • 2

    很显然,浏览器会直接报错,觉得你重复定义变量。

    在这里插入图片描述
    这时候,只需要在引入js的时候添加type属性,并且设置类型为module就可以解决变量重复的问题了。
    浏览器认为你是两个模块的变量,是互相独立的。这就是ES6提供的模块化支持。

        <script src="aaa.js" type="module"></script>
        <script src="bbb.js" type="module"></script>
    
    • 1
    • 2

    这时候我们写一个ccc.js。并且在html中引入。

    console.log("name:"+name)
    console.log("age:"+age)
    console.log(sum(1,2))
    
    • 1
    • 2
    • 3

    aaa.js添加了sum方法

    let name="Tom";
    let age=20;
    function sum(a,b) {
        return a+b
    }
    console.log("name:"+name+" age:"+age+" in aaa.js")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
        <script src="aaa.js" type="module"></script>
        <script src="bbb.js" type="module"></script>
        <script src="ccc.js" type="module"></script>
    
    • 1
    • 2
    • 3

    这里age报错了,说age没有定义。因为都设置type为module,别的js文件定义的内容就不能访问到了。所以报未定义。
    但这里还有一个问题,name应该也访问不到,为什么没有先报错?这是因为window对象也有一个变量叫name,直接引用window的name属性了。所以变量最好不要取name这个名字。
    在这里插入图片描述

    那么我又想用这么办呢?这时候就需要导出给别的文件用。
    只需要使用export关键字把需要暴露的变量或者方法导出提供给别的js使用就行了。

    let name="Tom";
    let age=20;
    function sum(a,b) {
        return a+b
    }
    console.log("name:"+name+" age:"+age+" in aaa.js")
    
    export {
        sum,name,age
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    别的js文件在使用导出的变量的时候要先导入,这样就同时解决了命名冲突和不能引用别的模块内容的问题。

    import {age} from "./aaa.js";
    import {name} from "./aaa.js";
    import {sum} from "./aaa.js";
    console.log("name:"+name)
    console.log("age:"+age)
    console.log(sum(1,2))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    导出的多种方式

    1.导出为对象。
    一个个导出,比较麻烦。

    export {
        sum,name,age
    }
    
    • 1
    • 2
    • 3

    2.导出单个变量
    这种好处是可以在定义好的变量前加一个export关键字就可以了。

    export var isChange=true
    
    • 1

    3.导出方法

    export function foo(a) {
        console.log(a)
    }
    
    • 1
    • 2
    • 3

    4.导出类

    export class Person{
       constructor(name,age) {
          this.name=name
           this.age=age
       }
    
       run(){
           console.log(this.name+"在奔跑")
       }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    5.通配符导入
    前面都是导出,这里讲一个导入,其实是导出的一个补充。
    定义的导出可能有很多,一个个导入不太方便,可以使用 3

    import * as data from "./aaa.js"
    console.log(data.name);
    
    • 1
    • 2
  • 相关阅读:
    WinHex(三)
    AI人工智能电话机器人应用市场分析
    Lumiprobe非荧光叠丨氮化物研究丨3-叠丨氮丙醇
    RK356X/RK3588构建Ubuntu20.04根文件系统
    STM32网口学习
    干货,分布式数据库在金融核心场景的落地实践|腾讯云数据库
    界面控件DevExpress WPF Splash Screen,让应用启动画面更酷炫!
    深度讲解指针的笔试题目
    对批量文件重命名
    ros2学习笔记:shell环境变量脚本setup.bash[-z][-n][-f]参数作用
  • 原文地址:https://blog.csdn.net/ScottePerk/article/details/126874329