博客 / 列表

一顆冰淇淋 - js實現繼承的五種方法及原型的繼承關係

繼承是javascript中實現代碼複用的一種方式,也能綁定對象或者函數之間的關係 為什麼要繼承 比如以下代碼,Person、Student和Teacher構造函數,可以發現他們有一些特徵 Person和Student都有姓名、年齡的屬性和吃的方法,但Student還有學號、分數的屬性和學習的方法 Person和Teacher都有姓名、年齡的屬性和吃的方法,但Teacher還有教學的方法

原型 , 繼承關係 , 繼承 , 原型鏈 , Javascript

一顆冰淇淋 - ES6之清楚明白的使用類(class)

定義 類是構造函數、原型鏈的語法糖。 定義類有兩種方式 class Student { } var Student = class { } 某些瀏覽器可能無法解析es6及以上的語法,這時候需要通過babel將代碼解析成瀏覽器可識別的語法,定義類的語法通過babel編譯之後就是通過function定義的構造函數。 類和構造函數是一樣的,通過new關鍵字創建,具有prototype屬性 class

ecmascript-6 , 構造函數 , 繼承 , class , Javascript

一顆冰淇淋 - 三種瀏覽器存儲方案,你還擔心數據無處放嗎

webStorage 基本概念 webStorage提供了兩種存儲方式,localStorage和sessionStorage。 localStorage是持久化存儲,不主動刪除存儲的內容會永久存在 sessionStorage為會話級存儲,關閉瀏覽器則銷燬 具體的區別在於 關閉網頁後重新打開,localStorage會保留,sessionStorage不會被保留 在頁面內實現跳轉,

sessionstorage , indexeddb , localstorage , cookie , Javascript

一顆冰淇淋 - js面向對象編程,你需要知道這些

javascript中對象由key和value組成,key是標識符,value可以為任意類型 創建對象的方式 1、通過構造函數 var obj = new Object() obj.name = 'alice' obj.age = 18 2、通過字面量 var obj = { name: 'alice', age: 18 } 屬性描述符 對屬性進行精準的操作,比如定義屬性是否可被刪除、遍歷或修

原型 , 構造函數 , 對象 , Javascript

一顆冰淇淋 - 前端模塊化進化史:從全局 function 到 ES Modules

目前,前端開發已經離不開由 CommonJS、ES Modules 和 Webpack 構建的模塊化開發環境。無論是 JavaScript、CSS、圖片還是其他資源,都可以作為一個模塊來處理。那麼,模塊化究竟是如何發展到今天的呢? 全局函數模式 最初的前端模塊化嘗試是通過 全局函數來實現的。例如,在一個 util.js 文件中定義了一個變量 count 和一個工具函數 formatNumberWi

amd , commonjs , es-modules , 前端 , Javascript

一顆冰淇淋 - 徹底弄懂js中this指向(包含js綁定、優先級、面試題詳解)

為什麼要使用this 在javascript中,this可謂是無處不在,它可以用來指向某些元素、對象,在合適的地方使用this,能讓我們減少無用代碼的編寫 varuser={ name:"aclie", sing:function(){ console.log(user.name+'在唱歌') }, dance:function(){ console.log(user.name+'在跳舞') },

this的用法 , this , Javascript

一顆冰淇淋 - 自定義javascript中call、bind、apply方法

call、bind、apply都是Function原型上的方法,用於改變this的指向 自定義函數 js中的call、bind、apply是用c++代碼實現的,我們這裏使用js代碼做一個模式,沒有把所有的邊界情況考慮進來,僅做一個簡單的實現,三個函數在使用的時候有一些需要注意的地方,在定義的時候需要把這些情況考慮進去 當傳入的值是基本數據類型時,call、apply、bind方法會將它轉變成引

this , 前端 , Javascript

一顆冰淇淋 - 全面掌握 Jest:從零開始的測試指南(下篇)

在上一篇測試指南中,我們介紹了Jest 的背景、如何初始化項目、常用的匹配器語法以及鈎子函數的使用。這一篇篇將繼續深入探討 Jest 的高級特性,包括 Mock 函數、異步請求的處理、Mock 請求的模擬、類的模擬以及定時器的模擬、snapshot 的使用。通過這些技術,我們將能夠更高效地編寫和維護測試用例,尤其是在處理複雜異步邏輯和外部依賴時。 Mock 函數 假設存在一個 runCallBac

單元測試 , 自動化測試 , jest , 前端 , Javascript

一顆冰淇淋 - 構建模塊化 CLI:Lerna + Commander 打造靈活的基礎腳手架

在現代軟件開發中,創建 定製化的命令行工具(CLI) 已成為滿足公司業務需求的關鍵一環。這類工具可以輔助執行諸如代碼檢查、項目初始化等任務。為了提高開發效率並簡化維護過程,我們將功能模塊化,並通過多個子包來組織這些功能。本文將介紹如何使用 Lerna 來管理一個多包項目,並基於 Commander 實現一個基礎的 CLI 腳手架框架。 初始化:創建入口文件 項目結構 我們以 ice-basic-c

node.js , 模塊化 , npm , 前端 , Javascript

一顆冰淇淋 - webpack dev server 與 hot module replace 提高開發效率

通過 webpack 命令編譯源代碼時,如果我們對源代碼進行了修改,需要重新執行命令才能看到編譯後的效果。 這樣在開發中非常的影響效率,如果存在一種方式,當文件被修改時,webpack 自動監聽重新編譯,並反饋給開發者,這樣就能更高效的進行開發。 watch 我們通過 webpack 執行命令時,編譯完成之後進程會停止,而 webpack --watch 編譯完成後,不會停止進程,並且當文件內容發

webpack-dev-server , webpack , 前端 , Javascript

一顆冰淇淋 - 抽絲剝繭:詳述一次DevServer Proxy配置無效問題的細緻排查過程

事情的起因是這樣的,在一個已上線的項目中,其中一個包含登錄和獲取菜單的接口因響應時間較長,後端讓我嘗試未經服務轉發的另一域名下的新接口,舊接口允許跨域請求,但新接口不允許本地訪問(只允許發佈測試/生產的域名訪問)。 問題 那麼問題來了,本地環境該如何成功訪問到新的接口並驗證業務功能是否生效呢? 嘗試過程 我首先就想到了直接在 webpack 項目中配置 devServer,並且修改接口地址

webpack-dev-server , node.js , webpack , 前端 , Javascript

一顆冰淇淋 - 從0到1:React項目中的Webpack配置實戰

公司項目一般都是使用集團封裝好的腳手架,腳手架內部實現咱看不到也摸不着,好不容易組內推行新的UI框架,需要自行定義 webpack 配置,這可是個絕佳的好機會,我對配置過程進行了梳理,把商業項目的成熟配置小跑着送上。 初始化 首先新建一個空文件夾,執行 npm init 初始化生成 package.json 文件。 創建 src 文件夾,項目的業務代碼都放在這裏,再創建 index.js,這是項目

react , webpack-dev-server , webpack , 前端 , Javascript

一顆冰淇淋 - gulp使用指南

gulp 是一個使用“流”來實現自動化的工具,正如 官方文檔 首頁展示的這副動圖一樣,以“流動”的狀態去處理 TypeScript、PNG、Markdown 資源。 與webpack比較 類別 webpack gulp 核心理念 module bundler task runner 執行任務 模塊化

gulp , webpack , 前端 , Javascript

一顆冰淇淋 - gulp來處理html、css、js資源啦

gulp 一般用於處理自動化任務,默認情況無法處理模塊化,也不會用於大型項目,但它可以使用各種插件來編譯 html、css、js 等資源。 不清楚如何使用 gulp 開啓任務的朋友可以參考 gulp使用指南 處理html 處理 html 資源使用到 gulp-htmlmin 這個插件,和 webpack中使用到的html-webpack-plugin 比較相似。 // gulpfile.js co

gulp , gulp-babel , webpack , 前端 , Javascript

一顆冰淇淋 - 為react項目添加開發/提交規範(eslint、prettier、husky、commitlint、stylelint)

因歷史遺留原因,接手的項目沒有代碼提醒/格式化,包括 eslint、pretttier,也沒有 commit 提交校驗,如 husky、commitlint、stylelint,與其期待自己或者同事的代碼寫得完美無缺,不如通過一些工具來進行規範和約束。 eslint eslint 是一個代碼校驗工具,用來規範項目代碼風格。 初始化 通過 npm install eslint 後使用 npx esl

husky , react , commitlint , 前端工程化 , prettier

一顆冰淇淋 - Node.js 構建命令行工具:實現 ls 命令的 -a 和 -l 選項

在日常的前端開發中,我們常常藉助各種基於 Node.js 的腳手架工具來加速項目搭建和維護,比如 create-react-app 可以一鍵初始化一個 React 項目,eslint 則幫助我們保持代碼的整潔和一致。而在公司內部,為了更好地滿足特定業務的需求,我們往往會構建自己的腳手架工具,如自定義的 React 或 Vue 框架、內部使用的代碼檢查工具等。本篇文章來和大家分享一下如何用 Node

node.js , 前端工程化 , 前端 , Javascript

一顆冰淇淋 - 命令行應用開發初學者指南:腳手架篇、UI 庫和交互工具

在日常的前端開發工作中,我們經常依賴各種命令行工具來提高效率和代碼質量。例如,create-react-app 和 eslint 等工具不僅簡化了項目的初始化過程,還能自動執行代碼檢查和格式化任務。當我們使用這些工具時,它們通常會通過一系列互動式的問答來收集必要的信息,從而根據我們的選擇進行相應的配置和安裝。 以 eslint 工具為例(如下圖所示),當你首次運行 eslint --init 命令

node.js , 前端工程化 , commonjs , 前端 , Javascript

一顆冰淇淋 - 提升開發體驗:基於 JSDoc 的 React 項目自動代碼提示方案詳解

需求背景 主管和其他同事基於公司的業務特點,開發了一套自研前端框架。技術選型是 React + JavaScript 的組合,上線後表現還不錯。現在他們想把這個組件庫推廣到其他團隊使用,所以讓我琢磨一下:怎麼能讓使用者用得更順手一點?尤其是能不能在寫代碼的時候有自動提示? 我調研了一下市面上常見的幾種方案,大致有以下幾類: 把整個項目從 JavaScript 重構為 TypeScript,這樣

前端工程化 , jsdoc , typescript , 前端 , Javascript

一顆冰淇淋 - 前端框架文檔新思路:基於源碼解析的自動化方案

項目背景 最近我們團隊自研了一個基於 React 的 H5 前端框架,領導讓我來負責編寫框架的使用文檔。我選擇了 dumi 來搭建文檔站點,大部分內容都是手動寫 Markdown 來介紹各種功能,包括:初始化、目錄結構、生命週期、狀態管理、插件系統 等等。 框架裏有個很重要的子包,主要負責多個 App 的橋接能力,深度集成了各端環境的監測和橋接邏輯。這個子包對外提供了一個 App 實例對象,裏面封

node.js , 前端 , Javascript

一顆冰淇淋 - 為React組件庫引入自動化測試:從零到完善的實踐之路

為什麼我們需要測試? 我們的 React+TypeScript 業務組件庫已經穩定運行了一段時間,主要承載各類UI展示組件,如卡片、通知等。項目初期,迫於緊張的開發週期,我們暫時擱置了自動化測試的引入。當時團隊成員對組件邏輯瞭如指掌,即便沒有測試也能遊刃有餘。 然而隨着時間推移,問題逐漸顯現。當新成員加入或老組件需要迭代時,我們常常陷入兩難:修改代碼可能破壞原有功能,但不修改又無法滿足新需求。特別

react , 自動化測試 , typescript , 前端 , Javascript

一顆冰淇淋 - 全面掌握 Jest:從零開始的測試指南(上篇)

隨着JavaScript在前後端開發中的廣泛應用,測試已成為保證代碼質量的關鍵環節。 為什麼需要單元測試 在我們的開發過程中,經常需要定義一些算法函數,例如將接口返回的數據轉換成UI組件所需的格式。為了校驗這些算法函數的健壯性,部分開發同學可能會手動定義幾個輸入樣本進行初步校驗,一旦校驗通過便不再深究。 然而,這樣的做法可能會帶來一些潛在的問題。首先,邊界值的情況往往容易被忽視,導致校驗不夠全面,

自動化測試 , jest , 前端 , Javascript

一顆冰淇淋 - React+TypeScript 組件庫開發全攻略:集成Storybook可視化與Jest測試,一鍵發佈至npm

平時我除了業務需求,偶爾會投入到UI組件的開發中,大多數時候只會負責自己業務場景相關或者一小部分公共組件,極少有從創建項目、集成可視化、測試到發佈的整個過程的操作,這篇文章就是記錄組件開發全流程,UI組件在此僅作為調試用,重點在於集成項目環境。 組件 我們使用 React + TypeScript 來開發UI組件庫,為了簡化 webpack 環境和 Typescript 環境配置,這裏直接使用 c

react , jest , storybook , npm , 前端

一顆冰淇淋 - 構建動態交互式H5導航欄:滑動高亮、吸頂和錨點導航技巧詳解

功能描述 產品要求在h5頁面實現集錨點、吸頂及滑動高亮為一體的功能,如下圖展示的一樣。當頁面滑動時,內容區域對應的選項卡高亮。當點擊選項卡時,內容區域自動滑動到選項卡正下方。 佈局設計 css 佈局 為了更清晰的描述各功能實現的方式,將頁面佈局進行了如下的拆分。 ★ 最外層的元素定義為 contentWrap,是使用 Intersection 定義的觀察根元素。 ★ 所有可縱向滑動的元素包

導航欄 , 錨點 , h5頁面 , 前端 , Javascript

一顆冰淇淋 - antd/fusion表格增加圈選複製功能

背景介紹 我們存在着大量在PC頁面通過表格看數據業務場景,表格又分為兩種,一種是 antd / fusion 這種基於 dom 元素的表格,另一種是通過 canvas 繪製的類似 excel 的表格。 基於 dom 的表格功能豐富較為美觀,能實現多表頭、合併單元格和各種自定義渲染(如表格中渲染圖形 / 按鈕 / 進度條 / 單選框 / 輸入框),以展示為主,不提供圈選、整列複製等功能。 canv

react , ant-design , table , 前端 , Javascript