ES6学习(五)

文章目录

  • [Module 语法](#Module 语法)
    • [1.1 痛点介绍](#1.1 痛点介绍)
      • [(1) 异步加载](#(1) 异步加载)
      • [(2) 私密](#(2) 私密)
      • [(3) 重名](#(3) 重名)
      • [(4) 依赖](#(4) 依赖)
    • [1.2 解决方法](#1.2 解决方法)
      • [(1) 解决异步加载问题](#(1) 解决异步加载问题)
      • [(2) 解决私密问题](#(2) 解决私密问题)
      • [(3) 重名解决方法](#(3) 重名解决方法)
      • [(4) 解决依赖问题](#(4) 解决依赖问题)
    • [1.3 模块化使用案例](#1.3 模块化使用案例)

Module 语法

之前js 出现的某些痛点:

  1. 在script 中引入的变量名不可以重复,不然后面的变量会将前面的数据覆盖掉;

1.1 痛点介绍

(1) 异步加载

我们之前学习的都是将 虽然写在html 标签之前,但是却能推后执行。

javascript 复制代码
<script src="1.js" defer></script>
// <script src="1.js" async></script>
  1. 使用async 时,js 代码加载完毕但是DOM还未渲染完全就会出现访问时找不到节点的问题;
  2. defer 则是等到DOM 全部都渲染完毕之后再进行js 代码的执行,所以比较来说更靠谱一点。

(2) 私密

一般情况下,我们在声明变量或者函数时使用 _ 表示该变量或者函数是私密的。

(3) 重名

之前js 痛点:

在引入的文件中出现相同名称的变量或者函数,在调用时后者会将前者覆盖掉。

(4) 依赖

现有1.js, 2.js, 3.js 三个文件,其中3.js 调用前两个文件中的方法,此时就需要将3.js 放在后面,此时出现的情况叫做依赖。

1.2 解决方法

以上四个痛点模块化都能解决!

(1) 解决异步加载问题

javascript 复制代码
<script src="1.js" type="module"></script>

关键是使用了 type="module"

(2) 解决私密问题

使用了 type="module" 之后就做到了私密不漏,并且我们此时也无法访问文件内部。

所以此时我们需要这样书写代码:

将访问其他js 文件的script 部分添加 type="module" ;然后在其中导入需要的方法;在需要的文件中导出暴露需要的方法。

导入:

// 导入1.js 中的方法

import 方法名称 from "地址"

(如果是同目录下文件那就必须要有 " ./ ")

导出方法名称可以随便写

导出:

// 导出方法

export default 方法名称

导出名称必须对应导出文件中的方法名称

defalut 只能定义一次,如果要导出多个方法,需要将方法定义到对象中,最后导出对象就可以

(3) 重名解决方法

导入的文件中可能出现方法名称相同的问题,此时我们只需要定义不同导出对象名称,通过对象.方法 进行调用就

javascript 复制代码
import obj1 from './1.js'
import obj2 from './2.js'
console.log(obj1.test,obj2.test)

(4) 解决依赖问题

另外一种导出 / 导入方法:

// 导出

export{

Al,

A2,

test

}
// 导入

import {A1, A2. test as testA} from './1.js'

此时导入导出函数名称必须相同

这种方法使得我们可以按需导入,不要的部分可以不导入

出现下面的情况时,我们可以使用 as

as 表示重命名

另外,在创建方法时也可以直接导出

导入的第二种写法:

// import * as obj1 from './1.js'

// import * as obj2 from './2.js'

这种方式可以将1.js / 2.js 文件中所有暴露出来的方法都导入进来!

第三种导入 / 导出规范:

这种方法是将前两种方法组合在一起了,

// 导出

export default 方法名称
// 导入

import testA,{A1,A2} from './1.js'

默认导出方式可以任意起名字,但是第二种方法只能使用原方法名称。

1.3 模块化使用案例

模块化使用案例前身

上面链接是学习class 继承时的案例,现在可以使用模块化规范把代码修改的更加简洁!

对原js 代码添加type 属性:

javascript 复制代码
<script type="module">
        import CreateBox from './03-createBoxForModuleTest.js'
        import CreateImgBox from './04-createImgBox.js'
        ......
    </script>

创建CreateBox.js:

javascript 复制代码
class CreateBox {
    constructor(select, data) {
        this.ele = document.querySelector(select);
        this.title = data.title
        this.list = data.list
        this.render()
    }
    render() {
        let oh3 = this.ele.querySelector("h3")
        let oul = this.ele.querySelector("ul")
        oh3.innerHTML = this.title
        oul.innerHTML = this.list.map(item => `<li>${item}</li>`).join("")
    }
}
export {
	CreateBox
}

创建CreateImgBox.js:

javascript 复制代码
import {CreateBox} from './03-createBox.js'
class CreateImgBox extends CreateBox{
    constructor(select, data) {
        super(select, data)
        this.imgUrl = data.url
        this.render()
    }
    render() {
        super.render()
        let oimg = this.ele.querySelector("img")
        oimg.src = this.imgUrl
    }
}
export default CreateImgBox

三种导入导出方式需要配对着使用,不能混乱着使用!!!

相关推荐
Rain5095 分钟前
谁动了我的 URL?——记一次微前端“灵异 Bug“的排查实录
前端·vue.js·人工智能·前端框架·bug·ai编程
是隼人9 分钟前
buuctf-pwn PWN4(双引号的转义缺陷)题解(学习过程持续更新)
c语言·学习·安全·pwn入门·ctf入门
蒸蒸yyyyzwd12 分钟前
CPP选手秋招准备学习笔记day25
笔记·学习
小白说大模型20 分钟前
Hermes 全配置指南:从裸版到 AI Agent 天花板
大数据·人工智能·学习·算法·机器学习·数据挖掘
bjzhang7528 分钟前
使用HTML+CSS美化上传进度条展示
前端·css·html
何以解忧,唯有..34 分钟前
Vue 3 响应式核心:ref() 与 reactive() 的深入解析与实战
前端·javascript·vue.js
晴天1638 分钟前
Chrome DevTools Protocol(CDP)分享-Day36
前端·chrome·chrome devtools
风骏时光牛马39 分钟前
程序员的职场成长:技术之外,更要修炼底层思考力
前端
YWL41 分钟前
CSS变量与预处理器
前端·css
m4Rk_43 分钟前
【论文阅读】Agent 记忆机制(60):MemInsight——让 LLM 自动为历史记忆生成语义索引
论文阅读·人工智能·学习·开源·github