• 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
  • 相关阅读:
    前端传String字符串 后端使用enun枚举类出现错误
    Redis数据类型–Geospatial 地理空间
    答对这3个面试问题,薪资直涨20K
    mysql value 和values的区别
    小索引大力量,记一次explain的性能优化经历
    React封装自定义表单校验方法
    Java虚拟机:Java模块化系统
    2003. 每棵子树内缺失的最小基因值 DFS
    第5期ThreadX视频教程:单片机动态APP加载MPU玩法,隔离应用和系统,APP死机了系统也不会挂(2022-05-15)
    《CPU通识课》读书笔记
  • 原文地址:https://blog.csdn.net/ScottePerk/article/details/126874329