第四章 模块和组件、模块化和组件化的理解

news2024/9/20 14:23:17

1、模块

  • 理解:向外提供特定功能的js程序,一般就是一个js文件
  • 为什么要拆成模块:随着业务逻辑增加,代码越来越多且复杂
  • 作用:复用js,简化js的编写,提高js运行效率

我们以一段代码举例说明拆分模块,该片段代码有以下五个部分组成:

  1. 一个存储用户信息的数组
  2. 一个校验邮箱格式的函数
  3. 一个用于根据用户 ID 获取用户信息的函数
  4. 一个用于根据用户名搜索用户的函数
  5. 一个用于添加新用户的函数
  6. 一个用于删除用户的函数

文件名:index.js

//  定义一个存储用户信息的数组
const users = [
  { id: 1, name: 'John Doe', email: 'johndoe@example.com' },
  { id: 2, name: 'Jane Doe', email: 'janedoe@example.com' },
  { id: 3, name: 'Jim Brown', email: 'jimbrown@example.com' },
];

//  定义一个函数,用于校验邮箱格式
function validateEmail(email) {
  const emailRegExp = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}$/;
  return emailRegExp.test(email);
}

//  定义一个函数,用于根据用户 ID 获取用户信息
function getUserById(id) {
  return users.find(user => user.id === id);
}

//  定义一个函数,用于根据用户名搜索用户
function searchUsersByName(name) {
  return users.filter(user => user.name.toLowerCase().includes(name.toLowerCase()));
}

//  定义一个函数,用于添加新用户
function addUser(name, email) {
  if(!validateEmail(email)) {
        throw new Error('邮箱格式错误!')
  }
  const newUser = {
    id: users.length + 1,
    name,
    email,
  };
  users.push(newUser);
  return newUser;
}

//  定义一个函数,用于删除用户
function deleteUser(id) {
  const userIndex = users.findIndex(user => user.id === id);
  if (userIndex === -1) {
    return false;
  }
  const deletedUser = users.splice(userIndex, 1);
  return deletedUser[0];
}

  从以上代码可以看出,这是一个对用户信息的增删改查的js代码。但是代码太长,代码结构层次不明显,通过代码分析业务困难,不容易维护,且功能代码不复用会造成冗余。

通过简要分析,我们可以将以上代码拆分为3个部分:

  • 一个是用户数据本身部分
  • 一个是对邮箱的格式验证,这是一个通用的功能函数,算单独的工具函数
  • 一个是针对用户信息的增删改查功能的几个函数,算另外一部分

在这里插入图片描述

index.js按照功能模块拆分后类似以下结构:

文件名:userData.js

//  定义一个存储用户信息的数组
const users = [
  { id: 1, name: 'John Doe', email: 'johndoe@example.com' },
  { id: 2, name: 'Jane Doe', email: 'janedoe@example.com' },
  { id: 3, name: 'Jim Brown', email: 'jimbrown@example.com' },
];

export default users

文件名:tool.js

//  定义一个函数,用于校验邮箱格式
export function validateEmail(email) {
  const emailRegExp = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}$/;
  return emailRegExp.test(email);
}

文件名:userCrud.js

import { validateEmail } from './tool.js'

//  定义一个函数,用于根据用户 ID 获取用户信息
export function getUserById( users, id) {
  return users.find(user => user.id === id);
}

//  定义一个函数,用于根据用户名搜索用户
export function searchUsersByName( users, name) {
  return users.filter(user => user.name.toLowerCase().includes(name.toLowerCase()));
}

//  定义一个函数,用于添加新用户
export function addUser( users, name, email) {
  if(!validateEmail(email)) {
        throw new Error('邮箱格式错误!')
  }
  const newUser = {
    id: users.length + 1,
    name,
    email,
  };
  users.push(newUser);
  return users;
}

//  定义一个函数,用于删除用户
export function deleteUser( users, id) {
  const userIndex = users.findIndex(user => user.id === id);
  if (userIndex === -1) {
    return false;
  }
  const deletedUser = users.splice(userIndex, 1);
  return users;
}

文件名:index.js

import users from './userData.js'
import { getUserById, searchUsersByName, addUser, deleteUser } from './userCrud.js' 

// 比如获取id为1的用户,可以这样写
const user = getUserById(users, 1)

//...其他CRUD操作

总结:

**  JavaScript 模块是指将代码分成独立的模块的技术。每个模块是一个独立的单元,可以拥有自己的变量和函数,并且可以被其他模块导入使用。**这样在index.js中就可以更加着重业务,需要功能的时候直接引入即可。代码结构层次明确,易阅读和维护。

注意:在实际项目中,不可能和我这里的案例代码一样,这里只是提供思路,仅供参考。


2、组件

  • 理解:用来实现局部功能效果的代码和资源的集合(html/css/js/img等等)
  • 为什么要用组件:一个界面功能更复杂
  • 作用:复用编码,简化项目编码,提高运行效率,便于维护。

在这里插入图片描述

  上图组件就是一个card组件,实现一个组件,就可以在整个项目上进行复用,说是复制粘贴也不为过。当然,在实际的项目中,我们都会使用一些封装好的组件库进行开发,如:ElementUI、NaiveUI、VantUI等等,但是有些特别的组件在组件库中没有的时候,就需要你自己开发了,你可以对组件库的组件进行二次开发,也可以纯手工写一个新的组件,这个可以自由发挥,主要就是要理解组件。

总结:

  组件是指用于构建应用程序界面的独立部分。组件可以被看作是控制界面中的一个单独的元素的独立代码单元。


3、模块化

  当应用的js都以模块来编写的,这个应用就是一个模块化的应用。

  JavaScript 模块化是一种将代码分成独立模块的技术。每个模块是一个独立的单元,可以拥有自己的变量和函数,并且可以被其他模块导入使用。模块化的优点是可以更好地组织代码,并且可以避免命名冲突。它是通过使用模块系统,例如 CommonJSES6 模块,来实现的。

JavaScript 模块化在 ES6 中正式引入了语法支持,有两种导入和导出模块的方式:importexport

导出模块:

// myModule.js
const message = 'Hello from myModule!';
export default message;

导入模块:

// main.js
import message from './myModule.js';
console.log(message); // Hello from myModule!

总结:

模块化的优点包括:

  1. 可维护性:可以更轻松地维护大型项目。
  2. 可重用性:可以在多个地方重复使用代码。
  3. 命名空间:模块可以拥有自己的命名空间,避免命名冲突。
  4. 代码隔离:可以保护代码免受其他模块的影响。

JavaScript 模块化是为了提高代码质量和可维护性的重要技术,对于开发大型应用程序是必要的。


4、组件化

  当应用是以多个组件方式实现,这个应用就是一个组件化的应用。我们在构建一个后台页面布局的时候,我们大概可以分header(头部)、sider(侧边栏)、content(内容)、footer(底栏)。它们都可以单独封装为一个组件,通过页面布局将这些组件组合在一起,各自发挥它们的功能,这就是组件化。

在这里插入图片描述

总结:

  组件化是指将应用程序的界面分解为一组独立的组件,每个组件具有自己的状态和逻辑。组件化的目的是提高代码可维护性,使得开发人员可以独立地维护和开发每个组件,而不必关心其他部分。

组件化带来了以下优势:

  1. 可复用性:组件可以在应用程序的多个地方使用。
  2. 可维护性:每个组件可以独立地维护和开发。
  3. 易于理解:由于组件是独立的代码单元,因此它们更容易理解和维护。
  4. 增强测试性:组件可以独立地测试,从而更容易确保代码的正确性。

组件化是应用程序开发的重要技术,特别是在使用 JavaScript 框架如 React 和 Vue.js 时,它被广泛使用。

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

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

相关文章

C#WPF基础教程3——资源字典、样式、

资源字典 创建资源字典 创建合并资源属性 资源字典的使用 引用类库中的资源字典 在类库中创建资源字典 类库中资源字典的使用 样式 添加样式 使用静态的方式为按钮添加样式 设置背景样式,不能直接使用value 关联事件处理程序 UI层创建事件关联程序 model端创建…

每日学术速递2.13

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV、cs.AI、cs.CL 1.Deep Intra-Image Contrastive Learning for Weakly Supervised One-Step Person Search 标题:深度图像内对比学习用于弱监督的单步人物搜索 作者&#…

模型解释性:SHAP包的使用

本篇博客介绍另一种事后可解释性方法:SHAP(SHapley Additive exPlanation)方法。 1. Shapley值理论 Shapley值是博弈论中的一个概念,通过衡量联盟中各成员对联盟总目标的贡献程度,从而根据贡献程度来进行联盟成员的利益分配,避免…

机器学习-特征工程

特征工程是将原始数据转换为更好的代表预测模型的潜在问题的特征的过程,从而提高了对未知数据的预测准确性。特征抽取文本特征抽取,sklearn的API是sklearn.feature_extraction.text.CountVectorizer。(1).英文分词from sklearn.fe…

Smart Finance 热启动创世开启,参与质押瓜分SMART资产

在2023年开年以来,加密市场开始迎来复苏,以BTC、ETH等为代表的主流加密资产迎来普涨,虽然相较于2021年顶峰时期相比仍存在一定的差距,但市场的回暖正在带动加密行业在2023年的复苏。而随着DigiDaigaku登录美国体育盛会“超级碗”&…

手把手教你抢BingChatGPT免费体验名额!

✅作者简介:CSDN内容合伙人、信息安全专业在校大学生🏆 🔥系列专栏 :ChatGPT-Bing 📃新人博主 :欢迎点赞收藏关注,会回访! 💬舞台再大,你不上台,永…

关于docker在CentOS6与CentOS7的安装教程

CentOS 6 安装docker步骤yum install -y epel-releaseyum install -y docker-io安装后的配置文件:/etc/sysconfig/docker启动Docker后台服务:service docker startdocker version验证CentOS 7 安装docker步骤感兴趣的可以看看docker安装文档https://docs…

企业如何解决内容审核的安全风险?

内容审核是什么?随着互联网的快速发展,与之而来的是信息爆炸式增长,而且这些互联网信息良莠不齐,其发布者也鱼龙混杂,常常混入很多不良或者违规违法信息,例如涉政、涉黄、暴恐、违禁、不良价值观、广告等。…

使用FirewallD构建动态防火墙(9)

预备知识 firewalld 是新一 Linux 代防火墙工具,它提供了支持网络 / 防火墙区域 (zone) 定义网络链接以及接口安全等级的动态防火墙管理工具。它也支持允许服务或者应用程序直接添加防火墙规则的接口。在 Linux 历史上已经使用过的防火墙工具包括:ipfwa…

redis命令大量超时 连接数突增

大家好,我是烤鸭: 今天分享一个线上线上redis命令大量超时,连接数突增的问题。由于不是我这边的业务,只能根据事后的一些客观数据进行分析。 配置: ​ redis 4.0 3主3从,总内存36G。 ​ 业务服务7台…

跨平台代码编写工具 Visual Studio Code

随着生产力的提高,生产工具也在不断的提高。 今天就介绍 目前最好用的工具 Visual Studio Code。 1. 入门 Visual Studio Code 是一款轻量级但功能强大的源代码编辑器,可在您的桌面上运行,适用于 Windows、macOS 和 Linux。它内置了对 Java…

蓝库云|制造业转型不可或缺的“PLM”的作用和真正价值

PLM是产品生命周期管理,是一种应用于在单一地点的企业内部、分散在多个地点的企业内部,以及在产品研发领域具有协作关系的企业之间的,支持产品全生命周期的信息的创建、管理、分发和应用的一系列应用解决方案,它能够集成与产品相关…

如何短期通过PMP考试?

PMP考试相比较其他考试,首先就是PMP是不卡通过率的,所以只要你做题的正确率上去了,那是有很大机会能通过考试的!想要短期通过PMP考试,就得每天安排具体的任务,规划好,按计划去做。抓紧时间&…

QFramework框架学习

主要学习内容TypeEventSystemActionKitTimer类1、TypeEventSystem-适用于一个条件触发,多个组件响应的情况例如:动物园系统中,点击肉食动物按钮,动物园中有肉食属性的动物都进行显示。步骤:1、动物自身脚本上进行判断是…

产品的可持续发展

如今,产品的可持续性对于取得商业成功至关重要。越来越多的政府提出了相关的合规性要求,普通消费者也在翘首期待符合可持续性发展理念的产品上市。然而,许多企业面临的首要问题是如何确定他们的产品是否满足可持续性发展的要求。 毕竟&#x…

后量子 KEM 方案:LAC

参考文献: Lyubashevsky V, Peikert C, Regev O. On ideal lattices and learning with errors over rings[J]. Journal of the ACM (JACM), 2013, 60(6): 1-35.Lu X, Liu Y, Zhang Z, et al. LAC: Practical ring-LWE based public-key encryption with byte-leve…

java -数据结构,List相关基础知识,ArrayList的基本使用,泛型的简单、包装类介绍

一、 预备知识-泛型(Generic) 1.1、泛型的引入 比如:我们实现一个简单的顺序表 class MyArrayList{public int[] elem;public int usedSize;public MyArrayList(){this.elem new int[10];}public void add(int key){this.elem[usedSize] key;usedSize;}public …

Ethercat系列(4)Twcat3激活配置过程的协议分析

广播设置ESC的4个端口环路设置从-》主广播读从站状态机实际状态主-》从从-》主广播清除接收错误计数器0x300且读应用层状态从-》主顺序读从站基本信息,链路层配置与状态从-》主广播读从站状态机状态主-》从从-》主顺序写ESC控制模式,广播读从站状态主-》…

一、图机器学习导论【CS224W】(Datawhale组队学习)

开源内容:https://github.com/TommyZihao/zihao_course/tree/main/CS224W 子豪兄B 站视频:https://space.bilibili.com/1900783/channel/collectiondetail?sid915098 斯坦福官方课程主页:https://web.stanford.edu/class/cs224w 文章目录前…

C++中的标准输入和输出

一、 C 输入输出的含义 在C语言中我们的输入和输出都是以printf和scanf进行操作的。他们都是函数。在C中的我们的输入输出都是以终端为对象的,即从键盘输入数据,运行结果输出到显示器屏幕上。从操作系统(Linux)的角度看,每一个与主机相连的输…