我的前端封装之路

最近有粉丝提问了我一个面试中遇到的问题,他说面试的时候,面试官问我:你在以前的项目中封装过组件吗?或者做过npm公共库吗?遇到过什么问题吗?当时自己突然觉得好像没什么可回答的啊,但面试结束想起来,自己在前端开发工作中貌似又在不停的封装东西。但因为没有提前准备这类问题,所以回答的不是很理想。这篇文章,我说一些我的封装工作历程,希望对大家有帮助吧。

目录

1 那是一个日历组件

1.1 S

1.2 T

1.3  A

1.4 R

2 那是一个小小的图片懒加载 

2.1 S

2.2 T

2.3 R

3 js-tool-big-box 

3.1 我的初衷

3.2 我的行动 

3.3 我的成长

4 面试回答STAR法则


1 那是一个日历组件

1.1 S

我最初的工作呢,公司的项目是一个类电商平台,但售卖的不是生活用品,是一个网络售票的网站。当时我最初的工作除了日常的前端开发,那个时候还不太流行Vue和React,JQuery是我的吃饭家伙。一些日常组件封装啊,倒是常做,比如手风琴最初的jqueryUI只支持传入文字和HTML,但大家都开始以JSON格式传输数据了,所以我需要把JSON转成HTML再穿进去,这样将jqueryUI封装起来,再比如jqGrid的表格中的可输入,可提交做的很差,我就需要外部包一层。

但终于有一天,产品经理说,这个日历组件太不友好了,不好看,翻起来也费劲,更重要的是,也没个节假日啥的体现,对我们的用户太不友好了

这项任务对于刚毕业的我来说,压力还是很大的,我当时翻了半天百度,竟然发现都是千篇一律的日历组件,要么就是讲解说明的,要么就是那种管理端使用的日历组件,让我很头疼。自己实现的话难度会不会太大了,而且当时虽然二次封装过jqery组件,但自己写还真么写过,如何把组件写好后,用于多处场景,如何定位不错乱,以及时间日期的各种API组合,这些我都还一知半解。但初生牛犊不怕虎,我依然接下啦这份间距的任务。

1.2 T

由于当时每个星期都会迭代新需求,而这个日历组件只是一个额外需求,这就要求我需要自己加班搞啦。而这就像是自己给自己提的一个需求,所以我需要自己按照产品的原话,再看着已有的那些日历组件,自己给自己列出需求条目。尽管自己对这些实现API了解不是太深,但我相信,只要条理逻辑是对的,我总会一步步实现出来的。于是我开始列需求:

  1. 要根据页面中的"预定日期"输入框,定位好自己的组件位置,不能便宜或者错乱;
  2. 日历只显示2个月份,分别是当月和下个月
  3. 头部要采用2025年05月拼接的形式来展示;
  4. 星期几的展示呢,要从周一开始,而不是以往日历组件的从周日开始;
  5. 要计算出,当月有多少天,下个月有多少天;
  6. 要计算出每个月周一是星期几,然后一直排列到最后一天;
  7. 每个月最后一行是否需要展示,不需要则留白;
  8. 今天以前的的时间要置灰展示
  9. 动态传入参数,有时候订票只能2个星期后,有时候是1个月以后,再往后的时间要置灰,不可点;
  10. 今天”要在日历中有所展示;
  11. 法定节假日要在日历中有所展示;
  12. 点击日期的参数回传
  13. 外部日期与内部日期的对准选中;

1.3  A

在罗列好需求以后,我深入学习了如何封装初始化jquery组件;按照预想的界面调控好主界面、年月、星期、日期面板;又开始从年月入手,获取每个月的日历,如何去根据周一的位置定位,何获取今天去置灰之前的日期,如何根据入参置灰不可选的之后的日期,再维护好法定节假日,根据节假日去匹配日期显示等。

最终一步步按照自己的需求,开发、调整再开发,终于可以开始测试了。组件能够越来越完善,感谢测试同学的精心细点,把一些例如今年12月到明年1月啦、例如结束时间不准确啦等问题提出来,最终完成功能,达到上线效果。

1.4 R

其实现在回想起来,那个时候因为热爱前端开发工作,哪怕市面上没有的组件,有一定难度我还是很愿意尝试一下的。那个时候最大的难点就是,自己的JS基础还不是很牢固,一个组件有那么多的细小功能需要配合整理,需要自己整理好开发思路去完成整个功能。

通过这个小日历组件的开发,很好的锻炼了自己的底层开发技术,这对我后续封装其他通用组件打好了基础。同时,由于法定节日假使需要一年一维护的,这就使得我需要将这个日历组件的文档整理好,哪怕离职的时候也要交接好,不至于来年日历组件显示异常。这也很好的锻炼了我对待工作的责任心

2 那是一个小小的图片懒加载 

2.1 S

最初接手这个项目的时候呢,里面其实是有一个图片懒加载的组件的,看似很好用的样式,lazy.vue,可以传入图片,先显示一个小Logo,等待图片加载完成再显示,但在不断进行性能优化的过程中,发现这个图片懒加载的功能捉襟见肘。

我们最初只是在一个元素内展示这个img,img也是lazy.vue最终返回的内容。但慢慢的对这个小lazy需求就多样化起来了,

  • 比如需要高清显示的时候呢,我们需要加载2倍图,甚至3倍图,不高清的时候,1倍图就可以了;
  • 有的浏览器呢,图片宽高跟着父元素走,因为我们设置了父元素宽高,而子元素这个img呢,我们设置了100%,但有的浏览器呢,子图片宽高不跟着父元素走,很奇怪
  • 最初的窗口监听也有问题,有时候滑到这里了,还不加载呢,或者很慢;
  • 有的网页很长很长,得有四五屏那么高,结果图片如果都加载同一个域名下的,慢慢就很卡很卡,那种卡,特别卡;慢慢的,
  • 外部公司又想打广告,图片域名又跟之前的不同了;
  • 有时候是个gif,你怎么弄它就是慢,而且体积还很大;
  • 有时候吧,比如首屏,又不需要图片懒加载了,但我们又希望图片都走同一个出口来显示,首屏你再给他懒加载会弄得显示起来更慢;
  • 有时候用户一下滑到最底部了,你懒加载也是慢,因为图片还没反应过来呢;
  • 有时候,访问曝光的时候,产品又希望图片如果显示在当前区域时间不足多久不曝光

反正就是,别看小小的图片懒加载,但却承载了他不该承载的期望。 

2.2 T

不过这个图片懒加载组件丰满牢固倒不是一下子完成的,也是在前端项目优化、项目迭代、学习优化知识的过程中一点点积累起来的。而这过程中,我采用了以下方案:

2.3 R

组件虽小,但在优化改进过程中,发现最大的难点莫过于多样化的需求。而在每次改进过程中,都会涉及到一些技术盲区,这就需要我不断的学习与实践。

通过不断完成这个图片懒加载组件,显著减少了页面首屏初始化加载的时间,提升了用户体验。此外,组件的多样化配置选项使得它可以灵活地应用在不同的场景中,团队开发效率得到了很大提升。

而我也在不断完善与学习中,不断加强了对前端性能优化的理解、提高了对复杂需求的解决能力以及增强了对用户体验的重视。整体来说,它使得我对前端项目开发整体认知的提升起到了很大的帮助。

3 js-tool-big-box 

3.1 我的初衷

其实我在前端项目开发中,一直是需要哪些公共方法,临时写,然后大家互相在群里说一声:我在utils目录里加了一个方法,大家需要发送jsonp的时候,需要获取uuid的时候,需要设置localStorage的时候,你们可以直接用啊,不用单独写啦。然后干着干着,发现大家写了好几份,有的单独写到业务组件里,有的几乎又在utils目录里加了一份,然后悄么声的,不review代码,你看不到。又有时候,张三需要用到copy文字到剪贴板的时候,自己引入了一下组件,也没有说,结果第二天来了,李四发现项目起不来了,然后大喊,项目起不来啦,谁干的?然后李四大喊一声:你引入一下copy组件。张三大喊:好啦。又有时候呢,A项目用到了这个方法,写了一套,B项目又需要了,怎么办呢?拷过去吧,又有时候发现,A项目的代码找不到了,算了,接着写吧

简单的说,今天的你我,还在重复昨天的故事,这一行破代码,接续放入你的破项目。

3.2 我的行动 

最近呢,我业余时间开始了js-tool-big-box的开发,这个npm包已经开始有小伙伴开始下载使用了,给我提了一些建议,有的是改进建议,有的是新需求建议,还是挺不错的,功能还在不断丰富中。大家也不比担心包太大,影响项目部署后的加载。我们使用了模块化引入,你使用的少,最终打包到项目中的代码就会少。

3.3 我的成长

其实开发npm包这种第三方工具,与自己在公司项目里开发功能还是不同的。毕竟这要被更多的开发者使用了,之前写的功能没问题,可能一下子使用的人多了,因为时间、地理、系统平台、浏览器、人的不同,也许就有问题了。

但这是一件很值得去做的事情,因为我热爱自己的工作,我希望自己可以更长久一些的在这个职位这个行业继续干下去。所以,自己的团队有这么一套东西,也是希望自己可以有个可以更值得自己喜欢,自己去维护的小产品。

通过这个项目呢,我也可以认识更多的开发者,更多的共同爱好者,可以帮助更多的同样热爱前端开发的小伙伴。当然,通过这个项目,我也使得自己的专业只是更加精进,使得这些工具方法们更加的健壮,那将是一件此生非常值得开心的事情。

4 面试回答STAR法则

说到面试呢,掌握STAR法则,我觉得是非常重要的。我们上面分别使用了S T A R,放到你面试的时候呢,就可以套用这个公式:

S: (Situation)你要做一件事情遇到的问题,或者说当前的现状,你要解决这个问题所带来的困难;

T: (Task)列举你要完成这项任务,所要解决的问题和难点;

A:(Action)说出你的行动,你都做了哪些方案来解决问题;

R:(Result)这个最重点,说出你做完这件事,有哪些结果,对项目有哪些正向的影响,对团队有哪些正向的帮助,对个人有哪些很棒的提升。

这个法则固然是用来套用的,但如果你掌握熟练了,就不比非得往4个步骤去套用了,可以灵活运用。

  1. 总之就是这件事呢,他很难,非常难,别人干不了;
  2. 怎么难呢,哎呀,这里难,哪里难,哪哪都难;
  3. 我这么干,吭哧吭哧的,救了火,打扫了火星子和烂煤炭;
  4. 屋子也干净了,大家也干净了,我也厉害了

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

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

相关文章

前端 CSS 经典:弧形边框选项卡

1. 效果图 2. 开始 准备一个元素&#xff0c;将元素左上角&#xff0c;右上角设为圆角。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, i…

thingML的学习——什么是thingML

今天开始建模的学习&#xff0c;thingML是建模的一种工具 &#xff0c;也可以理解为一种建模语言&#xff0c;有自己的语法和语义。 ThingML 支持的多种平台和通信协议&#xff0c;如UART、I2C、MQTT、WebSocket、REST、ROS、Bluetooth、BLE和Zwave&#xff0c;通过插件机制&a…

Spring Cloud Alibaba-07-RocketMQ消息驱动

Lison <dreamlison163.com>, v1.0.0, 2024.4.20 Spring Cloud Alibaba-07-RocketMQ消息驱动 文章目录 Spring Cloud Alibaba-07-RocketMQ消息驱动MQ简介MQ的应用场景常见的MQ产品RocketeMQ的架构及概念 RocketMQ入门RocketMQ环境搭建 SpringBoot 集成 RocketMQ MQ简介 …

来盘点我的校园生活(3)

来公布上期数学题答案:12 你算对了吗&#xff1f; 今天我们班真是炸开了锅。事情是这样的&#xff0c;我今天早晨上学&#xff0c;学校不让早到&#xff0c;但我一个不小心早到了&#xff0c;主任的规定是尽量不早到&#xff0c;早到不扣分&#xff0c;倒要站在那儿背书&…

Linux--软硬链接

目录 0.文件系统 1.软硬链接 1.1见一下软硬链接 1.2软硬链接的特征 1.3软硬链接是什么&#xff0c;有什么作用&#xff08;场景&#xff09; 0.文件系统 Linux--文件系统-CSDN博客 1.软硬链接 1.1见一下软硬链接 1.这是软链接 这个命令在Unix和Linux系统中用于创建一个符号…

基于 Prometheus 的超算弹性计算场景下主机监控最佳实践

作者&#xff1a;左知 超算场景的业务特点 主机监控&#xff0c;或许是监控/可观测领域最传统和普遍的需求。在超算训练&#xff0c;AI 大规模训练的业务场景下&#xff0c;主机监控又有哪些痛点和难点呢&#xff1f;根据我们针对多个大规模超算客户的需求整理&#xff0c;超…

linux系统内存持续飙高的排查方法

目录 前言&#xff1a; 1、查看系统内存的占用情况 2、找出占用内存高的进程 3、解决方法 4、补充&#xff1a;如果物理内存使用完了&#xff0c;会发生的情况 前言&#xff1a; 如果一台服务器内存使用率持续处于一个高峰值&#xff0c;服务器可能会出现响应慢问题。例如s…

当他们在说业务的时候,到底在说什么

业务就是通过提供产品和服务给客户&#xff0c;以获取某种价值&#xff0c;形成业务闭环&#xff0c;并能自负盈亏。 文章会以生动形象的比喻来介绍业务到底是什么。 什么是业务&#xff1f; 业务&#xff0c;就像一场精彩的舞台剧&#xff0c;每个角色都有自己的任务和目标…

QT--TCP网络通讯工具编写记录

QT–TCP网络通讯工具编写记录 文章目录 QT--TCP网络通讯工具编写记录前言演示如下&#xff1a;一、服务端项目文件&#xff1a;【1.1】server_tcp.h 服务端声明文件【1.2】thread_1.h 线程处理声明文件【1.3】main.cpp 执行源文件【1.4】server_tcp.cpp 服务端逻辑实现源文件【…

【最全的excel转json!!!】使用Python脚本提取excel文本中的数据到json中

比如说&#xff1a;我有一个1.xlsx的文件需要转成对应的json格式。 1&#xff09; excel 文件的大概内容&#xff1a; 2&#xff09;保存的方式类似于以下这种情况&#xff1a; 用Python脚本来实现 import pandas as pd import json# 读取Excel文件 excel_path r"D:…

【MySQL精通之路】MySQL8.0升级过程升级了什么

目录 1.升级内容 1.1 mysql系统库 1.2.其他库 2.步骤 2.1 步骤1&#xff1a;数据字典库升级。 2.2 步骤2&#xff1a;服务器升级。 3.mysql_upgrade 3.1 执行正常升级&#xff08;根据需要执行步骤1和2&#xff09;&#xff1a; 3.2 必要时仅执行步骤1&#xff1a; 3…

LLMPerf-为LLM提供可重现的性能指标

LLMPerf-为LLM推理提供可复现的性能指标 翻译自文章&#xff1a;Reproducible Performance Metrics for LLM inference 结合之前的LLMPerf测试大模型API性能的文章进行查看&#xff0c;效果更佳。 1. 摘要 我们见过许多关于LLM性能的声明&#xff1b;然而&#xff0c;这些声明往…

Android面试题之Kotlin泛型和reified关键字

本文首发于公众号“AntDream”&#xff0c;欢迎微信搜索“AntDream”或扫描文章底部二维码关注&#xff0c;和我一起每天进步一点点 //泛型 class MagicBox<T>(item:T){var available falseprivate var subject:T itemfun fetch() : T? {return subject.takeIf { avai…

配置旁挂二层组网直接转发示例(命令行)

业务需求 企业用户通过WLAN接入网络&#xff0c;以满足移动办公的最基本需求。且在覆盖区域内移动发生漫游时&#xff0c;不影响用户的业务使用。 组网需求 AC组网方式&#xff1a;旁挂二层组网。DHCP部署方式&#xff1a; AC作为DHCP服务器为AP分配IP地址。汇聚交换机SwitchB作…

深度学习基础之《TensorFlow框架(18)—卷积神经网络(2)》

一、卷积层 1、卷积层&#xff08;Convolutional Layer&#xff09;介绍 卷积神经网络中每层卷积层由若干卷积单元&#xff08;卷积核&#xff09;组成&#xff0c;每个卷积单元的参数都是通过反向传播算法最佳化得到的 卷积运算的目的是特征提取&#xff0c;第一层卷积层可能…

Gradle和Maven项目解决Spring Boot Configuration Annotation Processor not configured警告

问题描述 写了一个配置类,加了注解@ConfigurationProperties(prefix = “xxx”) 后一直报警告:Spring Boot Configuration Annotation Processor not configured 意思是 Spring boot 未配置注解处理器 解决过程 出现这个问题后,百度查了解决方式 1.maven项目 maven项目是…

纯软件双机热备

在信息化高速发展的今天&#xff0c;企业对于业务连续性的需求愈发强烈。无论哪个行业&#xff0c;系统的稳定运行都至关重要。为了确保系统的高可用性和业务连续性&#xff0c;纯软件双机热备技术应运而生&#xff0c;成为了企业IT架构中的关键一环。 双机热备软件下载 …

cPanel中如何进行网站质量检测

最近我在维护网站的时候需要查看网站质量如何&#xff0c;我使用的是Hostease的主机安装的WordPress网站&#xff0c;随后在咨询了他们的技术支持后获得了方法。 当您在cPanel中部署了网站后&#xff0c;确保网站的质量和性能是至关重要的。cPanel提供了一个便捷的功能Site Qu…

Postman进阶功能-Mock服务与监控

大家好&#xff0c;前面跟大家分享一些关于 Postman 的进阶功能&#xff0c;当我们深入探索 Postman 的进阶功能时&#xff0c;Mock 服务与监控这两个重要方面便跃然眼前。 首先&#xff0c;Mock 服务为我们提供了一种灵活便捷的方式&#xff0c;让我们在某些实际接口尚未准备好…

18.SpringCloud Gateway

简介 SpringCloud Gateway是spingcloud家族的产品&#xff0c;使用netty实现的高性能服务网关&#xff0c;用于替换netflix公司的zuul网关实现。 参考地址&#xff1a; https://spring.io/projects/spring-cloud 术语 工作原理 Route Predicate Factories GatewayFilte…