前端開發筆記與實踐

一、Vue 開發規范與響應式機制

1. 組件命名規范

  • 自定義組件使用大駝峰命名法(如 MyComponent),符合 Vue 官方推薦,便于與原生 HTML 元素區分。

2. Proxy vs defineProperty

特性Proxy(Vue3)Object.defineProperty(Vue2)
攔截范圍支持對象增刪改查等所有基本操作只能監聽已有屬性
數組支持自動攔截數組變異方法需手動重寫數組方法
性能更高效層級嵌套需遞歸處理

Vue3 使用 Proxy 實現更全面的響應式攔截,而 Vue2 依賴 defineProperty 實現有限攔截。

3. 響應式核心流程

  1. Observer:將數據轉換為響應式對象(通過 definePropertyProxy
  2. Watcher:追蹤依賴,記錄哪些函數(如 render)用到了哪些數據
  3. Dep:每個屬性維護一個依賴列表,當屬性變化時通知 Watcher 更新
  4. Scheduler:異步調度更新,避免重復渲染,提高性能

4. 調度器作用

  • 合并多次變更,減少 render 觸發次數
  • 異步執行更新(基于 nextTick 和微任務隊列)
  • 確保每個 Watcher 只執行一次更新

5. Vue3響應式性能對照

操作Vue2 (defineProperty)Vue3 (Proxy)
初始化1000屬性15ms3ms
新增100屬性需要Vue.set直接賦值
數組操作特殊處理原生支持
內存占用每個屬性1KB整個對象3KB

二、CSS 與 SCSS 進階

1. CSS 新單位

單位計算依據典型應用場景
vmin視口寬高中較小值移動端全面屏適配(適配小屏幕)
vmax視口寬高中較大值大屏展示元素尺寸控制(適配寬屏)
dvh動態視口高度解決移動瀏覽器工具欄遮擋問題
svh/lvh小/大視口高度特定視口比例布局
/* 確保元素在任何設備上都可見 */
.modal {width: min(90vw, 800px);height: max(60vh, 400px);/* 移動端避開地址欄 */height: calc(100dvh - 60px);
}

2. SCSS 循環與變量

$num: 20;@for $i from 1 through $num {.btn:nth-child(#{$i}) {transform: scale(0.1 * $i);}
}

三、JavaScript 進階技巧

1. 判斷是否是數組

方法是否可靠說明
Array.isArray()? 推薦ES6 標準方法
obj instanceof Array?受原型鏈影響
Object.prototype.toString.call(obj)?可被 Symbol.toStringTag 修改

2. 稀疏數組判斷

function isSparseArray(arr) {if (!Array.isArray(arr)) return false;for (let i = 0; i < arr.length; i++) {if (!(i in arr)) return true;}return false;
}

3. 數組去空字符串

const arr = ['', '1'];
const filtered = arr.filter(Boolean); // ['1']

4. 字符串路徑轉類名

const path = 'view/home/index';
const className = path.split('/').join('-'); // view-home-index

5. 垃圾回收機制

  • 垃圾判定:不可達內存
  • 回收策略
    • 引用計數(易產生循環引用泄漏)
    • 標記清除(主流瀏覽器采用)
  • 閉包問題:詞法環境未釋放導致內存膨脹
  • 手動釋放:將引用設為 null

四、TypeScript 技巧

1. 函數參數類型約束

const obj = {age: 18,name: 'zhangsan'
};function fn(key: keyof typeof obj) {const v = obj[key];
}

2. 獲取三方庫函數參數/返回值類型

import { fn } from "some-lib";type FnParams = Parameters<typeof fn>[0]; // 獲取第一個參數類型
type FnReturn = ReturnType<typeof fn>;   // 獲取返回值類型

3. 元組生成聯合類型

const obj = {a: 1,b: 2,z: 36
};
type KeysType = keyof typeof obj; // 'a' | 'b' | ... | 'z'function getValue(key: KeysType) {console.log(obj[key]);
}

五、文件上傳與下載

1. 文件上傳交互方式

  • 多選:<input type="file" multiple>

  • 文件夾選擇:<input type="file" webkitdirectory mozdirectory odirectory>

  • 拖拽上傳:

    div.ondragover = e => e.preventDefault();
    div.ondrop = e => {e.preventDefault();for (const item of e.dataTransfer.items) {const entry = item.webkitGetAsEntry();if (entry.isFile) {entry.file(file => console.log(file));} else {const reader = entry.createReader();reader.readEntries(entries => console.log(entries));}}
    };
    
  • 拖拽上傳增強版

    class AdvancedDropzone {constructor(selector) {this.el = document.querySelector(selector);this.setupEvents();this.preview = this.createPreview();}setupEvents() {this.el.addEventListener('dragover', this.highlight.bind(this));this.el.addEventListener('dragleave', this.unhighlight.bind(this));this.el.addEventListener('drop', this.handleDrop.bind(this));}async handleDrop(e) {e.preventDefault();this.unhighlight();const entries = Array.from(e.dataTransfer.items).map(item => item.webkitGetAsEntry());const files = [];for (const entry of entries) {if (entry.isFile) {files.push(this.getFile(entry));} else {files.push(...await this.traverseDirectory(entry));}}this.previewFiles(files);}async traverseDirectory(dir) {const reader = dir.createReader();const entries = await new Promise(resolve => {reader.readEntries(resolve);});const files = [];for (const entry of entries) {if (entry.isFile) {files.push(await this.getFile(entry));} else {files.push(...await this.traverseDirectory(entry));}}return files;}
    }
    
  • 大文件分片上傳

    class ChunkedUploader {constructor(file, options = {}) {this.file = file;this.chunkSize = options.chunkSize || 5 * 1024 * 1024;this.concurrent = options.concurrent || 3;this.chunks = Math.ceil(file.size / this.chunkSize);this.queue = [];}async upload() {const chunks = Array.from({ length: this.chunks }, (_, i) => i);const results = await pMap(chunks, this.uploadChunk.bind(this), {concurrency: this.concurrent});return this.finalize();}async uploadChunk(index) {const start = index * this.chunkSize;const end = Math.min(start + this.chunkSize, this.file.size);const chunk = this.file.slice(start, end);const form = new FormData();form.append('chunk', chunk);form.append('index', index);form.append('total', this.chunks);await axios.post('/upload', form, {onUploadProgress: this.createProgressHandler(index),__chunkIndex: index});}
    }
    

2. 文件上傳網絡請求

方式支持進度支持取消
XHR / Axios? 上傳/下載?
Fetch? 下載?(AbortController)

3. 文件下載方式

  • <a> 標簽下載(同源限制):

    <a href="http://xxx.pdf" download>Download</a>
    
  • Blob + URL.createObjectURL(跨域無 token 限制):

    fetch(url).then(res => res.blob()).then(blob => {const url = URL.createObjectURL(blob);const a = document.createElement('a');a.href = url;a.download = 'file.pdf';a.click();URL.revokeObjectURL(url);
    });
    

六、性能優化技巧

1. 環境兼容性封裝(一次性判斷)

const addEvent = (() => {if (ele.addEventListener) {return (ele, eventName, handler) => ele.addEventListener(eventName, handler);} else if (ele.attachEvent) {return (ele, eventName, handler) => ele.attachEvent('on' + eventName, handler);} else {return (ele, eventName, handler) => ele['on' + eventName] = handler;}
})();

2. Token 無感刷新方案

  1. 請求失敗且為 401 錯誤
  2. 檢查是否為刷新接口本身 → 是則跳過
  3. 若已有刷新 Promise 存在 → 復用
  4. 發起刷新請求 → 替換新 token 重新發起原始請求
  5. 失敗 → 清除 token 跳轉登錄頁
let refreshPromise: Promise<any> | null = null;export async function refreshToken() {if (refreshPromise) return refreshPromise;refreshPromise = new Promise(async resolve => {try {const res = await axios.get('/refresh_token', {headers: { Authorization: `Bearer ${getRefreshToken()}` },__isRefreshToken: true});if (res.code === 0) resolve(true);else resolve(false);} catch (e) {resolve(false);} finally {refreshPromise = null;}});return refreshPromise;
}

七、擴展知識

1. 單點登錄(SSO)與 JWT 關系

  • 單點登錄:用戶只需登錄一次即可訪問多個系統
  • JWT:是一種 Token 生成與驗證機制,常用于身份認證
  • 關系:JWT 可作為 SSO 的 Token 實現方式之一,但二者沒有必然聯系

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/81513.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/81513.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/81513.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何給PSCAD添加庫文件

1、點擊Options 2、選擇藍色的選項 3、查看Intel(R) Visual Fortran Compiler XE 的版本 4、打開原文件的Library 5、打開 6、點擊這個文件的右鍵 7、然后選擇第一項project setting 9、先把第8步中link里面原有的路徑刪除&#xff0c;再點browes[A1] &#xff0c;然后選擇 [A…

milvus+flask山寨《從零構建向量數據庫》第7章case2

繼續流水賬完這本書&#xff0c;這個案例是打造文字形式的個人知識庫雛形。 create_context_db: # Milvus Setup Arguments COLLECTION_NAME text_content_search DIMENSION 2048 MILVUS_HOST "localhost" MILVUS_PORT "19530"# Inference Arguments…

【第一篇】 創建SpringBoot工程的四種方式

簡介&#xff1a; 通過此篇博客你可以使用任何方式進行創建 SpringBoot 項目&#xff0c;并且在文章的最后附上答疑解惑一節&#xff0c;為你排除在使用過程中發生的常見問題。文章內容若存在錯誤或需改進的地方&#xff0c;歡迎大家指正&#xff01;若對操作有任何疑問歡迎留言…

GPT( Generative Pre-trained Transformer )模型:基于Transformer

GPT是由openAI開發的一款基于Transformer架構的預訓練語言模型&#xff0c;擁有強大的生成能力和多任務處理能力&#xff0c;推動了自然語言處理&#xff08;NLP&#xff09;的快速發展。 一 GPT發展歷程 1.1 GPT-1&#xff08;2018年&#xff09; 是首個基于Transformer架構…

網絡檢測工具InternetTest v8.9.1.2504 單文件版,支持一鍵查詢IP/DNS、WIFI密碼信息

—————【下 載 地 址】——————— 【?本章下載一】&#xff1a;https://drive.uc.cn/s/295e068b79314 【?本章下載二】&#xff1a;https://pan.xunlei.com/s/VOQDXguH0DYPxrql5y2zlkhTA1?pwdg2nx# 【百款黑科技】&#xff1a;https://ucnygalh6wle.feishu.cn/wiki/…

CSS- 4.1 浮動(Float)

本系列可作為前端學習系列的筆記&#xff0c;代碼的運行環境是在HBuilder中&#xff0c;小編會將代碼復制下來&#xff0c;大家復制下來就可以練習了&#xff0c;方便大家學習。 HTML系列文章 已經收錄在前端專欄&#xff0c;有需要的寶寶們可以點擊前端專欄查看&#xff01; 點…

配置WebStorm鍵盤快捷鍵

目錄 配置快捷鍵添加鍵盤快捷鍵添加鼠標快捷鍵添加縮寫重置為默認快捷鍵 禁用雙快捷鍵用戶快捷鍵的保存位置與操作系統沖突 配置快捷鍵 WebStorm包含預定義的快捷鍵&#xff0c;同時允許自定義快捷鍵。要查看快捷鍵配置&#xff0c;請打開“設置”對話框&#xff0c;然后選擇K…

Java 21 + Spring Boot 3.5:AI驅動的高性能框架實戰

簡介 在微服務架構日益普及的今天,如何構建一個既高性能又具備AI驅動能力的后端系統成為開發者關注的焦點。本篇文章將深入探討Java 21與Spring Boot 3.5的結合,展示如何通過Vector API和JIT優化實現單線程性能提升30%,并利用飛算JavaAI生成智能重試機制和超時控制代碼,解…

Matrix-Game:鍵鼠實時控制、實時生成的游戲生成模型(論文代碼詳細解讀)

1.簡介 本文介紹了一種名為Matrix-Game的交互式世界基礎模型&#xff0c;專門用于可控的游戲世界生成。 Matrix-Game通過一個兩階段的訓練流程來實現&#xff1a;首先進行大規模無標簽預訓練以理解環境&#xff0c;然后進行動作標記訓練以生成交互式視頻。為此&#xff0c;研…

AI生成信息準確性,Ask-Refine提問策略,Agent最少的工具箱是什么樣的?

關于AI生成信息準確性的探討 在社群聊天記錄中&#xff0c;用戶提出在使用多種AI工具搜索培生出版企業上市信息時&#xff0c;遇到80%信息錯誤的問題&#xff0c;質疑AI為何無法勝任簡單的網絡信息爬取任務&#xff0c;并表達了對AI實用性的期望。 我抽空對此做出解答&#xff…

Linux系統中部署java服務(docker)

1、不使用docker ? 1. 檢查并安裝 Java 環境 檢查 Java 是否已安裝&#xff1a; java -version? 2. 上傳 Java 項目 JAR 文件 可以創建一個server文件夾&#xff0c;然后上傳目錄 查看當前目錄 然后創建目錄上傳jar包 ? 3. 啟動 Java 服務 java -jar hywl-server.jar…

遨游科普:三防平板是什么?有什么功能?

清晨的露珠還掛在帳篷邊緣&#xff0c;背包里的三防平板卻已開機導航&#xff1b;工地的塵土飛揚中&#xff0c;工程師正通過它查看施工圖紙&#xff1b;暴雨傾盆的救援現場&#xff0c;應急隊員用它實時回傳災情數據……這些看似科幻的場景&#xff0c;正因三防平板的普及成為…

Flask Docker Demo 項目指南

首先&#xff0c;創建一個新的項目目錄并創建必要的文件&#xff1a; mkdir flask-docker-demo cd flask-docker-demo創建一個簡單的Flask應用 (app.py)&#xff1a; from flask import Flaskapp Flask(__name__)app.route(/) def hello_world():return Hello, Docker World…

GO語言語法---if語句

文章目錄 1. 基本語法1.1 單分支1.2 雙分支1.3 多分支 2. Go特有的if語句特性2.1 條件前可以包含初始化語句2.2 條件表達式不需要括號2.3 必須使用大括號2.4 判斷語句所在行數控制 Go語言的if語句用于條件判斷&#xff0c;與其他C風格語言類似&#xff0c;但有一些獨特的語法特…

自動化 NuGet 包打包與上傳:完整批處理腳本詳解(含 SVN 支持)

在大型項目中&#xff0c;我們常常需要定期打包多個 .csproj 項目為 NuGet 包&#xff0c;并上傳到私有 NuGet 服務。這篇文章分享一份實戰腳本&#xff0c;支持以下自動化流程&#xff1a; 自動讀取、更新 .csproj 文件中的 Version、PackageOutputPath 等節點&#xff1b; 自…

刷leetcodehot100返航版--雙指針5/16

for (int i 0, j 0; i < n; i ) { while (j < i && check(i, j)) j ; // 具體問題的邏輯 } 常見問題分類&#xff1a; (1) 對于一個序列&#xff0c;用兩個指針維護一段區間 (2) 對于兩個序列&#xff0c;維護某種次序&#xff0c;比如歸并排序中…

手撕四種常用設計模式(工廠,策略,代理,單例)

工廠模式 一、工廠模式的總體好處 解耦&#xff1a;客戶端與具體實現類解耦&#xff0c;符合“開閉原則”。統一創建&#xff1a;對象創建交由工廠處理&#xff0c;便于集中控制。增強可維護性&#xff1a;新增對象種類時不需要大改動調用代碼。便于擴展&#xff1a;易于管理…

阿里通義萬相 Wan2.1-VACE:開啟視頻創作新境界

2025 年 5 月 14 日&#xff0c;阿里巴巴為視頻創作領域帶來了重磅驚喜 —— 開源通義萬相 Wan2.1-VACE。這一模型堪稱視頻生成與編輯領域的集大成者&#xff0c;憑借其全面且強大的功能&#xff0c;為廣大創作者、開發者以及企業用戶開辟了全新的視頻創作天地。它打破了以往視…

自定義類、元組、字典和結構體對比——AutoCAD C# 開發中建立不同對象之間的聯系

以下是對它們的詳細分析和對比&#xff1a; 1. 自定義類&#xff08;Class&#xff09; 優勢 封裝性強&#xff1a;可以定義字段、屬性、方法和事件&#xff0c;實現復雜的行為和邏輯。繼承與多態&#xff1a;支持繼承體系&#xff0c;可通過接口或抽象類實現多態。引用類型…

MVC架構模式

mvc架構是一種常見的開發模式,以下是三個核心部分 Model&#xff08;模型&#xff09;&#xff1a;負責應用程序的數據和業務邏輯。它與數據庫交互&#xff0c;處理數據的存儲、檢索和更新&#xff0c;是應用程序的核心業務所在。View&#xff08;視圖&#xff09;&#xff1a…