中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

夏天做啥網(wǎng)站能致富sem優(yōu)化師

夏天做啥網(wǎng)站能致富,sem優(yōu)化師,設(shè)計(jì)之家網(wǎng),什么網(wǎng)站時(shí)候做偽靜態(tài)自我介紹 您好,面試官!我叫[您的姓名],非常榮幸能有機(jī)會(huì)參加這次面試。 在過(guò)去的 3 年里,我一直專(zhuān)注于前端開(kāi)發(fā)領(lǐng)域,積累了豐富的實(shí)踐經(jīng)驗(yàn)。 在 Vue.js 項(xiàng)目中,我能夠熟練運(yùn)用組件化開(kāi)發(fā)模式,實(shí)…

自我介紹

您好,面試官!我叫[您的姓名],非常榮幸能有機(jī)會(huì)參加這次面試。
在過(guò)去的 3 年里,我一直專(zhuān)注于前端開(kāi)發(fā)領(lǐng)域,積累了豐富的實(shí)踐經(jīng)驗(yàn)。
在 Vue.js 項(xiàng)目中,我能夠熟練運(yùn)用組件化開(kāi)發(fā)模式,實(shí)現(xiàn)高效的代碼復(fù)用和維護(hù)。對(duì)于 React,我也相信我能迅速上手并開(kāi)發(fā)出功能完善的組件。我對(duì)新技術(shù)始終保持著濃厚的興趣和學(xué)習(xí)熱情,不斷探索和嘗試將最新的前端技術(shù)應(yīng)用到實(shí)際項(xiàng)目中。我相信,我的技能和經(jīng)驗(yàn)?zāi)軌驗(yàn)橘F公司的前端項(xiàng)目帶來(lái)價(jià)值。

前端性能優(yōu)化

前端性能優(yōu)化是提高網(wǎng)站或應(yīng)用程序用戶體驗(yàn)的重要方面,以下是一些常見(jiàn)的前端性能優(yōu)化方法:

1.常見(jiàn)優(yōu)化

  1. 壓縮Code Minification)和合并文件
    壓縮 CSS(MiniCssExtractPlugin+cssnano)、JavaScript(TerserPlugin) 和 HTML 文件,減少文件大小,加快加載速度。
    合并多個(gè) CSS 和 JavaScript 文件,減少請(qǐng)求數(shù)量。

  2. 圖片優(yōu)化(+base 64 asset)
    選擇合適的圖片格式(如 JPEG、PNG、WebP 等),根據(jù)圖片內(nèi)容和用途進(jìn)行選擇。
    壓縮圖片大小,不影響視覺(jué)效果的前提下減少圖片的像素和質(zhì)量。
    使用懶加載(Lazy Loading)技術(shù),只在圖片進(jìn)入視口時(shí)加載。

  3. 緩存策略
    設(shè)置適當(dāng)?shù)?HTTP 緩存頭,讓瀏覽器緩存靜態(tài)資源,避免重復(fù)請(qǐng)求。
    利用 cache (HardSourceWebpackPlugin、persistentCache)選項(xiàng)啟用緩存,提高構(gòu)建速度。為輸出的文件添加 contenthash ,以便瀏覽器有效地利用緩存。
    使用 Service Workers 實(shí)現(xiàn)離線緩存和更靈活的緩存控制。

  4. 代碼優(yōu)化
    優(yōu)化 JavaScript 代碼,避免不必要的計(jì)算和循環(huán)。
    去除未使用的 CSS 代碼,減少樣式表的大小。

  5. 減少 HTTP 請(qǐng)求
    盡量減少頁(yè)面中的圖片、腳本、樣式表等資源的請(qǐng)求數(shù)量。

  6. 異步加載
    對(duì)于非關(guān)鍵的 JavaScript 腳本,使用異步加載(如 defer 或 async 屬性),不阻塞頁(yè)面渲染。
    在這里插入圖片描述

  7. 優(yōu)化 CSS 和 JavaScript 的加載順序
    將關(guān)鍵的 CSS 放在頁(yè)面頭部加載,以避免頁(yè)面閃爍。
    非關(guān)鍵的 JavaScript 放在頁(yè)面底部加載,不影響頁(yè)面內(nèi)容的呈現(xiàn)。

  8. 使用 CDN(內(nèi)容分發(fā)網(wǎng)絡(luò))
    利用 CDN 加速靜態(tài)資源的加載,減少網(wǎng)絡(luò)延遲。

  9. 減少 DOM 操作
    避免頻繁的 DOM 讀寫(xiě)操作,盡量一次性修改 DOM。

2.Webpack優(yōu)化

  1. 代碼分離(Code Splitting):
    利用 splitChunks 插件將代碼分割成多個(gè)塊,例如將第三方庫(kù)與業(yè)務(wù)代碼分離,或者將不同路由的模塊分離。
  2. 動(dòng)態(tài)導(dǎo)入(Dynamic Imports):使用 import() 函數(shù)實(shí)現(xiàn)按需加載模塊。
  3. css/js代碼壓縮
  4. cache緩存
  5. 優(yōu)化模塊解析(Module Resolution Optimization):
    合理配置 resolve 選項(xiàng),如設(shè)置 extensions 減少文件擴(kuò)展名的嘗試,指定 modules 減少模塊搜索路徑。

網(wǎng)絡(luò)篇

1. 三次握手,四次揮手。為什么要三次握手,四次揮手,兩次不行嗎?為什么四次揮手比三次握手多一次?

三次握手

三次握手是 TCP 協(xié)議建立連接時(shí)使用的一種機(jī)制。
具體過(guò)程如下: 第一次握手:客戶端向服務(wù)端發(fā)送一個(gè)帶有 SYN標(biāo)志位的數(shù)據(jù)包,表示客戶端想要建立連接,同時(shí)初始化序列號(hào)(seq)。
第二次握手:服務(wù)端收到客戶端的 SYN 數(shù)據(jù)包后,向客戶端發(fā)送一個(gè)帶有SYN 和 ACK 標(biāo)志位的數(shù)據(jù)包,確認(rèn)客戶端的請(qǐng)求,并也初始化自己的序列號(hào)(seq),同時(shí)確認(rèn)號(hào)(ack)為客戶端的序列號(hào)加 1。
第三次握手:客戶端收到服務(wù)端的 SYN + ACK 數(shù)據(jù)包后,向服務(wù)端發(fā)送一個(gè)帶有 ACK 標(biāo)志位的數(shù)據(jù)包,確認(rèn)號(hào)為服務(wù)端的序列號(hào)加1,表示客戶端確認(rèn)收到了服務(wù)端的回應(yīng),連接建立成功。

四次揮手

四次揮手是 TCP 協(xié)議斷開(kāi)連接時(shí)使用的機(jī)制。 具體過(guò)程如下:
第一次揮手:客戶端向服務(wù)端發(fā)送一個(gè)帶有 FIN 標(biāo)志位的數(shù)據(jù)包,表示客戶端沒(méi)有數(shù)據(jù)要發(fā)送了,想要關(guān)閉連接。
第二次揮手:服務(wù)端收到客戶端的 FIN 數(shù)據(jù)包后,向客戶端發(fā)送一個(gè)帶有 ACK標(biāo)志位的數(shù)據(jù)包,表示服務(wù)端已經(jīng)收到客戶端的關(guān)閉請(qǐng)求。
第三次揮手:服務(wù)端向客戶端發(fā)送一個(gè)帶有 FIN標(biāo)志位的數(shù)據(jù)包,表示服務(wù)端也沒(méi)有數(shù)據(jù)要發(fā)送了,準(zhǔn)備關(guān)閉連接。
第四次揮手:客戶端收到服務(wù)端的 FIN 數(shù)據(jù)包后,向服務(wù)端發(fā)送一個(gè)帶有 ACK 標(biāo)志位的數(shù)據(jù)包,表示客戶端確認(rèn)收到服務(wù)端的關(guān)閉請(qǐng)求,連接完全關(guān)閉。

為什么要三次握手,兩次不行嗎?

三次握手是必要的,兩次握手不行,原因如下:
兩次握手無(wú)法確認(rèn)雙方的接收和發(fā)送能力。第一次握手客戶端表明能發(fā)送,但服務(wù)端不知道客戶端能接收。第二次握手服務(wù)端表明能接收和發(fā)送,但客戶端不知道服務(wù)端能接收。
兩次握手可能導(dǎo)致錯(cuò)誤的連接建立。如果網(wǎng)絡(luò)延遲,舊的請(qǐng)求到達(dá)服務(wù)端,服務(wù)端以為是新的請(qǐng)求而建立連接,會(huì)造成資源浪費(fèi)和錯(cuò)誤。

 為什么四次揮手比三次握手多一次?

四次揮手比三次握手多一次,主要是因?yàn)樵?strong>關(guān)閉連接時(shí),雙方的數(shù)據(jù)傳輸狀態(tài)不同。
在三次握手建立連接時(shí),服務(wù)端收到客戶端的連接請(qǐng)求并確認(rèn)后,可以直接將 SYN 和 ACK一起發(fā)送,因?yàn)榇藭r(shí)服務(wù)端不需要額外處理未完成的數(shù)據(jù)傳輸。 而在四次揮手關(guān)閉連接時(shí),當(dāng)客戶端發(fā)送 FIN表示沒(méi)有數(shù)據(jù)要發(fā)送后,服務(wù)端可能還有數(shù)據(jù)需要繼續(xù)發(fā)送,所以不能立即發(fā)送 FIN 關(guān)閉連接,而是先回復(fù) ACK 確認(rèn)客戶端的關(guān)閉請(qǐng)求。等服務(wù)端數(shù)據(jù)發(fā)送完畢,再發(fā)送 FIN 表示自己也可以關(guān)閉了。因此,關(guān)閉連接時(shí)需要多一次交互。
例如,在一個(gè)客戶端與服務(wù)端進(jìn)行實(shí)時(shí)通信的場(chǎng)景中,客戶端發(fā)送完所有消息并想要關(guān)閉連接(第一次揮手),服務(wù)端收到請(qǐng)求后先回復(fù) ACK
表示知道了(第二次揮手),但此時(shí)服務(wù)端可能還有未發(fā)送完的消息,等發(fā)送完后才發(fā)送 FIN 表示自己也準(zhǔn)備關(guān)閉(第三次揮手),客戶端最后回復(fù)
ACK 完成關(guān)閉(第四次揮手)。

2.http,協(xié)議,狀態(tài)碼。http1.0跟 http2.0 的區(qū)別,http跟https的區(qū)別

HTTP 協(xié)議

HTTP(HyperText Transfer Protocol,超文本傳輸協(xié)議)是用于在 Web
上傳輸數(shù)據(jù)的應(yīng)用層協(xié)議。它定義了客戶端和服務(wù)器之間如何進(jìn)行請(qǐng)求和響應(yīng)的交互。

HTTP狀態(tài)碼

200:成功 301:表示請(qǐng)求的資源已被永久移動(dòng)到新的 URL,客戶端應(yīng)使用新的 URL 訪問(wèn)
302:表示請(qǐng)求的資源臨時(shí)被移動(dòng)到了其他位置,客戶端應(yīng)繼續(xù)使用原有 URL 進(jìn)行訪問(wèn)
400、401、403、404:(客戶端)語(yǔ)法出錯(cuò)、需要認(rèn)證、沒(méi)有權(quán)限、找不到 500:(服務(wù)端)出錯(cuò)

301和302狀態(tài)碼區(qū)別

301 Moved Permanently(永久移動(dòng))

含義:表示請(qǐng)求的資源已被永久移動(dòng)到新的 URL地址。搜索引擎等爬蟲(chóng)會(huì)將鏈接權(quán)重傳遞到新的 URL 。 緩存:瀏覽器和搜索引擎會(huì)記住這個(gè)重定向,下次訪問(wèn)相同的請(qǐng)求時(shí)會(huì)直接訪問(wèn)新的 URL ,不會(huì)再向原 URL 發(fā)送請(qǐng)求。
影響:對(duì) SEO(搜索引擎優(yōu)化)有較大影響,因?yàn)樗阉饕鏁?huì)認(rèn)為原 URL 已失效,將權(quán)重轉(zhuǎn)移到新的 URL 。
示例:如果一個(gè)網(wǎng)站的域名發(fā)生了永久性的變更,從 olddomain.com 變更為 newdomain.com ,服務(wù)器就會(huì)返回 301 狀態(tài)碼,并告知客戶端新的域名地址。

302 Found(臨時(shí)移動(dòng))

含義:表示請(qǐng)求的資源臨時(shí)被移動(dòng)到了另一個(gè) URL 。
緩存:瀏覽器在接收到 302 響應(yīng)時(shí),不會(huì)自動(dòng)將后續(xù)請(qǐng)求重定向到新的 URL,每次請(qǐng)求都會(huì)先訪問(wèn)原 URL ,由服務(wù)器再次返回 302 重定向到新的地址。
影響:對(duì) SEO 的影響相對(duì)較小,搜索引擎不會(huì)將原 URL 的權(quán)重立即傳遞給新的 URL ,因?yàn)樗J(rèn)為這只是臨時(shí)的重定向。
示例:在網(wǎng)站進(jìn)行臨時(shí)維護(hù)或活動(dòng)期間,將某些頁(yè)面臨時(shí)重定向到其他頁(yè)面時(shí),可能會(huì)使用 302 狀態(tài)碼。

例如,假設(shè)一個(gè)電商網(wǎng)站進(jìn)行系統(tǒng)升級(jí),預(yù)計(jì)需要幾個(gè)小時(shí),在此期間,訪問(wèn)商品詳情頁(yè)可能會(huì)被 302 臨時(shí)重定向到一個(gè)通知頁(yè)面。而如果該電商網(wǎng)站決定永久關(guān)閉某個(gè)商品分類(lèi),并將相關(guān)頁(yè)面永久重定向到新的分類(lèi)頁(yè)面,就會(huì)使用 301 狀態(tài)碼。

HTTP1和HTTP2的區(qū)別
  1. 多路復(fù)用:2支持多個(gè)請(qǐng)求和響應(yīng)在一個(gè)連接上并發(fā)處理1每次都需要建立
  2. 請(qǐng)求頭壓縮:2頭部信息壓縮,減少傳輸?shù)臄?shù)據(jù)量二進(jìn)制分幀:2將請(qǐng)求和響應(yīng)分割為更小的幀,并進(jìn)行二進(jìn)制編碼傳輸效率
  3. 服務(wù)器推送:服務(wù)器可以主動(dòng)向客戶端推送資源,而無(wú)需等待客戶端請(qǐng)求。

HTTP和HTTPS的區(qū)別

  1. 安全:https通過(guò)ssl/tls協(xié)議對(duì)數(shù)據(jù)進(jìn)行加密,保證了數(shù)據(jù)的機(jī)密性和完整性,防止數(shù)據(jù)盜取和篡改,http使用的是明文傳輸不安全
  2. 端口:http端口80,https端口443
  3. 證書(shū):使用https時(shí)服務(wù)器需要配置數(shù)字證書(shū)來(lái)進(jìn)行身份驗(yàn)證,而http則不需要
    例如:在線支付場(chǎng)景可以使用https更為嚴(yán)謹(jǐn),而一般的網(wǎng)站http就可以

3.當(dāng)輸入地址后瀏覽器做哪些操作

地址解析—建立tcp連接—發(fā)送http請(qǐng)求—接收服務(wù)器響應(yīng)—處理響應(yīng)—
顯示頁(yè)面—后續(xù)交互
  1. 地址解析
    檢查地址格式是否正確
    如果使用的是域名,那就去DNC(域名系統(tǒng))服務(wù)器發(fā)送求情,獲取該域名對(duì)應(yīng)的Ip地址,如果使用的Ip則直接拿IP簡(jiǎn)歷TCP連接

  2. 建立TCP連接
    瀏覽器通過(guò)獲取IP地址和端口(http端口80,https端口443)去向服務(wù)段建立tcp連接(3次握手:客SYN-服‘發(fā)送建立請(qǐng)求’服SYN+ACK-客‘確認(rèn)請(qǐng)求’客ACK-服‘收到服務(wù)端確認(rèn),建立連接’)

  3. 發(fā)送HTTP請(qǐng)求
    Tcp連接成功后瀏覽器會(huì)構(gòu)建http請(qǐng)求報(bào)文,里面包括請(qǐng)求方式(post,get)、URL、請(qǐng)求頭(包含各種信息、如接受的內(nèi)容格式)和可能需要的請(qǐng)求體(例post請(qǐng)求需要傳一些請(qǐng)求參數(shù));將這個(gè)請(qǐng)求通過(guò)已建立的TCP發(fā)送給服務(wù)端

  4. 接受服務(wù)器響應(yīng)
    服務(wù)器接收到請(qǐng)求后,會(huì)處理請(qǐng)求并返回一個(gè)http響應(yīng)
    瀏覽器接收這個(gè)響應(yīng),并解析響應(yīng)體和響應(yīng)頭

  5. 處理響應(yīng)
    如果響應(yīng)狀態(tài)為成功(如200),瀏覽器會(huì)根據(jù)響應(yīng)頭中的內(nèi)容類(lèi)型來(lái)處理響應(yīng)體

  6. 顯示頁(yè)面
    將從服務(wù)器獲取的數(shù)據(jù)放在頁(yè)面上并進(jìn)行渲染,最后頁(yè)面展示最新的內(nèi)容

  7. 后續(xù)交互
    如果頁(yè)面上用其他資源(圖片、css、js),瀏覽器會(huì)再次發(fā)送請(qǐng)求獲取該些資源
    例如,當(dāng)您輸入一個(gè)電商網(wǎng)站的地址,瀏覽器首先解析并獲取服務(wù)器的 IP 地址,建立連接后發(fā)送請(qǐng)求獲取首頁(yè)的 HTML 文檔。然后根據(jù)文檔中的資源鏈接繼續(xù)獲取圖片、樣式表和腳本等,逐步構(gòu)建并顯示完整的頁(yè)面供您瀏覽和交互。

4.TCP,UDP有什么區(qū)別

TCP(Transmission Control Protocol,傳輸控制協(xié)議)
UDP(User Datagram Protocol,用戶數(shù)據(jù)報(bào)協(xié)議)是兩種常見(jiàn)的傳輸層協(xié)議
它們有以下主要區(qū)別:
  1. 連接性:
    TCP是面向連接的協(xié)議,在數(shù)據(jù)傳輸之前需要先建立連接,通過(guò)三次握手建立可靠的連接。
    UDP是無(wú)連接的協(xié)議,不需要事先建立連接,直接發(fā)送數(shù)據(jù)
  2. 可靠性:
    TCP提供可靠的數(shù)據(jù)傳輸,通過(guò)確認(rèn)。重傳、排序和流量控制機(jī)制,確保數(shù)據(jù)準(zhǔn)確無(wú)誤和按序到達(dá)
    UDP不保證可靠的交付,可能出現(xiàn)丟包、亂序的情況
  3. 頭部開(kāi)銷(xiāo):
    TCP頭部開(kāi)銷(xiāo)比較大,通常20個(gè)字節(jié)
    UDP頭部開(kāi)銷(xiāo)比較小,通常8個(gè)字節(jié)
  4. 應(yīng)用場(chǎng)景:
    TCP適用于數(shù)據(jù)準(zhǔn)確和可靠行要求較高的應(yīng)用:文件傳輸、電子郵箱、遠(yuǎn)程登陸
    UDP適用于對(duì)實(shí)時(shí)性要求比較高的如視頻會(huì)議、直播、在線游戲、實(shí)施音頻

5.Cors請(qǐng)求頭

CORS(跨域資源共享)請(qǐng)求頭是一組 HTTP 頭字段
用于解決瀏覽器的同源策略限制,實(shí)現(xiàn)跨域請(qǐng)求。

當(dāng)一個(gè)請(qǐng)求的 URL 的協(xié)議、域名、端口三者之間任意一個(gè)與當(dāng)前頁(yè)面地址不同時(shí),就會(huì)產(chǎn)生跨域問(wèn)題。為了允許跨域請(qǐng)求,服務(wù)器需要在響應(yīng)中添加特定的 CORS請(qǐng)求頭,告訴瀏覽器該請(qǐng)求可以跨域訪問(wèn)資源。

為了允許跨域請(qǐng)求,服務(wù)器需要在響應(yīng)中添加特定的 CORS 請(qǐng)求頭,告訴瀏覽器該請(qǐng)求可以跨域訪問(wèn)資源。
常見(jiàn)的 CORS 請(qǐng)求頭包括:

Access-Control-Allow-Origin:指定允許訪問(wèn)該資源的源(Origin),可以是具體的域名(如http://example.com)或通配符*(表示允許任何源訪問(wèn))。
Access-Control-Allow-Methods:指定允許的跨域請(qǐng)求方法,如GET、POSTPUT、DELETE等,多個(gè)方法之間用逗號(hào)分隔。
Access-Control-Allow-Headers:指定允許的跨域請(qǐng)求頭字段,多個(gè)字段之間用逗號(hào)分隔。
Access-Control-Expose-Headers:指定客戶端可以訪問(wèn)的額外響應(yīng)頭字段。
Access-Control-Max-Age:指定預(yù)檢請(qǐng)求(Preflight request)的結(jié)果可以被緩存的時(shí)間(以秒為單位),在緩存有效期內(nèi),瀏覽器無(wú)需再次發(fā)送預(yù)檢請(qǐng)求。
Access-Control-Allow-Credentials:當(dāng)需要跨域發(fā)送 Cookie 或其他憑證信息時(shí),將該字段設(shè)置為true。但需注意,如果設(shè)置了該字段為true,Access-Control-Allow-Origin不能設(shè)置為通配符*,而必須指定具體的域名。

6.Get,POST請(qǐng)求

  1. 數(shù)據(jù)傳遞
    Get:掛在瀏覽器的地址欄上面
    Post:將數(shù)據(jù)放在請(qǐng)求體中進(jìn)行傳遞
  2. 數(shù)據(jù)長(zhǎng)度受限
    Get:受到url長(zhǎng)度限制,不適合傳大量的數(shù)據(jù)
    Post:不受限制,可以傳輸大量數(shù)據(jù)
  3. 安全性
    Get安全性差url上不適合傳敏感信息post數(shù)據(jù)在請(qǐng)求體內(nèi)相對(duì)更安全
  4. 用途
    Get:常用于獲取數(shù)據(jù),如查詢(xún)操作
    Post:常用于提交數(shù)據(jù),表單或上傳文件等

7.CSRF,XSS攻擊

CSRF(Cross-Site Request Forgery,跨站請(qǐng)求偽造)和
XSS(Cross-Site Scripting,跨站腳本攻擊)是兩種常見(jiàn)的 Web 安全攻擊方式。

CSRF 攻擊是指攻擊者誘導(dǎo)受害者在已經(jīng)登錄的 Web 應(yīng)用程序中執(zhí)行他們事先精心構(gòu)造的惡意請(qǐng)求。例如,攻擊者可能構(gòu)造一個(gè)惡意的鏈接或表單,當(dāng)受害者在登錄狀態(tài)下點(diǎn)擊或提交時(shí),會(huì)在受害者不知情的情況下執(zhí)行一些危險(xiǎn)操作,如修改密碼、轉(zhuǎn)賬等。
XSS 攻擊則是指攻擊者通過(guò)在目標(biāo)網(wǎng)站注入惡意腳本代碼,當(dāng)其他用戶訪問(wèn)該網(wǎng)站時(shí),惡意腳本會(huì)在用戶瀏覽器中執(zhí)行,從而獲取用戶的敏感信息(如 Cookie、會(huì)話令牌等)、篡改頁(yè)面內(nèi)容或進(jìn)行其他惡意操作。
為了防范這兩種攻擊,可以采取多種措施:

如驗(yàn)證請(qǐng)求來(lái)源、設(shè)置 CSRF 令牌、對(duì)用戶輸入進(jìn)行嚴(yán)格的過(guò)濾和轉(zhuǎn)義、設(shè)置 HttpOnly 屬性防止 Cookie 被腳本獲取等。

8.HTTP緩存

HTTP 緩存是一種用于提高 Web 應(yīng)用性能和減少網(wǎng)絡(luò)帶寬使用的機(jī)制。

  1. 強(qiáng)緩存
    通過(guò) Expires 和 Cache-Control 響應(yīng)頭來(lái)控制。
    Expires 指明資源的過(guò)期時(shí)間。
    Cache-Control 可以設(shè)置更精確的緩存策略,如 max-age 表示資源在多少秒內(nèi)有效。

    <meta
    http-equiv="Cache-Control" 
    content="max-age=31536000" /><metahttp-equiv="Expires"content="Thu, 31 Dec 2030 23:59:59 GMT" />
    

    當(dāng)緩存未過(guò)期時(shí),瀏覽器直接從本地緩存獲取資源,不會(huì)向服務(wù)器發(fā)送請(qǐng)求。

  2. 協(xié)商緩存
    服務(wù)器通過(guò) Last-Modified 告知瀏覽器資源的最后修改時(shí)間,瀏覽器再次請(qǐng)求時(shí)通過(guò) If-Modified-Since 帶上這個(gè)時(shí)間,服務(wù)器對(duì)比判斷資源是否有更新,如果沒(méi)有則返回 304 狀態(tài)碼,告知瀏覽器使用本地緩存。

    ETag 是服務(wù)器為資源生成的唯一標(biāo)識(shí),瀏覽器下次請(qǐng)求通過(guò) If-None-Match 帶上這個(gè)標(biāo)識(shí),服務(wù)器對(duì)比判斷,決定是否返回新的資源。
    在前端頁(yè)面中設(shè)置(通過(guò) HTML 的 標(biāo)簽)

    例如,一個(gè)網(wǎng)站的圖片設(shè)置了強(qiáng)緩存,有效期為 1 天。當(dāng)用戶在一天內(nèi)再次訪問(wèn)該頁(yè)面時(shí),瀏覽器直接從緩存中讀取圖片,無(wú)需再次從服務(wù)器下載,大大提高了頁(yè)面加載速度。
    又比如,對(duì)于經(jīng)常更新的網(wǎng)頁(yè)內(nèi)容,服務(wù)器可以使用協(xié)商緩存,根據(jù)資源的實(shí)際修改情況決定是否讓瀏覽器使用緩存。

9.Options預(yù)檢請(qǐng)求

在 HTTP 協(xié)議中,“OPTIONS”是一種請(qǐng)求方法。當(dāng)客戶端向服務(wù)器發(fā)送 OPTIONS 請(qǐng)求時(shí),它通常用于獲取服務(wù)器支持的 HTTP 方法和其他與請(qǐng)求/響應(yīng)相關(guān)的選項(xiàng)信息。
例如,在進(jìn)行跨域請(qǐng)求之前,瀏覽器可能會(huì)先發(fā)送 OPTIONS 請(qǐng)求來(lái)檢查服務(wù)器是否允許特定的跨域請(qǐng)求方法和頭信息。

JS篇

0-1. 數(shù)組方法

改變?cè)瓟?shù)組:push、pop、shift、unshift、sort、splice、reverse
不改變?cè)瓕俳M:concat、join、map、forEach、filter、slice

0-2. 高階函數(shù)

高階函數(shù)是至少滿足下列一個(gè)條件的函數(shù):?接受一個(gè)或多個(gè)函數(shù)作為輸入,?或輸出一個(gè)函數(shù)。?

Array擴(kuò)展:
forEach、map、reduce、filter、sort 、every 、some 、find 、findIndex

let arr = [68, 53, 12];
// forEach里面?zhèn)鞯氖呛瘮?shù)(滿足一個(gè))
arr.forEach((item, index) => {console.log(`${index}個(gè)數(shù)是:${item}`);
})
// forEach里面?zhèn)鞯氖呛瘮?shù)并且也有返回值(滿足兩個(gè)個(gè))
const map = arr.map(function(i){return i*i
});

0-3 script 中async和defer表示什么意思

async 和 defer 是兩個(gè)屬性,用于控制腳本的加載和執(zhí)行方式

當(dāng) script標(biāo)簽設(shè)置了 async 屬性時(shí),腳本將異步加載,并且一旦下載完成,就會(huì)立即執(zhí)行,不會(huì)阻塞頁(yè)面的渲染。這意味著腳本的執(zhí)行順序是不確定的,可能會(huì)在頁(yè)面的其他部分還在加載和渲染時(shí)就開(kāi)始執(zhí)行。

當(dāng) script 標(biāo)簽設(shè)置了 defer 屬性時(shí),腳本會(huì)異步加載,但會(huì)等到頁(yè)面的解析(DOM 構(gòu)建)完成后,按照它們?cè)陧?yè)面中出現(xiàn)的順序依次執(zhí)行。這意味著腳本不會(huì)阻塞頁(yè)面的初始渲染,但執(zhí)行順序是有保證的。

0-4 Dom事件流的順序?什么是事件委托?

當(dāng)頁(yè)面上的一個(gè)元素被點(diǎn)擊時(shí),先從document向下一層層捕獲到該元素。然后再向上冒泡,一層層觸發(fā)。

事件委托是將事件寫(xiě)在父級(jí)元素上,e.target是事件捕獲時(shí)那個(gè)最小的元素,即選中的元素。所以可以根據(jù)e.target操作選中的元素。這樣不需要給每個(gè)子元素綁定事件,代碼更加簡(jiǎn)約。

0-5. break/continue/return的使用場(chǎng)景?

break:用于結(jié)束整個(gè)循環(huán)(for、while、do-while)
continue:用于結(jié)束循環(huán)中的當(dāng)前層循環(huán),進(jìn)入下一層循環(huán)
return:用戶結(jié)束整個(gè)函數(shù)

0-. 閉包是什么?利弊?如何解決弊端?使用場(chǎng)景?

場(chǎng)景:

事件處理、回調(diào)函數(shù)、遞歸、鏈?zhǔn)秸{(diào)用

閉包是什么:

JS中內(nèi)層函數(shù)可以訪問(wèn)外層函數(shù)的變量,外層函數(shù)無(wú)法操作內(nèi)存函數(shù)的變量的特性。我們把這個(gè)特性稱(chēng)作閉包。

閉包的好處:

  1. 隔離作用域,保護(hù)私有變量;有了閉包才有局部變量,要不然都是全局變量了。
  2. 讓我們可以使用回調(diào),操作其他函數(shù)內(nèi)部;
  3. 變量長(zhǎng)期駐扎在內(nèi)存中,不會(huì)被內(nèi)存回收機(jī)制回收,即延長(zhǎng)變量的生命周期;
    閉包的弊端:
    內(nèi)層函數(shù)引用外層函數(shù)變量,內(nèi)層函數(shù)占用內(nèi)存。如果不釋放內(nèi)存,過(guò)多時(shí),易引起內(nèi)存泄露。

解決辦法:無(wú)法自動(dòng)銷(xiāo)戶,就及時(shí)手動(dòng)回收,使用后將函數(shù)的引用賦null。

1.事件循環(huán)機(jī)制(event loop)

事件循環(huán)(Event Loop)是 JavaScript 運(yùn)行時(shí)環(huán)境用于處理異步操作的一種機(jī)制。

在 JavaScript 中,同步任務(wù)會(huì)在調(diào)用棧中依次執(zhí)行,而異步任務(wù)會(huì)在合適的時(shí)機(jī)被放入任務(wù)隊(duì)列中等待執(zhí)行。
事件循環(huán)的主要工作流程如下:

  1. 首先,執(zhí)行同步任務(wù),這些任務(wù)會(huì)依次進(jìn)入調(diào)用棧并執(zhí)行,直到調(diào)用棧為空。
  2. 然后,事件循環(huán)會(huì)檢查任務(wù)隊(duì)列(通常包括宏任務(wù)隊(duì)列和微任務(wù)隊(duì)列)。

宏任務(wù)(MacroTask),例如 setTimeout 、 setInterval 、 IO 操作等,會(huì)被放入宏任務(wù)隊(duì)列。
微任務(wù)(MicroTask),如 Promise.then 、 MutationObserver 等,會(huì)被放入微任務(wù)隊(duì)列。

  1. 事件循環(huán)會(huì)先處理微任務(wù)隊(duì)列中的所有任務(wù),直到微任務(wù)隊(duì)列為空。
  2. 接著,從宏任務(wù)隊(duì)列中取出一個(gè)任務(wù)并執(zhí)行。
  3. 執(zhí)行完一個(gè)宏任務(wù)后,再次檢查微任務(wù)隊(duì)列,重復(fù)上述過(guò)程。

通過(guò)這種機(jī)制,JavaScript 能夠在單線程環(huán)境中有效地處理異步操作,不會(huì)造成阻塞,從而保證了程序的響應(yīng)性和性能。

2.Null跟underfine的區(qū)別

Null 和 Undefined 在 JavaScript 中有以下區(qū)別:

  1. 含義:
    Null 表示一個(gè)被明確賦值為空的對(duì)象引用。
    Undefined 表示一個(gè)變量未被初始化或者一個(gè)對(duì)象中不存在的屬性。
  2. 類(lèi)型:
    typeof null 的結(jié)果是 “object” ,這是 JavaScript 中的一個(gè)歷史遺留問(wèn)題。
    typeof undefined 的結(jié)果是 “undefined” 。

3.Promise

Promise 是 JavaScript 中處理異步操作的一種機(jī)制。
創(chuàng)建一個(gè) Promise 對(duì)象通常需要傳入一個(gè)執(zhí)行器函數(shù),該函數(shù)接受兩個(gè)參數(shù) resolve 和 reject ,用于改變 Promise 的狀態(tài)

它具有以下特點(diǎn)和優(yōu)勢(shì):

  1. 解決回調(diào)地獄:通過(guò)鏈?zhǔn)秸{(diào)用 then 方法,可以更清晰地組織異步操作的邏輯,避免多層嵌套的回調(diào)函數(shù)導(dǎo)致的代碼可讀性差和維護(hù)困難的問(wèn)題。
  2. 明確的狀態(tài):Promise 有三種狀態(tài):pending(等待)、fulfilled(成功)和 rejected(失敗)。一旦狀態(tài)確定,就不可再改變。
  3. 錯(cuò)誤處理:可以使用 catch 方法統(tǒng)一處理異步操作中的錯(cuò)誤。

Promise.all([promise1,promise2]).then(res=>{}).catch(err=>{})

4.判斷一個(gè)屬性是對(duì)象還是數(shù)組

Array.isArray()+typeOf

5.New操作符做了哪些操作

  1. 創(chuàng)建一個(gè)新的空對(duì)象:這個(gè)對(duì)象將成為構(gòu)造函數(shù)創(chuàng)建的實(shí)例。
  2. 將新創(chuàng)建的對(duì)象的 __ proto__ 屬性指向構(gòu)造函數(shù)的 prototype 對(duì)象,從而建立實(shí)例與構(gòu)造函數(shù)原型之間的鏈接,實(shí)現(xiàn)了繼承和方法共享。
  3. 將構(gòu)造函數(shù)中的 this 綁定到新創(chuàng)建的對(duì)象上。
  4. 執(zhí)行構(gòu)造函數(shù)中的代碼:這可能包括屬性的初始化、方法的定義等操作。
    如果構(gòu)造函數(shù)有返回值,并且返回值是一個(gè)對(duì)象類(lèi)型(不是原始類(lèi)型),則返回這個(gè)對(duì)象,否則返回新創(chuàng)建的對(duì)象。

6.Node非阻塞i/o

非阻塞 I/O 意味著當(dāng) Node.js 發(fā)起一個(gè) I/O操作(如文件讀取、網(wǎng)絡(luò)請(qǐng)求等)時(shí),不會(huì)阻塞當(dāng)前線程等待操作完成,而是繼續(xù)執(zhí)行后續(xù)的代碼。當(dāng) I/O操作完成時(shí),通過(guò)回調(diào)函數(shù)或事件通知來(lái)處理結(jié)果。提高高并發(fā)處理能力和充分利用系統(tǒng)資源(Web 服務(wù)器、實(shí)時(shí)聊天、文件上傳下載)

缺點(diǎn):編程復(fù)雜增加開(kāi)銷(xiāo)(多了回調(diào)函數(shù))、錯(cuò)誤內(nèi)容處理棘手

7.commonJS跟requireJS和ES6的區(qū)別

  1. 加載方式:
    CommonJS 是同步加載,代碼執(zhí)行到 require 語(yǔ)句時(shí)會(huì)阻塞等待模塊加載完成。
    RequireJS 是異步加載,不會(huì)阻塞后續(xù)代碼的執(zhí)行。
    ES6 模塊在編譯時(shí)確定模塊的依賴(lài)關(guān)系,在運(yùn)行時(shí)異步加載。
  2. 模塊導(dǎo)出:
    CommonJS 主要通過(guò) module.exports 或 exports 來(lái)導(dǎo)出。
    RequireJS 中模塊通過(guò)定義函數(shù)并返回一個(gè)對(duì)象來(lái)導(dǎo)出。
    ES6 模塊可以使用 export default 導(dǎo)出默認(rèn)值,或者使用 export 關(guān)鍵字導(dǎo)出多個(gè)具名的變量、函數(shù)、類(lèi)等。
  3. 模塊導(dǎo)入:
    CommonJS 使用 require 函數(shù)引入模塊,返回的是模塊導(dǎo)出的對(duì)象的副本。
    RequireJS 使用 require 函數(shù),通過(guò)配置模塊的路徑和依賴(lài)來(lái)加載。
    ES6 模塊使用 import 語(yǔ)句導(dǎo)入,導(dǎo)入的是只讀的綁定,而非值的副本。
  4. 運(yùn)行環(huán)境:
    CommonJS 常用于服務(wù)器端,如 Node.js 。
    RequireJS 主要用于瀏覽器端。
    ES6 模塊既可以用于服務(wù)器端,也可以用于現(xiàn)代瀏覽器端。
  5. 模塊循環(huán)引用:
    CommonJS 可以較好地處理模塊的循環(huán)引用。
    RequireJS 也能處理循環(huán)引用,但方式與 CommonJS 不同。
    ES6 模塊在編譯階段確定依賴(lài),原則上不支持循環(huán)引用,如果存在會(huì)報(bào)錯(cuò)。

8.基本數(shù)據(jù)類(lèi)型

Number/string/boolen/null/indefind/symbol
i基礎(chǔ)數(shù)據(jù)類(lèi)型修改對(duì)應(yīng)的棧就重新生成

9.es6語(yǔ)法,箭頭函數(shù),新的操作方法等

模板字符串、結(jié)構(gòu)、set、map、箭頭函數(shù)、默認(rèn)參數(shù)、for of、擴(kuò)展運(yùn)算、promise、es6model

10.dom0跟dom2結(jié)構(gòu)

DOM0 和 DOM2 是文檔對(duì)象模型的不同級(jí)別,它們?cè)谔幚硎录姆绞缴嫌兴煌?/p>

DOM0 點(diǎn)擊事件
DOM2 可以監(jiān)聽(tīng)點(diǎn)擊事件并捕獲各種階段(捕獲、目標(biāo)、冒泡)
DOM2 級(jí)的事件處理方式相比 DOM0 級(jí)更加規(guī)范和靈活,能夠更好地管理多個(gè)事件處理程序,并且支持事件的捕獲和冒泡階段。

11.bind跟apply,call的區(qū)別,實(shí)現(xiàn)方式

getting.call(obj,”vlaue1”)
getting.apply(obj,[”vlaue1”,”vlaue2”])
call、apply上面兩個(gè)會(huì)立即執(zhí)行函數(shù)
而const newFun = getting.bind(obj,”vlaue1”);
newFun ()是創(chuàng)建一個(gè)新的函數(shù)并改變其 this 指向和預(yù)設(shè)部分參數(shù),新函數(shù)需要手動(dòng)調(diào)用執(zhí)行。

12.深拷貝,淺拷貝

淺拷貝(Object.assign()、擴(kuò)展運(yùn)算符)

淺拷貝創(chuàng)建一個(gè)新的對(duì)象或數(shù)組,但它只復(fù)制原始對(duì)象或數(shù)組的頂層屬性或元素。如果原始對(duì)象或數(shù)組的屬性值是引用類(lèi)型(如對(duì)象或數(shù)組),則淺拷貝會(huì)復(fù)制引用而不是創(chuàng)建新的引用類(lèi)型實(shí)例。

深拷貝(JSON.parse(JSON.stringify())、clonedeep)

深拷貝會(huì)遞歸地復(fù)制原始對(duì)象或數(shù)組的所有屬性和子屬性,創(chuàng)建完全獨(dú)立的副本,原始對(duì)象的修改不會(huì)影響到深拷貝的結(jié)果。

14.跨域,同源策略

所謂“同源”,指的是兩個(gè) URL 的協(xié)議、域名和端口都相同。

同源策略主要限制了以下幾種操作:
Cookie、LocalStorage 和 IndexedDB 等數(shù)據(jù)無(wú)法跨域讀取。
DOM 無(wú)法跨域操作。
AJAX 請(qǐng)求無(wú)法跨域發(fā)送(除非服務(wù)器明確允許)。

跨域:當(dāng)瀏覽器請(qǐng)求的資源與當(dāng)前頁(yè)面的源不同時(shí),就產(chǎn)生了跨域請(qǐng)求。

常見(jiàn)的跨域解決方案有:

  1. JSONP:利用 script標(biāo)簽的跨域能力,通過(guò)動(dòng)態(tài)創(chuàng)建 script 標(biāo)簽并指定回調(diào)函數(shù)來(lái)獲取數(shù)據(jù)。
  2. CORS:服務(wù)器端設(shè)置響應(yīng)頭,允許特定源的請(qǐng)求訪問(wèn)。
  3. nignx代理:在同域的服務(wù)器端轉(zhuǎn)發(fā)跨域請(qǐng)求,將獲取到的數(shù)據(jù)返回給前端。

15.快速排序

快速排序(Quick Sort)是一種分治的排序算法。它的平均時(shí)間復(fù)雜度為O(nlogn) ,空間復(fù)雜度為O(logn),最壞時(shí)間復(fù)雜度為O(n方)

以下是快速排序的基本步驟:

  1. 選擇一個(gè)基準(zhǔn)元素(pivot),通常可以選擇數(shù)組的第一個(gè)元素、最后一個(gè)元素或中間元素。
  2. 對(duì)數(shù)組進(jìn)行分區(qū)(partition)操作:將小于基準(zhǔn)的元素放在基準(zhǔn)的左邊,大于基準(zhǔn)的元素放在基準(zhǔn)的右邊。分區(qū)操作完成后,基準(zhǔn)元素處于最終排序后的正確位置。
  3. 對(duì)基準(zhǔn)元素左邊和右邊的子數(shù)組分別遞歸地重復(fù)步驟 1 和 2,直到整個(gè)數(shù)組有序。

16.解釋原型繼承如何工作

每個(gè)函數(shù)都有一個(gè) prototype 屬性,當(dāng)使用這個(gè)函數(shù)作為構(gòu)造函數(shù)創(chuàng)建對(duì)象實(shí)例時(shí),這些實(shí)例可以通過(guò) __proto__指針訪問(wèn)構(gòu)造函數(shù)的prototype 對(duì)象。當(dāng)試圖訪問(wèn)實(shí)例對(duì)象的某個(gè)屬性或方法時(shí),如果在本身找不到,JS引擎會(huì)沿著 __proto__鏈向上(原型對(duì)象)查找,如果在整個(gè)原型鏈中都沒(méi)有找到該屬性或方法,最終會(huì)返回undefined。這種機(jī)制可以讓多個(gè)實(shí)例共享來(lái)自原型對(duì)象的方法和屬性,可以在保持代碼復(fù)用和靈活性的同時(shí),實(shí)現(xiàn)對(duì)象之間的層次結(jié)構(gòu)和功能共享。

17.解釋 JavaScript 中“this”的工作原理

  1. 普通函數(shù)調(diào)用:在非嚴(yán)格模式下,this指向全局對(duì)象(在瀏覽器中為window,在 Node.js 中為global);在嚴(yán)格模式下,this會(huì)綁定到undefined。
  2. 對(duì)象方法調(diào)用:this指向調(diào)用該方法的對(duì)象。
  3. 構(gòu)造函數(shù)調(diào)用:使用new關(guān)鍵字調(diào)用構(gòu)造函數(shù)時(shí),this指的是實(shí)例化的新對(duì)象。
  4. apply和call調(diào)用:通過(guò)這兩個(gè)方法顯式地指定this所指向的對(duì)象,即this指向參數(shù)中的對(duì)象。
  5. 箭頭函數(shù):箭頭函數(shù)沒(méi)有自己的this,而是繼承外層函數(shù)的this。
  6. 定時(shí)器中調(diào)用:例如setInterval和setTimeout,this指向的是全局變量(在瀏覽器中為window)。

18、New Set()的用法

類(lèi)似數(shù)組、成員唯一用于數(shù)組去重
add()
clear()
delete()
has()
forEach()
[…new set(arr)]

19、描述一下 async、await 的用法及使用場(chǎng)景

ayayn/await主要用于異步操作,將異步代碼從視覺(jué)上看來(lái)比較同步化更加簡(jiǎn)潔易讀。
用法
1. ayayn 將一個(gè)函數(shù)標(biāo)示為一個(gè)異步函數(shù),在異步函數(shù)中可以使用await等待異步操作
2. await 只能在async中使用,等待異步函數(shù)的操作完成,獲取異步函數(shù)執(zhí)行的結(jié)果
使用場(chǎng)景
1. 網(wǎng)絡(luò)請(qǐng)求 (獲取頁(yè)面渲染的數(shù)據(jù))
2. 數(shù)據(jù)庫(kù)操作(等待查詢(xún)或更新)

20、for in 與 for of

for-in 遍歷對(duì)象 key 為對(duì)象的 key,遍歷數(shù)組的話 key 為索引數(shù);for-of 用來(lái)遍歷數(shù)組,不能遍歷普通對(duì)象

HTML,CSS篇

重繪和重排(回流/重構(gòu)/重載)是什么?如何優(yōu)化?

樣式的調(diào)整會(huì)引起重繪,比如字體顏色、背景色調(diào)整等
Dom的變動(dòng)會(huì)引起重排,比如定位改動(dòng)、元素寬高調(diào)整

偽類(lèi)和偽元素區(qū)別?

偽類(lèi)本質(zhì)上用于彌補(bǔ)常規(guī)css選擇器的不足,因?yàn)槿绻麤](méi)有我們可能需要多寫(xiě)一個(gè)class,所以叫偽類(lèi)

.class:last-child{}
.class:first-child{}a:link    {color:green;}
a:visited {color:green;}
a:hover   {color:red;}
a:active  {color:yellow;}

偽元素本質(zhì)上是創(chuàng)建了一個(gè)有內(nèi)容的虛擬元素,如::before ::after。因?yàn)橄喈?dāng)于多了一個(gè)元素/節(jié)點(diǎn),所以叫為元素

//  :before用于在某個(gè)元素之前插入某些內(nèi)容。
//  :after用于在某個(gè)元素之后插入某些內(nèi)容。
css
p:before{content:"Read this: ";
}html:
<p>I live in Ducksburg</p>頁(yè)面展示:
Read this: I live in DucksburgF12看dom中:
before
Read this: I live in Ducksburg

1.h5新增屬性

本地存儲(chǔ),比如localStorage、sessionStorage
語(yǔ)義化標(biāo)簽,如header、footer、nav等,使代碼結(jié)構(gòu)清晰,利于seo
canvas
svg
web worker,在主線程外再創(chuàng)建一個(gè)線程,可與主線程交互
拖放功能

2.Css3新增屬性,常問(wèn)flex,transform

transform: translate(50px, 50px) rotate(30deg) scale(1.5);

3.本地存儲(chǔ)

  1. cookie:
    常用于保存用戶登錄狀態(tài),每次請(qǐng)求都會(huì)攜帶(4k)
  2. localStorage:
    存儲(chǔ)數(shù)據(jù)量比較大的數(shù)據(jù),只要瀏覽器不清除就一直會(huì)在(5m)
  3. sessionStorage:
    用于同一會(huì)話區(qū)間保存臨時(shí)數(shù)據(jù),比如表單數(shù)據(jù)等,窗口關(guān)閉數(shù)據(jù)清空(5m)

4.Meta有哪些屬性

標(biāo)簽位于文檔的 部分;一個(gè) 標(biāo)簽只能用于一種用途,如果想要使用多種特性,需要添加多個(gè) 標(biāo)簽;

charset=“utf-8” 字符編譯
viewport 用于設(shè)置視口
http-equiv 網(wǎng)絡(luò)緩存
content-security-policy 防止跨站點(diǎn)腳本攻擊

5.怎么實(shí)現(xiàn)移動(dòng)端適配

  1. 使用 viewport 元標(biāo)簽
<meta
name="viewport"
content="width-device-width, 
initial-scale=1.0, maximum-scale=1.0,
user-scalable=no">

width=device-width 視口寬度與設(shè)備寬度一致,不設(shè)置的話瀏覽器會(huì)默認(rèn)給個(gè)較寬值可能在移動(dòng)端就不友好

  1. 媒體查詢(xún)(Media Queries)@Media screen
  2. 彈性布局(Flexbox)和網(wǎng)格布局(Grid)
  3. 相對(duì)單位(rem相對(duì)根元素、vh/vw相對(duì)視口)
  4. 圖片適配 banckground-size:cover

6.水平垂直居中方式

框架篇

vue

0. v2/v3/v3.2 v-model實(shí)現(xiàn)方法

v2 通過(guò) value和input(‘update:value’, $event")事件
v3 通過(guò) modleValue和input(‘update:modelValue’, $event")
v3.2通過(guò) @update:title=“value= $event”

1.Vue數(shù)據(jù)雙向綁定原理

  1. vue2 原理是使用 es5 的 api:object.defineProperty()對(duì)數(shù)據(jù)進(jìn)行劫持結(jié)合發(fā)布訂閱模式的方式來(lái)實(shí)現(xiàn)。
  2. vue3 使用的是 es6 的 proxy 實(shí)現(xiàn)的,Proxy 用于創(chuàng)建一個(gè)數(shù)據(jù)代理,當(dāng)屬性被訪問(wèn)或修改時(shí),觸發(fā) Proxy 攔截器,實(shí)現(xiàn)數(shù)據(jù)響應(yīng)式。

在 Vue 2 中,雙向數(shù)據(jù)綁定是利用 ES5 的一個(gè)
API,Object.defineProperty()對(duì)數(shù)據(jù)進(jìn)行劫持結(jié)合發(fā)布訂閱模式的方式來(lái)實(shí)現(xiàn)的。通過(guò)Object.defineProperty()來(lái)劫持?jǐn)?shù)據(jù)對(duì)象的屬性,對(duì)屬性getter和setter進(jìn)行攔截,當(dāng)屬性被訪問(wèn)或修改時(shí),除非getter和setter,否則實(shí)現(xiàn)數(shù)據(jù)響應(yīng)式。每個(gè)數(shù)據(jù)都有一個(gè)Watcher實(shí)例,當(dāng)數(shù)據(jù)發(fā)生變化時(shí),觸發(fā)setter,并通知Watcher,然后Watcher會(huì)調(diào)用其函數(shù),將值更新在DOM。
而 Vue 3 中的雙向數(shù)據(jù)綁定則是基于 ES6 的Proxy實(shí)現(xiàn)的。Proxy用于創(chuàng)建一個(gè)數(shù)據(jù)代理,當(dāng)屬性被訪問(wèn)或修改時(shí),觸發(fā)Proxy攔截器,實(shí)現(xiàn)數(shù)據(jù)響應(yīng)式。Proxy相較于Object.defineProperty()的優(yōu)勢(shì)在于它可以直接監(jiān)聽(tīng)對(duì)象而非屬性,直接監(jiān)聽(tīng)數(shù)組的變化,并且攔截方式較多。Proxy返回一個(gè)新對(duì)象,可以只操作新對(duì)象達(dá)到目的,而Object.defineProperty()只能遍歷對(duì)象屬性直接修改。

2.路由實(shí)現(xiàn)原理

路由管理器,它的實(shí)現(xiàn)原理主要是通過(guò)改變?yōu)g覽器的 URL 來(lái)實(shí)現(xiàn)不同頁(yè)面(組件)的切換,同時(shí)在不重新請(qǐng)求頁(yè)面的情況下更新視圖

在瀏覽器環(huán)境下,Vue Router 主要有兩種實(shí)現(xiàn)模式:hash 模式和 history 模式。

  1. hash 模式:
    URL 中帶有#,#后面的內(nèi)容作為路徑地址使用。
    hash 模式的實(shí)現(xiàn)是基于錨點(diǎn)和onhashchange事件。hash 雖然出現(xiàn)在 URL 中,但不會(huì)被包括在 HTTP 請(qǐng)求中,它是用來(lái)指導(dǎo)瀏覽器動(dòng)作的,對(duì)服務(wù)器端完全無(wú)用,改變 hash 不會(huì)重新加載頁(yè)面,不會(huì)出現(xiàn)404
    每一次改變 hash(window.location.hash),都會(huì)在瀏覽器的訪問(wèn)歷史中增加一個(gè)記錄。
  2. history 模式:
    通過(guò) HTML5 的history.pushState()和history.replaceState()方法改變地址欄,只改變了地址欄,并不會(huì)真正跳轉(zhuǎn)到真正的路徑。
    需監(jiān)聽(tīng)popstate事件,當(dāng)點(diǎn)擊瀏覽器前進(jìn)后退按鈕,或者通過(guò) JavaScript 觸發(fā)back或者forward時(shí)才會(huì)觸發(fā)。
    需要服務(wù)器端進(jìn)行相應(yīng)配置以處理頁(yè)面刷新時(shí)的 404 錯(cuò)誤。

這種模式充分利用了 HTML5 History Interface 中新增的方法,使 URL 看起來(lái)更美觀、更接近真實(shí)的路徑,但需要服務(wù)器的支持。因?yàn)闆](méi)有#號(hào),當(dāng)用戶刷新頁(yè)面之類(lèi)的操作時(shí),瀏覽器會(huì)給服務(wù)器發(fā)送請(qǐng)求,為避免出現(xiàn)這種情況,需要服務(wù)器將除了靜態(tài)資源外所有路由都重定向到根頁(yè)面。

傳參
router 包含所有路由信息和方法
route 只包含當(dāng)前路由信息

<router-link :to="{ name:'router1',params: { id: status ,id2:status3},query: { queryId:  status2 }}" >router-link跳轉(zhuǎn)router1</router-link>```

區(qū)別:
URL 表現(xiàn)形式:

param:參數(shù)作為 URL 路徑的一部分。 有**/**標(biāo)志 this.$route.params

query:參數(shù)以 ?key=value 的形式附加在 URL 后面。有?標(biāo)志 this.$route.query

刷新頁(yè)面影響: param:頁(yè)面刷新不會(huì)丟失參數(shù)。 query:頁(yè)面刷新參數(shù)仍然存在。

3.Watch跟computed的區(qū)別

  1. computed(計(jì)算屬性)
  1. 多對(duì)一 通過(guò)現(xiàn)有的數(shù)據(jù)計(jì)算出一個(gè)新的值,具有緩存性(當(dāng)依賴(lài)變化會(huì)重新計(jì)算)
  1. watch(監(jiān)聽(tīng)屬性)
1. 一對(duì)多 監(jiān)聽(tīng)某一個(gè)特定屬性(對(duì)象的單個(gè)屬性或整個(gè)對(duì)象)執(zhí)行相應(yīng)的回調(diào)函數(shù),沒(méi)有緩存,每次變化都會(huì)觸發(fā)
  1. 區(qū)別就是computed側(cè)重于數(shù)據(jù)派發(fā);watch側(cè)重于數(shù)據(jù)變化后對(duì)復(fù)雜邏輯的處理操作

4.Watch的配置項(xiàng)

Immdera 立即執(zhí)行
Deep

5.為什么數(shù)組push,vue能跟蹤到數(shù)據(jù)發(fā)生變化,用下標(biāo)方式不行

Vue 使用 Object.defineProperty 把數(shù)據(jù)對(duì)象的屬性轉(zhuǎn)為 getter/setter,從而實(shí)現(xiàn)對(duì)數(shù)據(jù)變化的監(jiān)聽(tīng)。然而,對(duì)于數(shù)組,Vue 不能檢測(cè)通過(guò)索引直接設(shè)置數(shù)組項(xiàng)和修改數(shù)組長(zhǎng)度這兩種變動(dòng)。

當(dāng)使用 push 等方法時(shí),這些方法是 Vue 經(jīng)過(guò)特殊處理的,它們會(huì)觸發(fā) Vue 的更新機(jī)制,從而通知視圖進(jìn)行更新。例如 push 方法向數(shù)組末尾添加元素,會(huì)改變數(shù)組的內(nèi)容,并且 Vue 能夠感知到這種變化。

6.怎么實(shí)現(xiàn)一個(gè)組件的封裝

創(chuàng)建 — 引入 — 注冊(cè) — 使用

v-model的原理 (v-model其實(shí)是個(gè)語(yǔ)法糖)

在 Vue 中,v-model 是一個(gè)用于實(shí)現(xiàn)表單元素和組件數(shù)據(jù)雙向綁定的指令。 其原理主要包括以下幾個(gè)方面: 對(duì)于原生的表單元素(如 input、textarea、select 等): v-model 實(shí)際上是 value 屬性和 input 事件的語(yǔ)法糖。
當(dāng)用戶輸入內(nèi)容時(shí),會(huì)觸發(fā)元素的 input 事件,Vue 會(huì)通過(guò)這個(gè)事件來(lái)更新組件實(shí)例中的數(shù)據(jù)。
同時(shí),組件實(shí)例中的數(shù)據(jù)變化也會(huì)同步更新到元素的 value 屬性上,從而實(shí)現(xiàn)雙向綁定。
對(duì)于自定義組件: 父組件使用 v-model時(shí),子組件需要接收一個(gè)名為 value 的 prop,并觸發(fā)一個(gè)名為 input 的自定義事件來(lái)更新父組件傳遞的值。

7.MVVM模式的核心

通過(guò)數(shù)據(jù)綁定和 ViewModel 實(shí)現(xiàn)視圖和模型的高效交互和低耦合,從而提高應(yīng)用程序的開(kāi)發(fā)效率和可維護(hù)性。

8.Provider跟inject

Provider 和 inject 是 Vue 中用于實(shí)現(xiàn)依賴(lài)注入的兩個(gè)概念。它們的主要作用是允許祖先組件向其所有子孫后代組件傳遞數(shù)據(jù)或方法,而不論組件之間的嵌套層次有多深。

在 Vue 2 和 Vue 3 中都可以使用 provide 和 inject,但具體的使用方式略有不同。

9.Keep-alive及其生命周期

activated:在組件被激活時(shí)調(diào)用
deactivated:在組件被停用時(shí)調(diào)用

需要注意的是,使用 keep-alive 后,原本的 beforeDestroy 和 destroyed 鉤子函數(shù)將不會(huì)再被觸發(fā),因?yàn)榻M件不會(huì)被真正銷(xiāo)毀,只是被緩存起來(lái)了。
另外,keep-alive 組件還支持通過(guò) include、exclude 屬性或動(dòng)態(tài)判斷來(lái)有條件地緩存組件。
keep-alive 常用于需要頻繁切換但又希望保持狀態(tài)的組件,比如列表頁(yè)、詳情頁(yè)等,以減少服務(wù)器請(qǐng)求次數(shù)和提高用戶體驗(yàn)

10.不想讓vue中data里的一個(gè)對(duì)象里所以屬性都具有setter,getter,怎么解決?(freeze)

Object.freeze()

11.Slot

  1. 匿名插槽 (默認(rèn)插槽)
    子組件中沒(méi)有指定名稱(chēng)的slot標(biāo)簽
    父組件傳遞的未具名內(nèi)容會(huì)填充到默認(rèn)插槽中
  2. 具名
    子組件中使用 name 屬性為插槽命名。
    父組件使用 template 標(biāo)簽并通過(guò) v-slot:插槽名 來(lái)傳遞對(duì)應(yīng)名稱(chēng)的內(nèi)容。
// 子組件
<slot name="header">默認(rèn)的頭部?jī)?nèi)容</slot>
// 父組件
<template v-slot:header><p>父組件傳遞的頭部?jī)?nèi)容</p>
</template>
  1. 作用域
    子組件向插槽傳遞數(shù)據(jù)。
    父組件通過(guò)接收這些數(shù)據(jù)來(lái)決定如何渲染插槽內(nèi)容
// 子組件<slot :user="user"><p>默認(rèn)用戶信息:未知</p></slot>data() {return {user: { name: '張三', age: 25 }};}
// 父組件
<template v-slot="{ user }"><p>用戶信息:{{ user.name }},年齡:{{ user.age }}</p>
</template>

12、Vuex 有哪種屬性及作用

vue2+vue3都可使用vuex

  1. state: 存放共享的數(shù)據(jù)屬性
  2. mutations: 更改 state 中的狀態(tài)()同步操作
  3. actions: 異步操作 獲取數(shù)據(jù)提交 mutations 來(lái)間接更新 state 數(shù)據(jù)
  4. getters: 類(lèi)似于計(jì)算屬性,對(duì) stated 的數(shù)據(jù)進(jìn)行計(jì)算
  5. model: 模塊設(shè)置,每個(gè)模塊有自己對(duì)于的 vuex 屬性

vue3 新增了一個(gè)pinia

  1. state 存放共享屬性
  2. actions 可支持同步和異步
  3. getters(可選):用于計(jì)算派生狀態(tài)。
  4. persist(可選):用于配置狀態(tài)的持久化選項(xiàng)。

13.計(jì)算屬性和監(jiān)聽(tīng)的執(zhí)行順序

  1. 默認(rèn) beforeCreate -> props -> data -> computed -> created -> mounted -> methods
  2. 監(jiān)聽(tīng)設(shè)置立即執(zhí)行 beforeCreate -> props -> data -> watch -> computed -> created -> mounted -> methods
  3. 觸發(fā)某一事件
    Methods -> watch -> computed

14.以下是 Vue3 與 Vue2 在一些方面的比較:

v2的mixin與v3的hook

  1. 相同點(diǎn)
    目的相同:Vue 2 的 Mixin 和 Vue 3 的 Hook 都旨在實(shí)現(xiàn)代碼的復(fù)用和邏輯的共享。
  2. 不同點(diǎn)
    語(yǔ)法和實(shí)現(xiàn)方式
    Mixin:在 Vue 2 中,通過(guò)將多個(gè)對(duì)象的屬性和方法合并到組件中來(lái)實(shí)現(xiàn)復(fù)用。
    Hook:在 Vue 3 中,通過(guò)函數(shù)來(lái)封裝和返回有狀態(tài)的邏輯。
    數(shù)據(jù)響應(yīng)式處理
    Mixin:對(duì)于響應(yīng)式數(shù)據(jù)的處理可能相對(duì)復(fù)雜,容易出現(xiàn)一些意外情況。
    Hook:基于 Vue 3 改進(jìn)的響應(yīng)式系統(tǒng),處理響應(yīng)式更加可靠和高效。
    代碼組織和可讀性
    Mixin:多個(gè) Mixin 混合使用時(shí),可能導(dǎo)致代碼結(jié)構(gòu)混亂,難以清晰地理解數(shù)據(jù)和方法的來(lái)源。
    Hook:函數(shù)式的風(fēng)格使得代碼的組織更加清晰,邏輯更加內(nèi)聚。
    類(lèi)型支持
    Hook:在 TypeScript 中的類(lèi)型支持更好,更容易進(jìn)行類(lèi)型推導(dǎo)和類(lèi)型檢查。

響應(yīng)式原理:

  1. Vue2:通過(guò) Object.defineProperty 對(duì) data 中的屬性進(jìn)行劫持來(lái)實(shí)現(xiàn)響應(yīng)式。但存在無(wú)法監(jiān)聽(tīng)數(shù)組變化、需通過(guò)特殊方法實(shí)現(xiàn),以及無(wú)法監(jiān)聽(tīng)對(duì)象新增和刪除屬性等限制。
  2. Vue3:使用 Proxy 代替 Object.defineProperty,可以監(jiān)聽(tīng)到對(duì)象的所有屬性,包括新增和刪除操作,還支持?jǐn)?shù)組的監(jiān)聽(tīng),并且使用 WeakMap 存儲(chǔ)依賴(lài)關(guān)系,避免了內(nèi)存泄漏問(wèn)題。

性能提升:

  1. Vue3 在響應(yīng)式處理以及重寫(xiě) diff 算法等內(nèi)部實(shí)現(xiàn)上進(jìn)行了大量?jī)?yōu)化,渲染速度更快,性能更好,內(nèi)存占用更少。例如采用靜態(tài)提升技術(shù),對(duì)不參與更新的元素做靜態(tài)提升,只會(huì)被創(chuàng)建一次,在渲染時(shí)直接復(fù)用,優(yōu)化內(nèi)存。在 diff 算法中增加了靜態(tài)標(biāo)記,采用同序列比對(duì)和最長(zhǎng)遞歸子序列算法計(jì)算最小修改偏移量。
  2. Vue3 還支持更好的 Tree Shaking,通過(guò)模塊拆分和函數(shù)式編程,實(shí)現(xiàn)按需引入,減少打包體積;同時(shí)對(duì)源碼體積進(jìn)行了優(yōu)化,移除了一些非必要特性,新增模塊也可按需引入。

編碼方式:

  1. Vue3 引入了 Composition API(組合式 API),允許開(kāi)發(fā)者更好地組織和復(fù)用邏輯代碼,提高代碼的可維護(hù)性??梢愿鶕?jù)邏輯相關(guān)性組織代碼,代碼量少,更靈活,語(yǔ)法提示友好,且對(duì) TypeScript 的支持更好。
  2. Vue2 使用 Options API,組件的邏輯分散在不同的選項(xiàng)中(如 data、methods、computed 等)。

設(shè)計(jì)理念:

  1. Vue3 更注重模塊的拆分,模塊之間耦合度低,可獨(dú)立使用部分模塊,如只引入 reactive 模塊來(lái)使用響應(yīng)式處理。對(duì)所有 API 進(jìn)行重寫(xiě),采用函數(shù)式編程,支持更好的 Tree Shaking,精確實(shí)現(xiàn)按需引入,減少打包體積。
  2. Vue2 模塊的獨(dú)立性相對(duì)較弱。

特性支持:

  1. Vue3 支持更多特性,如片段、Teleport、Suspense 等。
  2. Vue2 相對(duì)較少。

生命周期:
Vue3 中的生命周期函數(shù)有所變化,例如 beforeCreate 和 created 變?yōu)?setup,beforeDestroy 改名為 beforeUnmount,destroyed 改名為 unmounted 等。并且 Vue3 的生命周期函數(shù)可以多次調(diào)用而不會(huì)覆蓋。

全局方法定義:

  1. Vue2 中直接在 Vue 實(shí)例上掛載全局方法。
  2. Vue3 中通過(guò)創(chuàng)建的應(yīng)用實(shí)例來(lái)定義全局方法。

template 根組件:

  1. Vue2 有且只有一個(gè)根組件。
  2. Vue3 沒(méi)有固定的根節(jié)點(diǎn),可以有多個(gè)根。

啟動(dòng)方式:

1. Vue2:new Vue({ store, router, render: h => h(App) }).$mount("#app")
2. Vue3:import { createApp } from 'Vue'; createApp(App).use(store).use(router).mount("#App")

路由和狀態(tài)管理:

  1. Vue3 的路由創(chuàng)建方式和 Vue2 有所不同。在 Vue2 中創(chuàng)建路由對(duì)象實(shí)例通過(guò) new Router,而 Vue3 是通過(guò) import createRouter 這個(gè)函數(shù)來(lái)構(gòu)建。
  2. Vue3 中的狀態(tài)管理庫(kù) Pinia 與 Vue2 中的 Vuex 也有一些區(qū)別,Pinia 去掉了 mutations 和 modules,modules 在 Pinia 中是自帶的,不需要手動(dòng)去寫(xiě)。

computed 計(jì)算屬性和 watch 監(jiān)聽(tīng):

  1. Vue2 中的 computed 寫(xiě)法是在對(duì)象中定義方法,而 Vue3 中需引入 computed,寫(xiě)法是一個(gè)函數(shù),需返回結(jié)果。
  2. Vue3 中的 watch 監(jiān)聽(tīng)寫(xiě)法也有所不同,第三個(gè)參數(shù)可選。對(duì)于 ref 數(shù)據(jù)的監(jiān)聽(tīng)不需要加 .value,且能監(jiān)聽(tīng)多個(gè)值的變化。而 ref 生成的響應(yīng)式對(duì)象默認(rèn)不支持深度監(jiān)聽(tīng),需加上 deep: true,reactive 生成的響應(yīng)式對(duì)象則默認(rèn)為深度監(jiān)聽(tīng)。

props 處理:

  1. Vue2 中接收 props 是對(duì)象時(shí),可添加 default、required、type 等屬性。而 Vue3 中 props 是只讀的,不能在 setup 函數(shù)中修改,如需修改可使用響應(yīng)式對(duì)象或 ref。

微信小程序

1. 登陸順序

  1. 調(diào)用 wx.login() 接口獲取臨時(shí)登錄憑證 code
  2. 拿code向后端獲取token
  3. 后端通過(guò)code去向微信端獲取sessionKey和openId后向前端返回登錄態(tài)也就是token

react

1.Hooks,高階組件

  1. useState:用于在函數(shù)組件中添加狀態(tài),可跟蹤隨時(shí)間變化的數(shù)據(jù)。它返回一個(gè)狀態(tài)值和更新該狀態(tài)值的函數(shù)。
  2. useEffect:用于執(zhí)行副作用操作,如數(shù)據(jù)獲取、訂閱或手動(dòng)更改 DOM 等。類(lèi)似于類(lèi)組件中的componentDidMount、componentDidUpdate和componentWillUnmount生命周期。(沒(méi)有依賴(lài)項(xiàng)初始+更新、依賴(lài)為空初始、有依賴(lài)初始+值變)
  3. useRef:用于創(chuàng)建對(duì) DOM 元素或值的引用,可以在渲染之間保持狀態(tài)。
  4. useMemo:用于對(duì)計(jì)算結(jié)果進(jìn)行記憶,避免在每次渲染時(shí)重復(fù)計(jì)算。只有當(dāng)依賴(lài)項(xiàng)發(fā)生變化時(shí),才會(huì)重新計(jì)算結(jié)果。
  5. useReducer:用于更復(fù)雜的狀態(tài)邏輯,它接收一個(gè) reducer 函數(shù)和初始狀態(tài),然后返回當(dāng)前的狀態(tài)和派發(fā) action 的 dispatch 函數(shù)。
  6. uesContet用于訪問(wèn) React Context 在組件樹(shù)中傳遞的數(shù)據(jù),而不必通過(guò)每個(gè)組件傳遞 props
  7. useLayoutEffect與 useEffect 類(lèi)似,但它在所有的 DOM 變更之后同步執(zhí)行。這在需要讀取 DOM 布局并同步觸發(fā)重渲染時(shí)非常有用。
  8. useDebugValue用于在 React 開(kāi)發(fā)者工具中顯示自定義 Hook 的標(biāo)簽
  9. useCallback:用于返回一個(gè)記憶化版本的回調(diào)函數(shù),防止不必要的渲染。它會(huì)在依賴(lài)項(xiàng)沒(méi)有變化時(shí)返回上次緩存的函數(shù)。
  10. useFetch(非 React 內(nèi)置 Hook):例如react-fetch-hook,用于便捷地使用fetch API進(jìn)行數(shù)據(jù)獲取。
  11. useWindowScrollPosition(非 React 內(nèi)置 Hook):用于獲取窗口的滾動(dòng)位置。
  12. useLocalStorage(非 React 內(nèi)置 Hook)用于同步本地存儲(chǔ)的數(shù)據(jù)
    總的來(lái)說(shuō),useState 關(guān)注狀態(tài)的管理和組件的重新渲染,useEffect 專(zhuān)注于副作用的處理,useRef 則主要用于引用和保存跨渲染的數(shù)據(jù)。

2.Redux中間件原理

在 Redux 中,數(shù)據(jù)的更新流程通常是:
action 被派發(fā) -> reducer 根據(jù) action 計(jì)算新的 state -> 新的state 更新到 store 中,從而觸發(fā)視圖的更新。

中間件位于 action 被派發(fā)和 reducer 處理之間。它本質(zhì)上是一個(gè)函數(shù),接收 Redux 里 store 的 dispatch 和 getState 方法作為參數(shù),并返回一個(gè)新的函數(shù)。這個(gè)新的函數(shù)會(huì)接收下一個(gè)中間件或者最終的 reducer 作為參數(shù)。

3.Redux異步操作

Redux Thunk:
原理:Redux Thunk 是一個(gè)中間件,它允許 action 創(chuàng)建函數(shù)返回一個(gè)函數(shù)而不是一個(gè)對(duì)象。返回的函數(shù)接收 dispatch 和 getState 方法作為參數(shù),從而可以在函數(shù)內(nèi)部進(jìn)行異步操作,并在操作完成后使用 dispatch 派發(fā)相應(yīng)的同步 action 來(lái)更新?tīng)顟B(tài)。

vue、react和小程序之間的區(qū)別

1.Diff算法,react跟vue的diff區(qū)別

Diff 算法是一種用于比較兩個(gè)數(shù)據(jù)結(jié)構(gòu)差異的算法,主要用于高效地更新虛擬 DOM 以最小化對(duì)真實(shí) DOM 的操作,從而提高性能.

React 的 Diff 算法主要基于兩個(gè)假設(shè):

兩個(gè)不同類(lèi)型的元素會(huì)產(chǎn)生完全不同的樹(shù)。 對(duì)于同一層級(jí)的一組子節(jié)點(diǎn),通過(guò) key 來(lái)標(biāo)識(shí)節(jié)點(diǎn)的唯一性。
當(dāng)對(duì)比兩棵樹(shù)時(shí),如果節(jié)點(diǎn)類(lèi)型不同,直接刪除舊的節(jié)點(diǎn)并創(chuàng)建新的節(jié)點(diǎn)。對(duì)于同一類(lèi)型的節(jié)點(diǎn),則比較屬性的變化來(lái)更新 DOM。

Vue 的 Diff 算法

在更新節(jié)點(diǎn)時(shí),會(huì)更加精細(xì)化。在處理同層級(jí)節(jié)點(diǎn)對(duì)比時(shí),會(huì)遵循以下策略: 新老節(jié)點(diǎn)數(shù)組的開(kāi)始和結(jié)束位置設(shè)置指針進(jìn)行比較。 如果節(jié)點(diǎn)有 key,會(huì)根據(jù) key 進(jìn)行更準(zhǔn)確的匹配和復(fù)用。
當(dāng)新節(jié)點(diǎn)多或者老節(jié)點(diǎn)多時(shí),會(huì)通過(guò)創(chuàng)建或刪除節(jié)點(diǎn)來(lái)達(dá)到最終的一致性。
例如,如果在 Vue 中一個(gè)列表的順序發(fā)生了變化,并且節(jié)點(diǎn)有 key ,那么 Vue 可以更準(zhǔn)確地移動(dòng)節(jié)點(diǎn)而不是刪除和重新創(chuàng)建。

2.React、vue生命周期,要展開(kāi)來(lái)說(shuō)

react:

  1. Mounted掛載
    Constract(初始化state)
    stateFromProps
    Render(計(jì)算返回虛擬dom|掛掛在和更新都會(huì)用)
    ComponetDidMout(獲取數(shù)據(jù))
  2. 更新updating:父組件重新渲染、 setState或forceUpdate觸發(fā)
    前兩個(gè)是因?yàn)楦附M件重新渲染更新的
    stateFromProps
    Render()
    shouldComponetUpdate
    ComputedDidUpdata
  3. 卸載Unmouting
    cnmponetWillUnmount(清理資源,取消定時(shí)器)

vue3:
{ setup, onBeforeMount, onMounted, onBeforeUpdate, onUpdated, onBeforeUnmount, onUnmounted }
vue2
父前三個(gè)-子前四個(gè)-父結(jié)尾

3.小程序原生父子傳值

父?jìng)髯诱?子properties收
子傳父taggerEvent(“fun”,value) +父bindFun+this.selectComponent(“類(lèi)名”)

4.Vue,react,小程序組件間的通信

Vue:

  1. 導(dǎo)航+編程
  2. Query 參數(shù)
  3. params路由參數(shù)
  4. meta

React:

  1. 導(dǎo)航+編程
  2. props.params 方法
  3. query 方法:類(lèi)似于表單中的 get 方法,傳遞參數(shù)為明文,但刷新頁(yè)面參數(shù)會(huì)丟失。

小程序:

  1. 使用 navigator 的 url 帶參傳值,利用 getCurrentPages 進(jìn)行頁(yè)面?zhèn)髦?#xff0c;
  2. 小程序中還可以使用 wx.navigateTo、wx.redirectTo 等方法進(jìn)行路由跳轉(zhuǎn)并傳值,它們與 navigator 的對(duì)應(yīng)關(guān)系如下:
  • navigator 的 open-type=“navigate”(不寫(xiě)默認(rèn)值是 navigate)等于 wx.navigateTo:保留當(dāng)前頁(yè)面,跳轉(zhuǎn)到應(yīng)用內(nèi)的某個(gè)頁(yè)面,但不能跳到 tabbar 頁(yè)面,小程序中頁(yè)面棧最多十層,可帶參。
  • wx.redirectTo:關(guān)閉當(dāng)前頁(yè)面,跳轉(zhuǎn)到應(yīng)用內(nèi)的某個(gè)頁(yè)面,但不允許跳轉(zhuǎn)到 tabbar 頁(yè)面,可帶參。
  • wx.switchTab:跳轉(zhuǎn)到 tabBar 頁(yè)面,并關(guān)閉其他所有非 tabBar 頁(yè)面,不可帶參。
  • wx.reLaunch:關(guān)閉所有頁(yè)面,打開(kāi)到應(yīng)用內(nèi)的某個(gè)頁(yè)面,可帶參。
  • wx.navigateBack:關(guān)閉當(dāng)前頁(yè)面,返回上一頁(yè)面或多級(jí)頁(yè)面

5.Vue跟react的優(yōu)缺點(diǎn)

Vue 和 React 都是非常流行的前端框架,它們各自有一些優(yōu)點(diǎn)和缺點(diǎn):
Vue 的優(yōu)點(diǎn):

  1. 學(xué)習(xí)曲線相對(duì)較平緩容易理解和上手。
  2. 模板語(yǔ)法簡(jiǎn)潔:Vue 的模板語(yǔ)法直觀,與 HTML 結(jié)構(gòu)相似,使得開(kāi)發(fā)者可以更自然地編寫(xiě)視圖。
  3. 輕量級(jí):Vue 的核心庫(kù)相對(duì)較小,性能開(kāi)銷(xiāo)較低。
  4. 漸進(jìn)式框架:可以逐步將 Vue 引入現(xiàn)有的項(xiàng)目,無(wú)需一次性進(jìn)行大規(guī)模重構(gòu)。
  5. 中文文檔豐富:對(duì)國(guó)內(nèi)開(kāi)發(fā)者來(lái)說(shuō),查找資料和解決問(wèn)題更加方便。
    Vue 的缺點(diǎn):
  6. 生態(tài)系統(tǒng)相對(duì)較小:與 React 相比,一些特定領(lǐng)域的庫(kù)和工具可能相對(duì)較少。
  7. 大型項(xiàng)目的可擴(kuò)展性:在處理超大型復(fù)雜應(yīng)用時(shí),可能在架構(gòu)和擴(kuò)展方面面臨一些挑戰(zhàn)。

React 的優(yōu)點(diǎn):

  1. 強(qiáng)大的生態(tài)系統(tǒng):擁有大量的高質(zhì)量第三方庫(kù)和工具,幾乎可以滿足任何需求。
  2. 虛擬 DOM 優(yōu)化:高效的虛擬 DOM 算法,使得性能優(yōu)化更具可控性。
  3. 社區(qū)活躍:擁有龐大且活躍的社區(qū),技術(shù)更新和支持力度大。
  4. 適用于大型應(yīng)用:架構(gòu)靈活,在大型項(xiàng)目中更容易進(jìn)行代碼組織和管理。

React 的缺點(diǎn):

  1. 學(xué)習(xí)曲線陡峭:需要掌握較多的概念和技術(shù),如 JSX、函數(shù)式編程等。
  2. 代碼復(fù)雜度較高:尤其是在處理復(fù)雜的狀態(tài)管理時(shí)。
  3. 原生模板語(yǔ)法不夠直觀:JSX 對(duì)于一些開(kāi)發(fā)者來(lái)說(shuō)可能不太習(xí)慣。

需要注意的是,選擇 Vue 還是 React 取決于具體的項(xiàng)目需求、團(tuán)隊(duì)技術(shù)棧和個(gè)人偏好。在實(shí)際開(kāi)發(fā)中,兩者都能構(gòu)建出高質(zhì)量的應(yīng)用程序。

Git

rebase

1.在基于某個(gè)分支進(jìn)行開(kāi)發(fā)時(shí),如果上游分支有新的提交,使用 rebase 可以將本地的提交重新應(yīng)用到更新后的上游分支頂端,而不是直接合并。

http://www.risenshineclean.com/news/29875.html

相關(guān)文章:

  • 網(wǎng)站制作網(wǎng)站建設(shè)需要多少錢(qián)網(wǎng)站銷(xiāo)售怎么推廣
  • 教做家庭菜的網(wǎng)站怎么做推廣比較成功
  • 樂(lè)清做網(wǎng)站價(jià)格推廣的軟件
  • 彈幕網(wǎng)站是怎么做的發(fā)布軟文平臺(tái)
  • seo網(wǎng)站建設(shè)價(jià)格自己怎么創(chuàng)建網(wǎng)站
  • 商貿(mào)網(wǎng)站管理培訓(xùn)機(jī)構(gòu)
  • ftp是專(zhuān)門(mén)提供文件傳輸?shù)木W(wǎng)站百度注冊(cè)新賬號(hào)
  • 品牌seo公司焦作關(guān)鍵詞優(yōu)化排名
  • 建網(wǎng)站的服務(wù)器學(xué)電商出來(lái)一般干什么工作
  • 創(chuàng)意個(gè)人網(wǎng)站設(shè)計(jì)大冶seo網(wǎng)站優(yōu)化排名推薦
  • 律師網(wǎng)站深圳網(wǎng)站設(shè)計(jì)百度app在哪里找
  • 黔東南網(wǎng)頁(yè)設(shè)計(jì)seo搜索引擎優(yōu)化人員
  • wordpress掃碼收款seo網(wǎng)絡(luò)營(yíng)銷(xiāo)課程
  • 公司做的網(wǎng)站賬務(wù)處理淘寶關(guān)鍵詞搜索量查詢(xún)
  • 開(kāi)發(fā)公司人效比seo排名培訓(xùn)學(xué)校
  • 做網(wǎng)站彩票代理犯法嗎我是站長(zhǎng)網(wǎng)
  • php做網(wǎng)站網(wǎng)絡(luò)營(yíng)銷(xiāo)有什么崗位
  • 國(guó)內(nèi)可以做的國(guó)外兼職網(wǎng)站海外營(yíng)銷(xiāo)方案
  • 專(zhuān)門(mén)做微信推送的網(wǎng)站搜索引擎優(yōu)化要考慮哪些方面?
  • 海北高端網(wǎng)站建設(shè)哪家好網(wǎng)站推廣途徑和推廣要點(diǎn)
  • 網(wǎng)站建設(shè)方案書(shū)深圳關(guān)鍵詞推廣優(yōu)化
  • 東營(yíng)本地網(wǎng)站制作公司可以入侵的網(wǎng)站
  • 公司網(wǎng)站維護(hù)該誰(shuí)來(lái)做全網(wǎng)營(yíng)銷(xiāo)外包
  • java可以做微信網(wǎng)站么站長(zhǎng)統(tǒng)計(jì)工具
  • 做域名后就得做網(wǎng)站嗎河北高端網(wǎng)站建設(shè)
  • 網(wǎng)站title是什么培訓(xùn)機(jī)構(gòu)加盟店排行榜
  • 網(wǎng)站備案 取名資訊通不過(guò)外貿(mào)網(wǎng)站推廣費(fèi)用
  • 去除wordpress相冊(cè)系統(tǒng)優(yōu)化工具
  • 做網(wǎng)站的回扣什么是seo?
  • 蘇州做門(mén)戶網(wǎng)站的公司公司網(wǎng)站怎么優(yōu)化