前端开发实战基础——模块

文章目录

    • 概要
      • 模块标识符
      • 模块依赖
      • 模块加载
      • 入口
    • CommonJS
      • 语法
      • 单例
    • AMD
      • 语法
    • UMD
      • 核心语法
    • ES6模块化
      • 模块标签及定义
      • 模块导出和导入
        • 命名导出和导入
        • 默认导出和导入
        • 命名导出和默认导出混用
      • 模块行为
    • 小结

概要

模块化,就是将代码拆分成独立的块,各自在代码块中实现各自逻辑,同时自行决定引入外部代码,和决定对外暴露一些可以对外提供的特性功能

模块化包含下面特征:标识符、依赖、加载、入口等,下面具体说明一下

模块标识符

模块化标识符是所有模块通用的概念。模块系统可以通过一个标识符来代表一个模块,然后在需要调用的地方,通过这个标识符来引用对应的模块

标识符可以是一个字符串,在原生的实现的模块系统中可能是模块文件的实际路径。有些模块化系统支持明确声明模块的标识。不管哪种方式,完备的模块化系统一定不存在模块标识符冲突问题

模块依赖

模块化系统核心是管理依赖指定依赖的模块与周围的环境达成一种契约。本地模块向模块化系统声明一处外部模块(依赖),这些外部模块对于当前模块的运行是必需的。模块系统会检查这些依赖,进而保证外部模块能够被正确加载到本地模块,完成初始化。

每个模块都会有一个唯一的标识符关联,用于检索模块。这个标识符通常是模块本身内部声明的命名空间路径的字符串或者在某些系统是文件的路径

模块加载

加载模块的概念是由模块依赖产生的。当一个外部模块被指定为依赖的时候,本地模块在准备执行时,外部模块已经完成初始化,等着被执行。
在浏览器中,加载模块涉及其中代码执行,但必须在所有依赖都加载并执行之后。

入口

相互依赖的模块必须指定一个入口,这个也是代码执行的起点。因为JavaScript是顺序执行的,并且是单线程,所有代码必须有执行的起点

在ES6之前,出现需要的模块化解决方案,现在具体说明一下

CommonJS

CommonJS 规范,用于Node.js 服务端,实现模块化代码组织,其语法不能直接在浏览器运行。

语法

CommonJS 模块定义需要使用require()指定依赖,而使用exports 对象定义自己公共的API

请求模块也会加载相应的模块,而把模块赋值给变量也非常常见,但赋值不是必须的,调用require() 意味着模块会原封不动的加载进来

下面代码展示

//moduleA 文件
var moduleB = require("./moduleB");
module.exports = {
stuff: moduleB.doStuff;
}

//moduleC 引入moduleA 
var moduleA = require("./moduleA");
moduleA.stuff;

moduleA 通过使用模块定义相对路径指定自己对moduleB的依赖

在 moudleC 文件,通过require 引入 moduleA ,并给它起一个别名 moduleA。直接通过moduleA.stuff 便可以访问 moudleA 的staff.

moudle.exports 对象非常灵活,有多种使用方式。如果只想导出一个实体,可以直接module.exports 赋值

在这里插入图片描述
通过上面的语法,整个模块就导出一个字符串,可以通过下面的方式使用:
在这里插入图片描述

单例

模块加载是单例的,无论在一个模块require() 中被引用多少次模块只会被加载一次,模块第一次请求加载后会被缓存,再次请求模块,都只是取得模块的缓存,如下面的代码所示
在这里插入图片描述

AMD

CommonJS 以服务端为目标环境,能够同步地一次性所有依赖都加载到内存,无需考虑异步加载的问题。

异步加载模块定义,AMD( asynchronous Module Definition) 则以浏览器为执行环境,需要考虑网络延迟问题,因此实现了按需依次加载依赖,并在加载完成后,立即执行依赖模块

ADM模块实现的核心是用函数包装模块定义。这样防止声明全局变量,并允许加载器库控制何时加载

包装模块函数是全局的define 的参数,它是由AMD加载器库的实现定义的

语法

AMD 模块可以使用字符串指定自己的依赖,代码示例如下

/ID为’ moduleA'的模块定义。moduleA依赖moduleB
//moduleB会异步加载
define('moduleA',['moduleB'].function(moduleB) [
	return (
		stuff: moduleB.doStuff();
	);
});

AMD 也支持require 和 exports 对象,通过他们可以在AMD模块工厂函数内部定义CommonJS 风格的模块。
在这里插入图片描述

动态依赖也是通过这种方式支持的:
在这里插入图片描述

UMD

为了统一CommonJs 和 AMD 生态系统,通用模块定义(UMD,universal module definition)规范应运而生。

UMD 创建了两个系统都可以使用的模块代码,本质上UMD会检测依赖使用了哪种系统,然后进行适配,并把所有的逻辑包装在一个立即调用的函数表达式中。

核心语法

在这里插入图片描述

ES6模块化

ES6 引入了模块规范,使得浏览器支持原生的模块化加载。
下面对 ES6模块规范进行说明

模块标签及定义

浏览器中,我们可以通过在 script 标签中 加入 type=“module” 的属性,告诉浏览器这一块代码应该作为哦模块执行,而不是作为传统的脚本执行。模块可以嵌入网页中,也可以作为外部文件引入。

<script type="module">
// 模块代码
</script>
<script type="module src="path/to/myModule,js"></script>

与传统的脚本不同,所有模块都会想 script defer 加载的 脚本一样按顺序执行。 当解析到 script type="moudle" 标签后会立即下载模块文件,但执行会延迟到文档解析完成,因此不会阻塞文档解析

下面演示模块执行顺序
在这里插入图片描述

模块导出和导入

ES6模块导出和CommonJs非常相似,通过export 关键字导出模块,ES6支持两种导出,命名导出和默认导出,不同的导出方式的引入方式不同。

命名导出和导入

命名导出,可以定义一个变量,然后通过export 将变量导出,例子如下
在这里插入图片描述
或者下面的导出也是可以的
在这里插入图片描述

导入方式如下:
通过命名导出的,要使用 import 关键字 和{ }

import {foo} from "./moudleA"
默认导出和导入

默认导出如下:
使用export default 导出foo

const foo = foo'
export default foo

或者使用下面的方式也是可以的

const foo = 'foo'
//等同于export default foo:
export {foo as default };

导入方式如下

import foo from "./foo.js";
//或者使用 as
import {default as foo} from "./foo.js"

如果一个模块有多个命名空间
比如以下

const foo="foo".bar = "bar",baz = "baz"
export {foo,bar,baz}

我们可以使用 * 一次性全部导入,然后通过as 指定一个别名,通过别名访问对应的命名空间。

import * as Foo from "./foo.js"
console.log(Foo.foo)//"foo"
命名导出和默认导出混用

如果一个模块使用了命名空间和默认导出
如下面的示例

export const foo = "foo"
export default const baz ="baz"

导出

import baz,{foo} from "./foo.js"

模块行为

ES6借鉴了 CommonJS 和AMD 很多优秀的特性,下面简单列举一些

  • 模块代码只在加载后执行
  • 模块只加载一次
  • 模块式单例的
  • 模块可以定义公共接口,其他模块可以基于这个公共接口观察和交互
  • 模块可以请求加载其他模块
  • 支持循环依赖

除此之外,ES6还增加自己的特性

  • ES6模块在严格模式执行
  • ES6不共享命名空间
  • 模块顶级this 是undefined
  • 模块定义的var 不会添加到window
  • ES6模块式异步加载和执行的

小结

  • CommonJS 用于Node 服务端模块化,采取module.exports 对象 + require 导出导入
  • AMD 异步加载模块化,可以用于浏览器解决脚本异步加载,通过全局的define 函数定义模块
  • UMD 实现了AMD 和CommonJs的集成,本质上也是检测并适配。
  • ES6 增加了模块化方案,采用export + import 导出导入,还可以支持默认导出

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

小白初探|神经网络与深度学习

一、学习背景 由于工作的原因&#xff0c;需要开展人工智能相关的研究&#xff0c;虽然不用参与实际研发&#xff0c;但在项目实施过程中发现&#xff0c;人工智能的项目和普通程序开发项目不一样&#xff0c;门槛比较高&#xff0c;没有相关基础没法搞清楚人力、财力如何投入&…

Linux实验记录:使用Apache的虚拟主机功能

前言&#xff1a; 本文是一篇关于Linux系统初学者的实验记录。 参考书籍&#xff1a;《Linux就该这么学》 实验环境&#xff1a; VmwareWorkStation 17——虚拟机软件 RedHatEnterpriseLinux[RHEL]8——红帽操作系统 正文&#xff1a; 目录 前言&#xff1a; 正文&…

每日一道Java面试题:说一说Java中的泛型?

写在开头 今天的每日一道Java面试题聊的是Java中的泛型&#xff0c;泛型在面试的时候偶尔会被提及&#xff0c;频率不是特别高&#xff0c;但在日后的开发工作中&#xff0c;却是是个高频词汇&#xff0c;因此&#xff0c;我们有必要去认真的学习它。 泛型的定义 什么是泛型…

2024年1月的论文推荐

又到月底了&#xff0c;在月初推荐论文的基础上又整理了10篇推荐阅读的论文 1、MosaicBERT https://mosaicbert.github.io/ 一种用于快速预训练的双向编码器。MosaicBERT是针对快速预训练优化的自定义BERT架构。主要架构修改:FlashAttention, ALiBi&#xff0c;门控线性单元…

(八)MySQL事务和SQL优化

事务&#xff08;Transaction&#xff09;&#xff1a; 是数据库内最小且不可再分的单元。通常一个事务对应一个完整的业务(例如银行账户转账业务&#xff0c;该业务就是一个最小的工作单元)。一个完整的业务由批量的DML语句&#xff08;INSERT 、UPDATE、DELETE&#xff09;共…

pinctrl子系统与gpio子系统实验-通过应用程序测试Led驱动程序

一. 简介 前面几篇文章基本完成了 Led驱动代码&#xff0c;前面通过加载驱动模块也测试了 驱动程序。 这里通过运行应用程序&#xff0c;通过应用程序调用 Led驱动程序&#xff0c;从而驱动 打开或者关闭 Led灯。 二. 通过应用程序测试Led驱动程序 1. 驱动代码实现 gpiole…

【Qt】—— 项⽬⽂件解析

目录 &#xff08;一&#xff09;.pro⽂件解析 &#xff08;二&#xff09;widget.h⽂件解析 &#xff08;三&#xff09;main.cpp⽂件解析 &#xff08;四&#xff09;widget.cpp⽂件解析 &#xff08;五&#xff09;widget.ui⽂件解析 &#xff08;一&#xff09;.pro⽂…

Sg5032can(晶体振荡器spxo)规格书

SG5032CAN是爱普生推出的一款小体积尺寸5.0x3.2mm石英晶体振蒎器&#xff0c;四脚贴片晶振&#xff0c;输出频率范围为4MHz~72MHz,电源电压1.8V ~ 3.3V&#xff0c;支持CMOS输出&#xff0c;具有超小型&#xff0c;轻薄型&#xff0c;高精度&#xff0c;高性能&#xff0c;高品…

(二)hadoop搭建

1. 下载 访问https://hadoop.apache.org/releases.html查看hadoop最新下载地址 wget https://dlcdn.apache.org/hadoop/common/hadoop-3.3.4/hadoop-3.3.4.tar.gz 2.解压 tar zxvf hadoop-3.3.4.tar.gz mv hadoop-3.3.4 /usr/local 3.配置环境变量&#xff08;新建.sh文件&…

【网站项目】066农家乐信息平台

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

面向对象(基础)---面向对象编程概述、Java语言的基本元素:类和对象

学习面向对象内容的三条主线&#xff1a; ①Java类及类的成员&#xff1a;&#xff08;重点&#xff09;属性、方法、构造器&#xff1b;&#xff08;熟悉&#xff09;代码块、内部类 ②面向对象的特征&#xff1a;封装、继承、多态、&#xff08;抽象&#xff09; ③其他关…

stm32--simulink开发之--timer的学习,硬件输入中断,触发事件,STM32通用定时器之输出比较模式与PWM模式(重要理解)

下面三个模块&#xff0c;一个比一个高级&#xff0c;当然使用是越来越简单 STM32F4xx系列控制器有2个高级控制定时器、10个通用定时器和2个基本定时器(推荐学习) 1&#xff0c;第一个模块&#xff1a;Timer 浅层理解&#xff1a;计数&#xff0c;不停的触发 Starts timer co…

Servlet简述

Servlet是动态web资源开发技术&#xff0c;其实就是一个接口&#xff0c;将来定义Servlet实现类时&#xff0c;都必须实现该接口&#xff0c;并让web服务器运行Servlet 1.快速入门 使用注释配置访问路径在Servlet3.0之后应用&#xff0c;在此之前都是使用xml配置文件来配置的。…

零基础怎么学鸿蒙开发?

对于零基础的学习者来说&#xff0c;掌握鸿蒙开发不仅是迈向新技术的第一步&#xff0c;更是开拓职业道路的重要机遇。随着鸿蒙系统在各行各业的应用逐渐扩展&#xff0c;对于掌握这一项技术的开发人员需求也随之增长。下文将为大家提供针对零基础学习鸿蒙开发的逻辑&#xff0…

粒子群优化算法

PSO算法 粒子群算法&#xff08;Particle,Swarm Optimization,PSO&#xff09;由Kennedy和Eberhart于1995年提出&#xff0c;算法模仿鸟群觅食行为对优化问题进行求解。 粒子群算法中每个粒子包含位置和速度两个属性&#xff0c;其中&#xff0c;位置代表了待求问题的一个候选…

2024年最强网络安全学习路线,详细到直接上清华的教材!

关键词&#xff1a;网络安全入门、渗透测试学习、零基础学安全、网络安全学习路线 首先咱们聊聊&#xff0c;学习网络安全方向通常会有哪些问题 前排提示&#xff1a;文末有CSDN官方认证Python入门资料包&#xff01; 1、打基础时间太长 学基础花费很长时间&#xff0c;光语言…

mysql 慢查询调优实战

目录 异常现象&#xff1a;进行复现&#xff1a;寻找原因&#xff1a;解决办法&#xff1a;办法一&#xff1a;指定执行索引办法二&#xff1a;先按二级索引里字段排序&#xff0c;再按id排序办法三&#xff1a;取消排序 最终方案&#xff1a;复盘&#xff1a; 异常现象&#x…

基于springboot+vue的校园赛事资讯网站(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

搜维尔科技:【简报】元宇宙数字人赛道,优秀作品《星云时报》赏析

AI 对人们来说是一种新产业&#xff0c;而人们对于它未来会面临的议题仍有许多疑虑&#xff0c;因此我们用新闻报导的方式列举一些有趣且具有可能性的标题&#xff0c;希望能让 大家了解 AI 在未来可能会带来什么问题&#xff0c;以及我们应该采取的态度。 学校&#xff1a; 新…

C++(17)——list的模拟实现

前面的文章中&#xff0c;介绍了&#xff0c;的模拟实现&#xff0c;本篇文章将介绍对于的模拟实现。 目录 1. list的基本结构&#xff1a; 2. list功能实现&#xff1a;尾部插入元素&#xff1a; 3. list迭代器的实现&#xff1a; 4. list功能实现&#xff1a;在任意位置前…