• 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
  • 相关阅读:
    矩阵初等变换与矩阵乘法的联系
    Java之Map、三种Map遍历方式、HashMap、TreeMap、IO流、Properties、反射、获取类对象的三种方式、注解、元注解、工厂模式、装饰器
    Java面试题以及答案(六)Jvm
    ExtJS - UI组件 - MessageBox
    孔乙己脱不下的长衫:人工智能对学历的看法
    数值分析思考题(钟尔杰版)参考解答——第六章
    neo4j
    每日复盘-202406019
    模糊神经网络应用实例,神经网络和模糊控制
    (七)笔记.net core学习之反射、加载dll、读取moudle、类、方法、特性
  • 原文地址:https://blog.csdn.net/ScottePerk/article/details/126874329