我的前端封裝之路

最近有粉絲提問了我一個面試中遇到的問題,他說面試的時候,面試官問我:你在以前的項目中封裝過組件嗎?或者做過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.pswp.cn/diannao/13637.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/13637.shtml
英文地址,請注明出處:http://en.pswp.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;超…

Python案例題目,入門小白題

1.抓取鏈家前十頁的數據 鏈家網址&#xff1a;長沙房產網_長沙房地產_長沙房產門戶(長沙鏈家網) 1.1.計算均價和總價 import time ? from selenium import webdriver from selenium.webdriver.common.by import By ? driver webdriver.Chrome() driver.get("https://c…

linux系統內存持續飆高的排查方法

目錄 前言&#xff1a; 1、查看系統內存的占用情況 2、找出占用內存高的進程 3、解決方法 4、補充&#xff1a;如果物理內存使用完了&#xff0c;會發生的情況 前言&#xff1a; 如果一臺服務器內存使用率持續處于一個高峰值&#xff0c;服務器可能會出現響應慢問題。例如s…

使用@Autowired + Map 實現策略模式

使用Autowired Map 實現策略模式 創建接口 public interface UserService {String getName(); }創建多個類實現上面的接口 實現一 import com.boot.service.UserService; import org.springframework.stereotype.Service;Service("zhangsan") public class Zhangsan…

代碼隨想錄算法訓練營第十六天|LeetCode104 二叉樹的最大深度、LeetCode111 二叉樹的最小深度、LeetCode222完全二叉樹的節點個數

題1&#xff1a; 指路&#xff1a;LeetCode104 二叉樹的最大深度 思路與代碼&#xff1a; 1.遞歸 求左右子樹的最大深度后加1(根到子樹也有1個深度單位)。代碼如下&#xff1a; class Solution { public:int maxDepth(TreeNode* root) {int ans 0;if (root NULL) return…

當他們在說業務的時候,到底在說什么

業務就是通過提供產品和服務給客戶&#xff0c;以獲取某種價值&#xff0c;形成業務閉環&#xff0c;并能自負盈虧。 文章會以生動形象的比喻來介紹業務到底是什么。 什么是業務&#xff1f; 業務&#xff0c;就像一場精彩的舞臺劇&#xff0c;每個角色都有自己的任務和目標…

electron學習記錄

1.下載electron electron/electron-quick-start: Clone to try a simple Electron app (github.com) 下載實例模板 2.安裝依賴 npm源改成中國鏡像 npm config set registry https://registry.npmmirror.com 然后用cnpm i 來安裝 npm換官方源 npm config set registry https:…

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 服務端邏輯實現源文件【…

cuda 內核啟動

C 使用 __global__ 聲明說明符定義內核&#xff0c;并使用新的 <<<...>>> 執行配置語法指定內核調用的 CUDA 線程數&#xff08;請參閱 C 語言擴展&#xff09;。 每個執行內核的線程都有一個唯一的線程 ID&#xff0c;可以通過內置變量在內核中訪問。 示例…

【最全的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:…

基礎知識篇:大語言模型核心原理解析

1??人工智能基礎概念全景圖 &#x1f4a1; &#x1f9e0;人工智能與機器學習 人工智能&#xff08;AI&#xff09;是計算機科學的一個分支&#xff0c;旨在模擬人類的智能來解決問題。而機器學習&#xff08;ML&#xff09;是AI的一個子集&#xff0c;它的魅力在于不需要顯…

【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…

【MySQL精通之路】InnoDB(6)-磁盤結構(6)-Undolog

1.介紹 Undolog是與單個讀寫事務相關聯的Undolog記錄的集合。 Undolog包含有關如何撤消事務對聚集索引記錄最新更改的信息。如果另一個事務需要將查看一致性讀的一部分原始數據&#xff0c;則會從Undolog記錄中檢索未修改的數據。 2.結構 Undolog記錄存在于Undolog段中 而Un…

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…