【11】工程化
一、为什么需要模块化
当前端工程到达一定规模后,就会出现下面的问题:
-
全局变量污染
-
依赖混乱
上面的问题,共同导致了代码文件难以细分
模块化就是为了解决上面两个问题出现的
模块化出现后,我们就可以把臃肿的代码细分到各个小文件中,便于后期维护管理
前端模块化标准
前端主要有两大模块化标准:
- CommonJS,简称 CMJ,这是一个社区规范,出现时间较早,目前仅 node 环境支持
- ES Module,简称 ESM,这是随着 ES6 发布的官方模块化标准,目前浏览器和新版本 node 环境均支持
node 环境
下载地址:https://nodejs.org/zh-cn/
CommonJS 如何实现模块化
node 天生支持 CommonJS 模块化标准
node 规定:
-
node 中的每个 js 文件都是一个 CMJ 模块,通过 node 命令运行的模块,叫做入口模块
-
模块中的所有全局定义的变量、函数,都不会污染到其他模块
-
模块可以暴露(导出)一些内容给其他模块使用,需要暴露什么内容,就在模块中给
module.exports赋值 -
一个模块可以导入其他模块,使用函数
require("要导入的模块路径")即可完成,该函数返回目标模块的导出结果- 导入模块时,可以省略
.js - 导入模块时,必须以
./或../开头
- 导入模块时,可以省略
-
一个模块在被导入时会运行一次,然后它的导出结果会被 node 缓存起来,后续对该模块导入时,不会重新运行,直接使用缓存结果
练习题
导入导出练习
按照要求完成下面的模块
1. 配置模块 config.js
它需要导出一个对象,规格如下:
{wordDuration: 300, // 打印每个字的时间间隔text: `西风烈,
长空雁叫霜晨月。
霜晨月,
马蹄声碎,
喇叭声咽。
雄关漫道真如铁,
而今迈步从头越。
从头越,
苍山如海,
残阳如血。` // 要打印的文字
}
2. 延迟模块 delay.js
该模块的文件名为delay,你需要把下面的函数导出:
/*** 该函数返回一个Promise,它会等待指定的毫秒数,时间到达后该函数完成* @param {number} ms 毫秒数* @returns {Promise}*/
function delay(ms) {return new Promise((resolve) => setTimeout(resolve, ms));
}
3. 打印模块 print.js
该模块负责导出一个打印函数,该函数需要获取当前的打印配置:
/*** 该函数会做以下两件事:* 1. console.clear() 清空控制台* 2. 读取config.js中的text配置,打印开始位置到index位置的字符* @param {number} index*/
function print(index) {}
4. 主模块 main.js
这是启动模块,它会利用其它模块,逐字打印出所有的文本,打印每个字的间隔时间在config.js中已有配置
/*** 运行该函数,会逐字打印config.js中的文本* 每个字之间的间隔在config.js已有配置*/
function run() {}run();
CommonJS
标准类型:社区规范
支持环境:node
依赖类型:动态依赖
如何导出
module.exports = 导出的值;
如何导入
require("模块路径"); // 函数返回模块导出的值
ES Module
标准类型:官方标准
支持环境:node,浏览器
依赖类型:静态依赖,动态依赖
如何导出
ES Module的导出
ES Module 分为两种导出方式:
- 具名导出(普通导出),可以导出多个
- 默认导出,只能导出一个
一个模块可以同时存在两种导出方式,最终会合并为一个「对象」导出
export const a = 1; // 具名,常用
export function b() {} // 具名,常用
export const c = () => {}; // 具名,常用
const d = 2;
export { d }; // 具名
//不可以写成 export d 这样写就是export d中的d是表达式,但是export需要的是定义
//例如 export const xxx,export function xx(){}
//注意这里的 export {d}导出不是导出一个d对象,这里只是语法要求将d放在一对括号中
//这里表示你要导出一个变量,而且导出变量的名字为d,就使用上面的写法
const k = 10;
export { k as temp }; // 具名// export default 3 // 默认,常用
// export default function() {} // 默认,常用
// const e = 4;
// export { e as default } // 默认
// export default {xxx(){},yyy(){}}// 默认导出一个对象
const f = 4,g = 5,h = 6;
export { f, g, h as default }; // 基本 + 默认// 以上代码将导出下面的对象
/*
{a: 1,b: fn,c: fn,d: 2,temp: 10,f: 4,g: 5,default: 6
}
*/
注意:导出代码必须为顶级代码,即不可放到代码块中
如何导入
针对具名导出和默认导出,有不同的导入语法
// 仅运行一次该模块,不导入任何内容,模块路径后缀名不能省略
import "模块路径";
// 常用,导入属性 a、b,放到变量a、b中。a->a, b->b
import { a, b } from "模块路径";
// 常用,导入属性 default,放入变量c中。default->c
import c from "模块路径";
// 常用,default->c,a->a, b->b
import c, { a, b } from "模块路径";
// 常用,将模块对象放入到变量obj中
import * as ob相关文章:
【11】工程化
一、为什么需要模块化 当前端工程到达一定规模后,就会出现下面的问题: 全局变量污染 依赖混乱 上面的问题,共同导致了代码文件难以细分 模块化就是为了解决上面两个问题出现的 模块化出现后,我们就可以把臃肿的代码细分到各个小文件中,便于后期维护管理 前端模块化标准…...
Python中requests、aiohttp、httpx性能对比
在Python中,有许多用于发送HTTP请求的库,其中最受欢迎的是requests、aiohttp和httpx。这三个库的性能和功能各不相同,因此在选择使用哪个库时,需要考虑到自己的需求和应用场景。 首先,让我们来了解一下这三个库的基本…...
网络原理(5)——IP协议(网络层)
目录 一、IP协议报头介绍 1、4位版本 2、4位首部长度 3、8位服务器类型 4、16位总长度 5、16位标识位 6、3位标志位 7、13位偏移量 8、8位生存空间 9、8位协议 10、16位首部检验和 11、32位源IP地址 12、32位目的IP地址 二、IP协议如何管理地址? 1、动…...
GE IS200AEPAH1BKE IS215WEPAH2BB是两种不同的压力测量模块
GE IS200AEPAH1BKE和IS215WEPAH2BB是两种不同的压力测量模块,它们都属于GE(通用电气)公司的产品。 具体来说,以下是这两种模块的一些特点和应用: IS200AEPAH1BKE:这款模块适用于需要高性价比的压力测量应用…...
Rust 与 C++ ,孰优孰劣?
Rust 与 C 是两种高级系统级编程语言,它们都在追求性能、控制底层硬件细节的同时强调安全性。以下是两者的详细对比: 目标与理念 Rust:由 Mozilla 主导开发,目标是构建一种既快速又安全的系统级编程语言,特别是解决 C…...
MySQL、Oracle的时间类型字段自动更新:insert插入、update更新时,自动更新时间戳
1.MySQL 支持的字段类型:DATETIME、TIMESTAMP drop table if exists test_time_auto_update; create table test_time_auto_update (id bigint auto_increment primary key comment 自增id,name varchar(8) …...
Testng框架集成新业务
总体框架设计见我另一篇博客:httpclienttestng接口自动化整体框架设计 <block:表示测试用例块> block后面是 测试用例的名称 ||接口名,该接口名在URL.txt里维护接口 ||get\post:表示请求的方法 get_1\2\3\4:代表加密 get: …...
springboot 单元测试
Spring Boot 单元测试是确保代码质量的重要部分,它允许我们在不实际启动整个应用的情况下测试我们的代码。在Spring Boot中,我们通常使用Spring Test模块和JUnit测试框架来编写单元测试。以下是一个简单的Spring Boot单元测试的详细代码介绍:…...
LeetCode---126双周赛
题目列表 3079. 求出加密整数的和 3080. 执行操作标记数组中的元素 3081. 替换字符串中的问号使分数最小 3082. 求出所有子序列的能量和 一、求出加密整数的和 按照题目要求,直接模拟即可,代码如下 class Solution { public:int sumOfEncryptedInt…...
[python] ETL 工作流程 Prefect
Prefect 是一个用于构建、调度和监控数据流程的 Python 库。它提供了一种简单而强大的方式来管理 ETL(Extract, Transform, Load)工作流程。下面是一个简单的示例,演示了如何使用 Prefect 来创建和运行一个简单的任务: 首先&…...
html第一次作业
常用标签 0, 骨架(!tap) <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><t…...
基于java实现的KTV点歌系统
开发语言:Java 框架:ssm 技术:JSP JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开发软件:eclipse/myeclip…...
GPT+向量数据库+Function calling=垂直领域小助手
引言 将 GPT、向量数据库和 Function calling 结合起来,可以构建一个垂直领域小助手。例如,我们可以使用 GPT 来处理自然语言任务,使用向量数据库来存储和管理领域相关的数据,使用 Function calling 来实现领域相关的推理和计算规…...
DeepSeek-coder 微调训练记录
简介 微调过程不再细说, 参考link进行即可. 主要是数据集. 1.3b模型微调训练占用资源信息 top信息 评估 根据DeepSeek-coder的Evaluation试进行对微调后的模型进行评估. 其中的评估库主要是evol-teacher和human-eval. 新建一个eval_ins.sh文件, 填入以下内容 LANG"…...
【Android】【Bluetooth Stack】蓝牙音乐协议分析之音频控制与信息加载(超详细)
1. 精讲蓝牙协议栈(Bluetooth Stack):SPP/A2DP/AVRCP/HFP/PBAP/IAP2/HID/MAP/OPP/PAN/GATTC/GATTS/HOGP等协议理论 2. 欢迎大家关注和订阅,【蓝牙协议栈】和【Android Bluetooth Stack】专栏会持续更新中.....敬请期待! 目录 1. 音乐信息加载 1.1 歌曲信息 1.1.1 key_c…...
ChatGPT无法登录,提示我们检测到可疑的登录行为?如何解决?
OnlyFans 订阅教程移步:【保姆级】2024年最新Onlyfans订阅教程 Midjourney 订阅教程移步: 【一看就会】五分钟完成MidJourney订阅 GPT-4.0 升级教程移步:五分钟开通GPT4.0 如果你需要使用Wildcard开通GPT4、Midjourney或是Onlyfans的话&am…...
程序员表白
啥?!你说程序员老实,认真工作,根本不会什么表白!那你就错了!(除了我) 那今天我们就来讲一下这几个代码!赶紧复制下来,这些代码肯定有你有用的时候! 1.Python爱心代码 im…...
CSS的使用与方法
什么是CSS CSS是层叠样式表。它是一种用于描述网页或者文档外观和样式的标记语言。 层级样式表:就是给HTML标签加样式的。 如果说HTML是个游戏英雄 、那么CSS就是游戏皮肤。 【一】注释语法 /* 注释 */ 【二】CSS的语法结构 选择符 {样式属性: 样式属性值;样…...
(保姆级)离线安装mongoDB集群
Docker搭建MongoDB集群 副本集模式(Replica Set) 是一种互为主从的关系, Replica Set 将数据复制多份保存,不同服务器保存同一份数据,在出现故障时自动切换,实现故障转移。 此集群拥有一个主节点和多个从…...
面试笔记——MySQL(主从同步原理、分库分表)
主从同步原理 主从同步结构:主库负责写数据,从库负责读数据,如图—— MySQL主从复制的核心就是二进制日志(BINLOG),它记录了所有的 DDL(数据定义语言)语句和 DML(数据操…...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...
uniapp 字符包含的相关方法
在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...
R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...
