重学JavaScript核心知识点(二)—— 详解Js中的模块化

news2024/11/26 18:48:06

在这里插入图片描述

详解Js中的模块化

    • 1. 模块化的背景
    • 2. 来看一个例子
    • 3. 优雅的做法 —— 创建模块对象
    • 4. 模块与类(class)
    • 5. 合并模块
    • 6. 动态加载模块

1. 模块化的背景

  • JavaScript 在诞生之初是体积很小的,早期,它们大多被用来执行独立的脚本任务,在我们的Web网页中提供一些交互效果,所以一般不需要多大的脚本。 随着时代的发展,慢慢有了运行大量 JavaScript 脚本的复杂程序,它也不止被运用在客户端了,甚至服务端都能用,比如 Node.js。
  • 所以,近年来的新做法是将 JavaScript 程序拆分为可按需导入的单独模块的机制,Node.js早就支持了,另外js的很多库和框架都开始了模块化的使用,比如:Common.js,Require.js,以及最新的Webpack.js 和 Babel.js。
  • 目前大部分主流浏览器都是支持的,浏览器能够最优化加载模块,使它比使用库更有效率:使用库通常需要做额外的客户端处理。

2. 来看一个例子

  • html 文件
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>模块化</title>
</head>
<body>
    <script type="module">
        import util from './util.js'
        let value = util(10, 20);
        console.log(value );
    </script>
</body>
</html>
  • js文件
// 用来取两者范围内整数随机数的方法
export default function getRandom(a, b) {
    let max = Math.max(a, b)
    let min = Math.min(a, b)
    return parseInt(Math.random() * (max - min)) + min;
}
  • 这里就是模块化的写法,定义了一个工具方法,然后导出它:export default,当然如果有多个方法,就只需要 export 了,引入的时候加 { },解构的方式取值,如下:
export { fnA, fnB, fnC, fnD};
import { fnA, fnB, fnC, fnD } from '/util.js'
  • 需要注意的是,这里的 js 已经不是脚本了,它是一个模块,所以必须在标签上加 type="module
  • 另外,你需要在本地启动一个服务才能正常运行(vscode 下个Live Server即可),不然会报错。
  • 否则,你直接打开html文件会报错: CORS 错误,这是因为 JavaScript 模块安全性需要如此。
  • 加载一个模块脚本时不需要使用 defer 属性模块会自动延迟加载。

3. 优雅的做法 —— 创建模块对象

  • 当有多个方法以及导出时,以上做法其实并不优雅:需要N个 export,与N个 import,于是我们可以优化一下。
import * as Module from "/modules/module.js";
  • 这将获取 module.js 中所有可用的导出,并使它们可以作为对象模块的成员使用,从而有效地为其提供自己的命名空间。例如:
Module.function1();
Module.function2();
  • 很明显,可以像以前一样编写代码,并且导入更加整洁。在这里插入图片描述

4. 模块与类(class)

  • 正如我们之前提到的那样,你还可以导出和导入类;这是避免代码冲突的另一种选择,如果你已经以面向对象的方式编写了模块代码,那么它尤其有用。
class Snake {
    constructor({ width = 20, height = 20, direction = 'right' } = {}) {
    }
    render(map) {
    }
    move(food, map) {
    }
    remove() {
    }
}
export default Snake;
  • 使用的时候引入整个即可:
import Snake from "./snake.js";
this.snake = new Snake();
snake.render();
snake.move();
snake.remove();

在这里插入图片描述

5. 合并模块

  • 有时你会想要将模块聚合在一起。你可能有多个级别的依赖项,你希望简化事物,将多个子模块组合到一个父模块中.
  • 这可以使用父模块中以下表单的导出语法:
export * from "x.js";
export { name } from "x.js";

6. 动态加载模块

  • 浏览器中可用的 JavaScript 模块功能的最新部分是动态模块加载。
  • 这允许你仅在需要时动态加载模块,而不必预先加载所有模块,这有一些明显的性能优势。
  • 这个新功能允许你将 import() 作为函数调用,将模块的路径作为参数传递。它返回一个 promise,它用一个模块对象来实现,让你可以访问该对象的导出,例如:
import("/modules/mymodule.js").then((module) => {
  // Do something with the module.
});

1. 希望本文能对大家有所帮助,如有错误,敬请指出
2. 原创不易,还请各位客官动动发财的小手支持一波(关注、评论、点赞、收藏)
3. 拜谢各位!后续将继续奉献优质好文
4. 如果存在疑问,可以私信我(文底有V)

在这里插入图片描述

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

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

相关文章

Shell编程之循环语甸与函数

for 遍历循环 1&#xff09;for 变量 in 取值列表 for i in $(seq 1 10) do 命令序列 .... done 2&#xff09;for ((变量初始值; 变量范围; 变量的迭代方式)) for ((i1; i<10; i)) do 命令序列 .... done IFS for循环取值列表分隔符 set | grep IFS …

---随笔--Java实现TCP通信(双端通信接收与发送)

---随笔--Java实现TCP通信&#xff08;双端通信接收与发送&#xff09; 引言1. 什么是TCP通信2. 服务器与客户端核心代码2.1 服务器ServerSocket端核心代码2.2 用户Socket端核心代码2.3 小贴士之关于try-with-resources自动关闭资源的使用 3. 具体服务器端实现4. 具体客户端实现…

WordPress 、Typecho 站点的 MySQL/MariaDB 数据库优化

今天明月给大家分享一下 WordPress 、Typecho 站点的 MySQL/MariaDB 数据库优化&#xff0c;无论你的站点采用是 WordPress 还是 Typecho&#xff0c;都要用到 MySQL/MariaDB 数据库&#xff0c;我们以 MySQL 为主&#xff08;MariaDB 其实跟 MySQL 基本没啥大的区别&#xff0…

STC8增强型单片机开发【LED呼吸灯(PWM)⭐⭐】

目录 一、引言 二、硬件准备 三、PWM技术概述 四、电路设计 五、代码编写 EAXSFR&#xff1a; 六、编译与下载 七、测试与调试 八、总结 一、引言 在嵌入式系统开发中&#xff0c;LED呼吸灯是一种常见的示例项目&#xff0c;它不仅能够展示PWM&#xff08;脉冲宽度调制…

解决 Content type ‘application/json;charset=UTF-8‘ not supported

文章目录 问题描述原因分析解决方案参考资料 问题描述 我项目前端采用vue-elementUi-admin框架进行开发&#xff0c;后端使用SpringBoot&#xff0c;但在前后端登录接口交互时&#xff0c;前端报了如下错误 完整报错信息如下 前端登录接口JS代码如下 export function login(…

Busybox 在 Docker 中的部署和启动

可以使用 docker pull 指令下载 busybox:latest 镜像&#xff1a; PS C:\Users\yhu> docker pull busybox:latest latest: Pulling from library/busybox ec562eabd705: Pull complete Digest: sha256:5eef5ed34e1e1ff0a4ae850395cbf665c4de6b4b83a32a0bc7bcb998e24e7bbb St…

网安面经之文件包含漏洞

一、文件包含漏洞 1、文件包含漏洞原理&#xff1f;危害&#xff1f;修复&#xff1f; 原理&#xff1a;开发⼈员⼀般希望代码更灵活&#xff0c;所以将被包含的⽂件设置为变量&#xff0c;⽤来进⾏动态调⽤&#xff0c;但是由于⽂件包含函数加载的参数没有经过过滤或者严格的…

Selenium 自动化 —— 一篇文章彻底搞懂XPath

更多关于Selenium的知识请访问“兰亭序咖啡”的专栏&#xff1a;专栏《Selenium 从入门到精通》 文章目录 前言 一、什么是xpath&#xff1f; 二、XPath 节点 三. 节点的关系 1. 父&#xff08;Parent&#xff09; 2. 子&#xff08;Children&#xff09; 3. 同胞&#xff08;S…

LLM量化

Efficient Finetuning prefix tuning 针对每种任务&#xff0c;学习prefix vector 启发于prompting&#xff0c;调整上下文内容让模型去输出自己想要的内容 核心就是找到一个上下文去引导模型解决NLP生成任务 传统情况下&#xff0c;我们为了得到想要的结果&#xff0c;会…

1.9. 离散时间鞅-组合方法分析随机游动(不用鞅方法)

组合方法分析随机游动-不用鞅方法 组合方法分析随机游动(不用鞅方法)1. 反射原理 → \rightarrow →首击时分布2. 反正弦定律(末击时分布)组合方法分析随机游动(不用鞅方法) 本节将不使用鞅更深入地研究简单随机游动的属性,有益于过渡到马氏链的研究. 1. 反射原理

20240512,函数对象,常用算法:遍历,查找

函数对象 函数对象基本使用 重载 函数调用操作符 的类&#xff0c;其对象被称为函数对象&#xff1b;函数对象使用重载的&#xff08;&#xff09;时&#xff0c;行为类似函数调用&#xff0c;也叫仿函数 函数对象&#xff08;仿函数&#xff09;本质是一个类&#xff0c;不是…

【GlobalMapper精品教程】080:WGS84转UTM投影

参考阅读:ArcGIS实验教程——实验十:矢量数据投影变换 文章目录 一、加载实验数据二、设置输出坐标系三、数据导出一、加载实验数据 打开配套案例数据包中的data080.rar中的矢量数据,如下所示: 查看源坐标系:双击图层的,图层投影选项卡,数据的已有坐标系为WGS84地理坐标…

opencompass实践

参考教程 https://github.com/InternLM/Tutorial/blob/camp2/opencompass/readme.md 下载opencompass&#xff0c;配置必要的环境之后&#xff0c;解压下载的数据集 cp /share/temp/datasets/OpenCompassData-core-20231110.zip /root/opencompass/ unzip OpenCompassData-co…

Smurf 攻击是不是真的那么难以防护

Smurf攻击是一种网络攻击方式&#xff0c;属于分布式拒绝服务&#xff08;DDoS&#xff09;攻击的变种。以 1990 年代流行的名为 Smurf 的漏洞利用工具命名。该工具创建的 ICMP 数据包很小&#xff0c;但可以击落大目标。 它利用ICMP协议中的回声请求&#xff08;ping&#x…

第七次--大模型测评

在该章节中更多是体验与尝试 一、理论学习 类型&#xff1a;语言大模型和多模态大模型这两种是主要的类型。 挑战&#xff1a;要想办法建立一个全面的评价体系&#xff0c;还要能处理大规模的数据&#xff0c;并且要保证评测的准确性和可重复性&#xff0c;真不是一件容易的事…

Unity生命周期函数详解

Unity生命周期函数详解 Unity生命周期函数是Unity引擎中用于控制游戏对象行为的一系列方法。它们在游戏的不同阶段被自动调用&#xff0c;允许开发者在适当的时机执行特定的代码。了解和正确使用生命周期函数对于创建流畅和高效的游戏至关重要。 生命周期函数概述 Unity生命…

变量的解构赋值

变量的解构赋值 数组的解构赋值对象解构赋值 对象的解构与数组有一个重要的不同。嵌套结构的对象 字符串的解构赋值数值和布尔值的解构赋值函数参数的解构赋值 变量的解构赋值用途 交换变量的值从函数返回多个值函数参数的定义提取JSON数据设置默认值遍历Map和Set不完全解构输入…

TM1650 并联在I2C 信号线的处理方法

目的是可以并联多个TM1650 在标准I2C 总线上&#xff0c;并且不影响其他标准I2C 器件。思路就是拿个额外的开关控制每一片TM1650 的使能&#xff0c;就像SPI 的CS 信号那样。 协议 TM1650 的通信协议虽说不是标准I2C&#xff0c;但也算是比较兼容的&#xff0c;比方说&#x…

azkaban-tools 项目介绍

本文背景 应一个用户的好心和好奇心&#xff0c;在最近水深火热的百忙之中抽时间写完了一个简短的项目介绍&#xff0c;其实就是几个azkaban的批量操作脚本&#xff0c;但在大数据集群的“运维生涯”中&#xff0c;还是帮了自己不少忙&#xff0c;也算是为了它做一个简单的回顾…

SpringBoot集成jxls2实现复杂(多表格)excel导出

核心依赖 需求 导出多个表格&#xff0c;包含图片&#xff0c;类似商品标签 1.配置模板 创建一个xlsx的模板文件&#xff0c;配置如下 该模板进行遍历了两次&#xff0c;因为我想要导出的数据分为两列展示&#xff0c;左右布局&#xff0c;一个循环实现不了&#xff0c;所以采…