前端模块化

news2024/11/28 10:44:41

什么是模块化

  1. 事实上模块化开发最终目的是将程序划分成一个个小的结构
  2. 在这个结构中编写属于自己的逻辑代码,有自己的作用域,不会影响到其他的结构
  3. 这个结构可以将自己希望暴露的变量、函数、对象等导出给其他结构使用。
  4. 可以通过某种方式,导入另外结构中的变量、函数、对象等;

组件化和模块化的特点

  1. 低耦合
  2. 热插拔,需要的时候使用,不需要的时候去掉

模块化特点

  1. 独立性
    可以针对一个模块单独进行设计、研发,相对工作量和难度变小。
  2. 复用性
    一些通用模块(例如登录或注册)可以被重复使用,而不用每次重新开发。
  3. 解偶性
    模块与模块之间,将相互影响降到最低,使得更换、升级或添加某个模块,不影响其他模块的工作。
  4. 灵活性
    通过选择和组合不同的模块,可以快速构建一个 新的产品。

目前流行的模块化规范

AMD

  1. AMD主要是应用于浏览器的一种代码规范。
  2. 它采用的是异步加载模块。
  3. 事实上AMD的规范还要早于CommonJS,但是CommonJS目前依然在被使用,而AMD使用的较少了;
  4. AMD实现的比较常用的库是require.js和curl.js

CMD

  1. CMD规范也是应用于浏览器的一种模块化规范:
  2. 它也采用了异步加载模块,但是目前CMD使用也非常少了;
  3. CMD也有自己比较优秀的实现方案: SeaJS

CommonJS

介绍
CommonJS是一个规范,最初提出来是在浏览器以外的地方使用

  1. Node是CommonJS在服务器端一个具有代表性的实现,Node中对CommonJS进行了支持和实现,Node中每一个js文件都是一个单独的模块。
  2. Browserify是CommonJS在浏览器中的一种实现。
  3. webpack打包工具具备对CommonJS的支持和转换。

使用

  1. exports和module.exports负责对模块中的内容进行导出
  2. require函数可以帮助我们导入其他模块中的内容

require 加载标识符原则

在这里插入图片描述

exports和module.exports

  1. CommonJS是没有module.exports的概念的
  2. 但是为了实现模块导出,Node中使用的是Module类,每一个模块都是Module类的一个实例,也就是module
  3. 在Node中真正用于导出的根本不是exports,而是module.exports;
  4. exports是module.exports对象地址的一个引用

模块的加载过程

  1. 模块在被第一次引用时,模块中的js代码会被运行一次
  2. 模块被多次引用时,会缓存,最终只加载一次,因为每个模块对象module都有一个属性:loaded,为false表示还没有加载,为true表示已经加载
  3. 如果有循环引用,Node采用的是深度优先算法。

缺点

  1. CommonJS加载模块是同步的
    同步意味着只有等到对应的模块加载完毕,当前模块中的内容才能被运行。
    这个在服务器不会有什么问题,因为服务器加载的js文件都是本地文件,加载速度非常快
  2. 如果他应用于浏览器
    浏览器加载js文件需要先从服务器下载下来,之后再加载运行
    那么采用同步就意味着后续的js代码都无法正常运行,即使是一些简单的DOM操作
  3. 所以在浏览器中,通常不使用CommonJS规范
    当然我们可以用webpack将其转化为浏览器可以直接执行的代码。

ES Module

从 ES6 开始, JavaScript 才真正意义上有自己的模块化规范。
ES6 模块的设计思想是尽量的静态化,使得编译时就能确定模块的依赖关系,以及输入和输出的变量。CommonJS 和 AMD 模块,都只能在运行时确定这些东西。

使用

export负责将模块内的内容导出;
import负责从其他模块导入内容;

  1. export { }导出的成员并不是对象字面量,import { } 导入的时候并不是使用解构语法,都只是固定的语法。
  2. export导出的成员并不是导出成员的值,而是成员的引用关系,所以外部拿到的值会受模块内部值的变化所影响。
  3. 外部导入一个模块中的成员,导入的是一个只读的成员,并不能去修改
  4. 动态导入模块返回的是promise
  5. Node v12 之后的版本,可以通过package.json 中添加type字段为module, 将默认模块系统修改为 ES Module 此时就不需要修改文件扩展名为 .mjs 了

特性

  1. 通过给script标签上一个type=‘module’的属性,就可以在ES Module的标准执行其中的js代码了
    在这里插入图片描述

  2. ES Module自动采用严格模式,忽略 'use strict’

    • 变量必须声明后再使用
    • 函数的参数不能有同名属性,否则报错
    • 不能使用with语句
    • 不能对只读属性赋值,否则报错
    • 不能使用前缀 0 表示八进制数,否则报错
    • 不能删除不可删除的属性,否则报错
    • 不能删除变量delete prop,会报错,只能删除属性delete global[prop]
    • eval不会在它的外层作用域引入变量
    • eval和arguments不能被重新赋值
    • arguments不会自动反映函数参数的变化
    • 不能使用arguments.callee
    • 不能使用arguments.caller
    • 禁止this指向全局对象
    • 不能使用fn.caller和fn.arguments获取函数调用的堆栈
    • 增加了保留字(比如protected、static和interface)
  3. 每个ES Module都是运行在单独的私有作用域中

  4. ES Module是通过 CORS 的方式请求外部JS模块的
    请求的服务端需要支持CORS,否则会报一个跨域的错误,而且在Nerwork中可以看到这样一个请求被浏览器终止了

  5. ES Module会延迟执行脚本,类似于defer的效果

ES Module的解析流程

  1. 阶段一:构建(Construction),根据地址查找js文件,并且下载,将其解析成模块记录(Module Record);
  2. 阶段二:实例化(Instantiation),对模块记录进行实例化,并且分配内存空间,解析模块的导入和导出语句,把模块指向 对应的内存地址。
  3. 阶段三:运行(Evaluation),运行代码,计算值,并且将值填充到内存地址中
    在这里插入图片描述

ES Modules 和 CommonJS的一些区别

  1. 使用语法层面,CommonJs是通过module.exports,exports导出,require导入;ESModule则是export导出,import导入
  2. CommonJs是运行时加载模块,ESModule是在静态编译期间就确定模块的依赖
  3. ESModule在编译期间会将所有import提升到顶部,CommonJs不会提升require
  4. CommonJs导出的是一个值拷贝,会对加载结果进行缓存,一旦内部再修改这个值,则不会同步到外部。ESModule是导出的一个引用,内部修改可以同步到外部
  5. CommonJs中顶层的this指向这个模块本身,而ESModule中顶层this指向undefined
  6. CommonJS加载的是整个模块,将所有的接口全部加载进来,ESModule可以单独加载其中的某个接口

参考文档

https://blog.csdn.net/Lyb__/article/details/109382975?ops_request_misc=&request_id=&biz_id=102&utm_term=web%E5%89%8D%E6%AE%B5%E6%A8%A1%E5%9D%97%E5%8C%96&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-1-109382975.142v73control_1,201v4add_ask,239v2insert_chatgpt&spm=1018.2226.3001.4187

https://blog.csdn.net/qq_39221436/article/details/119531017?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167836248416800184119552%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=167836248416800184119552&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~rank_v31_ecpm-3-119531017-null-null.142v73control_1,201v4add_ask,239v2insert_chatgpt&utm_term=ESMoudle&spm=1018.2226.3001.4187

https://juejin.cn/post/7193887403570888765

https://juejin.cn/post/7053823393539293191
https://blog.csdn.net/weixin_45047039/article/details/109985949

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/524448.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电脑软件:国内最好用解压缩软件 7-Zip 新版本发布

5 月 9 日消息,7-Zip 是一款拥有极高压缩比的的开源压缩软件,支持 LZMA2 等 7 种开源算法,以及支持较广泛的压缩格式 .7z,体积不大(1.5MB)、功能完善,除了默认 UI 不符合国内审美外几乎没什么可…

Oracle数据库安装教程,并实现公网远程连接【内网穿透】

✨ 目录 🎈 前言🎈 1. 数据库搭建🎈 2. 内网穿透🎈 2.1 安装cpolar内网穿透🎈 2.2 创建隧道映射 🎈 3. 公网远程访问🎈 4. 配置固定TCP端口地址🎈 4.1 保留一个固定的公网TCP端口地址…

Java经典笔试题—day08

Java经典笔试题—day08 🔎选择题🔎编程题🥝两种排序方法🥝求最小公倍数 🔎结尾 🔎选择题 (1)下列选项中关于Java中super关键字的说法正确的是() A.super关键字是在子类对象内部指代…

JAVA JDK下载安装手册

JDK的介绍与安装 JDK简介 JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。编写 Java 程序必须使用 JDK,它提供了编译和运行 Java 程序的环境。是整个java开发的核心。 准备JDK 本次使用的是JDK1.8 如下所示: 下载完…

记两道AES-CBC题

文章目录 知识导入(AES-CBC模式)题一(buu [ACTF新生赛2020]crypto-aes 1)题目描述:题目分析:知识导入os.urandom(n)函数比特,字节,二进制数之间的关系AES.new(key,AES.MODE_CBC,iv) 题二(crack AES-CBC IV)…

小黑子—Java从入门到入土过程:第九章-IO流

Java零基础入门9.0 Java系列第九章- IO流1. 初识IO流2. IO流的体系2.1 字节流2.1.1 FileOutputStream 字符串输出流2.1.1 - I 字符串输出流的细节2.1.1 - II FileOutputStream写数据的3种方式2.1.1 -III FileOutputStream写数据的两个小问题 2.1.2 FileInputStream 字符串输入流…

点线面产生局部坐标系以及计算到世界坐标系的旋转矩阵

欢迎关注更多精彩 问题描述 给定点O,线段AB,平面OP,求以OP法向为某一轴,以AB在OP上的投影为另一轴,O为原点的局部坐标系。要求给出X,Y,Z轴的单位向量,以及原点O. 求出转换到世界坐标系的旋转矩阵RT。 如…

ChatGPT的简单了解

ChatGPT 是 InstructGPT 的同级模型,它经过训练可以按照提示中的说明进行操作并提供详细的响应。 InstructGPT论文:https://arxiv.org/pdf/2203.02155.pdf InstructGPT怎么准备和标记数据集:https://harryliu.blog.csdn.net/article/detail…

【连续介质力学】张量的性质2

张量的代数操作 张量的性质 张量迹 Tensor Trace 定义 e ^ i ⨂ e ^ j \hat e_i \bigotimes \hat e_j e^i​⨂e^j​的迹: T r ( e ^ i ⨂ e ^ j ) e ^ i ⋅ e ^ j δ i j Tr(\hat e_i \bigotimes \hat e_j) \hat e_i \cdot \hat e_j \delta_{ij} Tr(e^i​⨂e^j​)e^i​⋅…

总结如何申请注册 GitHub 教师教育优惠 Benefits for Teachers 来免费使用 copilot

目录 1. GitHub 教师教育优惠有什么2. 如何申请教师教育优惠呢2.1 选择学校2.2 更改个人信息2.3 准备证明材料2.4 提交申请2.5 遇到的问题2.5.1 问题 12.5.2 问题 22.5.3 问题 3 3. 申请免费的 GitHub Copilot 学生注册不在此处赘述了,网上有很多教程可以参考。但是…

软件测试面试面对HR提出的问题,怎么回答才不会被面试官“套路”

面试中,如何回答HR提出的问题很大程度上决定了面试能不能成功。 下面是软件测试人员在面试过程中经常被问到的10个问题,告诉你怎么回答才不会被面试官套路...... 请你做一个自我介绍 误区: 一般人回答这个问题过于平常,只说姓…

JVM学习(一)

一、JVM介绍 1.1基本概念 JVM 是可运行 Java 代码的假想计算机 ,包括一套字节码指令集、一组寄存器、一个栈、 一个垃圾回收,堆 和 一个存储方法域。JVM 是运行在操作系统之上的,它与硬件没有直接 的交互。 1.2 运行过程 我们都知道 Java …

1000W用户1Wqps高并发签到系统的架构和实操

说在前面 在尼恩的(50)读者社群中,经常有小伙伴面试的时候,遇到一个一个高并发 架构方面的问题,比如: (1) 高并发秒杀系统如何架构? (2) 高并发签到系统如何架构? (3) 等等等等… 刚…

【C++】函数高级

目录 🍊一.函数的默认参数🍊 1.默认参数的性质 2.函数默认参数的注意事项 🍎二.函数的占位参数🍎 🍏三.函数的重载 🍏 1.重载的性质和条件 (1)修改参数的个数 &#xff…

go语言中文文档 学习笔记(未完)

这里写目录标题 网络编程互联网协议介绍socket编程socket图解TCP编程服务端客户端 UDP编程TCP黏包 http编程WebSocket编程 网络编程 互联网协议介绍 socket编程 socket图解 Socket是应用层与TCP/IP协议族通信的中间软件抽象层。在设计模式中,Socket其实就是一个门…

12.设计模式之门面模式

前言 门面模式,是指提供一个统一的接口去访问多个子系统的多个不同的接口,它为子系统中的一组接口提供一个统一的高层接口。使得子系统更容易使用。日志框架slf4J是门面模式最经典的应用场景。 本节,我们就门面模式,展开详细介绍…

1.setContentView流程分析

1. setContentView初步分析之继承自Activity 我们创建的MainActivity继承自Activity,在代码中使用setContentView(R.layout.activity_main),查看他在Activity中的源码如下: public void setContentView(LayoutRes int layoutResID) {//这里的getWindow方法获取到一个PhoneWind…

什么是好代码/坏代码?给普通人的图解示例

本文翻译自国外论坛 medium,原文地址:https://medium.com/todbotts.triangles/what-is-good-bad-code-an-illustrated-example-for-non-programmers-1222b600a0f0 我曾经在某个地方读到过一句话,基本上有以下内容: 在现代世界中&a…

算法(一)—— 回溯(3)

文章目录 1 78 子集2 90 子集II3 491 递增子序列 子集问题 1 78 子集 如果把 子集问题、组合问题、分割问题都抽象为一棵树的话,那么组合问题和分割问题是收集树的叶子节点,而子集问题是找树的所有节点! 因为需要找到所有的节点&#xff0…

JavaEE(系列一 )-- 计算机是如何进行工作的

目录 1. 操作系统 2. 进程/任务(Process/Task) 2.1 进程 2.2 进程管理 2.2.1 进程的结构体 2.2.2 进程调度 2.3 并行 和 并发 2.4 内存分配 -- 内存管理(Memory Manage) 2.5 进程间通信 3. 线程 1. 操作系统 操作系统是一组做计算机资源管理的软件的…