自從我這樣擼代碼以后,公司網頁的瀏覽量提高了107%!

歡迎大家前往騰訊云 社區,獲取更多騰訊海量技術實踐干貨哦~

本文由騰訊IVWEB團隊發表于云 社區專欄

作者:yangchunwen

HTTP協議是前端性能乃至安全中一個非常重要的話題,最近在看《web性能權威指南(High Performance Browser Networking)》,把其中關于HTTP部分的內容拿出來分享一下,加了一點自己的想法,當然沒有《HTTP權威指南》講得詳細,但對于理解我們平常做的事情很有啟發。預計會有兩三篇文章,重點分別會涉及到HTTP 1.1、HTTPS、HTTP 2.0等內容,本篇主要涉及HTTP 1.1及其應用。

HTTP的歷史

HTTP 0.9

HTTP的第一個版本被官方稱為HTTP0.9,這是個只有一行的協議,例如:

GET /about/(超文本響應……)
(連接關閉……)

HTTP 0.9有幾個要點:

  • 客戶端/服務器、請求/響應協議
  • ASCII 協議,運行于TCP/IP鏈接之上
  • 設計用來傳輸超文本文檔(HTML)
  • 服務器與客戶端之間的連接在每次請求之后都會關閉

這個版本的HTTP主要用來傳輸文本,并且沒有共用TCP連接。

HTTP 1.0

一個典型的HTTP 1.0請求過程如下:

GET /rfc/rfc1945.txt HTTP/1.0 
User-Agent: CERN-LineMode/2.15 libwww/2.17b3 
Accept: */* HTTP/1.0 200 OK 
Content-Type: text/plain 
Content-Length: 137582
Expires: Thu, 01 Dec 1997 16:00:00 GMT 
Last-Modified: Wed, 1 May 1996 12:45:26 GMT Server: Apache 0.84(超文本響應……)
(連接關閉……)

相對前一個版本,HTTP 1.0主要有以下幾點變化:

  • 請求和相應可以由于多行首部字段構成
  • 響應對象前面添加了一個響應狀態
  • 響應對象不局限于超文本
  • 服務器與客戶端之間的連接在每次請求之后都會關閉
  • 實現了Expires等傳輸內容的緩存控制
  • 內容編碼Accept-Encoding、字符集Accept-Charset等協商內容的支持

這時候開始有了請求及返回首部的概念,開始傳輸不限于文本(其他二進制內容)

HTTP 1.1

HTTP 1.1是當前大部分應用所使用的協議版本。相對前面的1.0版本,HTTP 1.1語義格式基本保持不變,但是它加入了很多重要的性能優化:持久連接、分塊編碼傳輸、字節范圍請求、增強的緩存機制、傳輸編碼及請求管道

實際上,持久鏈接在后來被反向移植到了HTTP1.0上

HTTP 2.0

HTTP 2.0 的主要目標是改進傳輸性能,實現低延遲和高吞吐量。HTTP 2.0作了很多性能角度的優化,另一方面,HTTP的高層協議語義并不會因為這次版本升級而受影響。所有HTTP首部、值,以及它們的使用場景都不會變。現有的任何網站和應用,無需做任何修改都可以在 HTTP 2.0 上跑起來。換句話說, 等以后我們的服務器、客戶端(如瀏覽器)都支持HTTP 2.0的時候,我們不用為了利用 HTTP 2.0 的好處而修改標記,作很多額外的編碼,卻能享受到它帶來的更低的延遲和更高的網絡連接利用率交付!

HTTP 2.0的內容將在下篇或下下篇放出,本文不對其做過多潤色

HTTP 1.1與前端性能

前面講到,HTTP 1.1這個版本引入了大量增強性能的重要特性,其中包括:

  • 持久化連接以支持連接重用
  • 分塊傳輸編碼以支持流式響應
  • 請求管道以支持并行請求處理
  • 字節服務以支持基于范圍的資源請求
  • 改進的更好的緩存機制

這里重點講一下持久化、管道在前端性能優化中的一些應用

持久連接

所謂持久連接,就是重用 TCP連接,多個HTTP請求公用一個TCP連接。

HTTP 1.1 改變了 HTTP 協議的語義,默認使用持久連接。換句話說,除非明確告知(通過

Connection: close
首部),否則服務器默認會保持TCP連接打開。如果你使用的是 HTTP 1.1,從技術上說不需要
Connection: Keep-Alive
首部,但很多客戶端還是選擇加上它,比如我們的瀏覽器在發起請求的時候,一般會默認幫我們帶上
Connection: Keep-Alive
首部。

我們來看一下為什么持久連接對我們來說這么重要。

假設一個網頁僅包含一個HTML文檔及一個CSS樣式文件,服務器響應這兩個文件的時間分別為40ms及20ms,服務器和瀏覽者分別在哈爾濱和深圳,兩者之間單向光纖延遲為28ms(假設的理想狀態,實際會比這個要大)。

  1. 首先是獲取HTML文檔的請求過程:

img

HTML下載完畢后,TCP連接關閉。

  1. 其次,發起CSS資源的請求,再次經歷一次TCP握手

img

可以看到,兩個HTTP請求都分別需要經歷一次TCP的三次握手時間,另外,圖中沒有體現到的是,每一次TCP請求都有可能會經歷一次TCP慢啟動 過程,這是影響傳播性能的一個不可忽視的重要因素。

假如我們底層的TCP連接得到重用,這時候的情況會是這樣子:

img

很明顯,在獲取CSS的請求中,減少了一次握手往返。

一開始,每個請求要用兩個TCP連接,總延遲為284ms。在使用持久連接后,避免了一次握手往返,總延遲減少為228ms。這里面兩次請求節省了56ms(一個RTT,Round-Trip Time)的時間

上面的例子還只是只有一個HTML和一個CSS的簡單假設情況,而現實世界的web的HTTP請求數量比這個要多得多,在啟用持久連接的情況下,N次請求節省的總延遲時間就是(N-1)×RTT。

現實情況中,延遲更高、請求更多,性能提升效果比這里還要高得多。事實上,網絡延遲越高,請求越多,節省的時間就越多。實際應用中,這個節省的總時間可按秒來算了。如果每一個HTTP都重啟一個TCP連接,可想而知要浪費多少時間!

HTTP管道

持久 HTTP 可以讓我們重用已有的連接來完成多次應用請求,但多次請求必須嚴格滿足先進先出(FIFO,first in first out)的隊列順序:發送請求,等待響應完成,再發送客戶端隊列中的下一個請求。

舉一下上一節持久連接的那個例子,首先,服務器處理完第一次請求后,會發生了一次完整的往返:先是響應回傳,接著是第二次請求,在第二次請求到達服務器之間的這段時間里,服務器空閑。

如果服務器能在處理完第一次請求后,立即開始處理第二次請求呢?甚至,如果服務器可以并行處理兩個請求呢?

這時候HTTP管道就派上用場了,HTTP管道是一個很小但對上述工作流非常重要的一次優化。

有了HTTP管道,我們的HTTP請求在一定程度上不用再一個一個地串行請求,而是可以多個并行了,看起來好像很理想:

img

如上圖,HTML和CSS的請求同時到達服務器,服務器同時處理,然后返回。

這一次,通過使用HTTP管道,又減少了兩次請求之間的一次往返,總延遲減少為 172 ms。從一開始沒有持久連接、沒有管道的284ms,到優化后的172ms,這40%的性能提升完全拜簡單的協議優化所賜。

等一下,剛剛那個例子好像哪里還不夠好:既然請求同時到達,同時處理,為什么后面要先返回HTML,然后再返回CSS?兩者不能同時返回嗎?

理想很豐滿,現實卻有點骨感,這就是HTTP 1.1管道的一個很大的局限性:HTTP請求無法很好地利用多路復用,不允許一個連接上的多個響應數據交錯返回(多路復用)。因而一個響應必須完全返回后,下一個響應才會開始傳輸。

這個管道只是讓我們把FIFO隊列從客戶端遷移到了服務器。也就是說,請求可以同時到達服務器,服務器也可以同時處理兩個文件,但是,兩個文件還是得按順序返回給用戶,如下圖:

img

  • HTML和CSS請求同時到達,但先處理的是HTML請求
  • 服務器并行處理兩個請求,其中處理 HTML 用時40ms,處理CSS用時20ms
  • CSS請求先處理完成,但被緩沖起來以等候HTML響應先發送
  • 發送完HTML響應后,再發送服務器緩沖中的CSS響應

可以看到,即使客戶端同時發送了兩個請求,而且CSS資源先準備就緒,但是服務器也會先發送 HTML 響應,然后再交付 CSS。

題外話 上面兩節舉的例子,說到了HTML和CSS請求同時到達,這是書中的例子,實際上,個人覺得這個例子舉得不是很恰當。 實際的web中,HTML及其包含的CSS一般不會同時到達服務器,正常的瀑布圖也不是這樣的,往往是要先獲取HTML內容后瀏覽器才能發起其中的CSS等資源請求。我想作者只是為了闡述原理吧,個人認為換成同一個HTML文檔中CSS和JS可能更加恰當。

這個問題的原理在于TCP層面的“隊首阻塞”,感興趣可以去復習下計算機網絡的課程。其代價往往是:不能充分利用網絡連接,造成服務器緩沖開銷,有可能導致客戶端更大的延遲。更嚴重的時,假如前面的請求無限期掛起,或者要花很長時間才能處理完,所有后續的請求都將被阻塞,等待它完成。

所以,在HTTP 1.1中,管道技術的應用非常有限,盡管其優點毋庸置疑。實際上,一些支持管道的瀏覽器,通常都將其作為一個高級配置選項,但大多數瀏覽器都會禁用它。換句話說,作為前端工程師,開發的應用是面向普通瀏覽器應用的話,還是不要過多的指望HTTP管道,看來還是期待一下HTTP 2.0中對管道的優化吧。

不過,實際上還是有很好地利用HTTP管道的一些應用,例如在WWDC 2012上,有蘋果的工程師分享了一個針對HTTP優化取得巨大成效的案例:通過使用HTTP的持久連接和管道,重用iTunes中既有的TCP連接,使得低網速用戶的性能提升到原來的3倍!

實際上假如你想充分利用管道的好處,必須要保證下面這幾點條件:

  • HTTP客戶端支持管道
  • HTTP服務器支持管道
  • 應用可以處理中斷的連接并恢復
  • 應用可以處理中斷請求的冪等問題
  • 應用可以保護自身不受出問題的代理的影響

因為iTunes的服務器和客戶端都受開發者控制的應用,所以他們能滿足以上的條件。這也許能給開發hybrid應用或者開發瀏覽器之外的web應用的前端工程師們一些啟發,如果你開發的網站面向的用戶是使用五花八門的瀏覽器,你可能就沒轍了。

使用多個TCP連接

因為HTTP 1.1管道存在上面的缺點,所以利用率不高。那么問題來了:假設沒有使用HTTP管道,我們的所有HTTP請求都只能通過持久連接,一個接一個地串行返回,這得有多慢?

實際上,現階段的瀏覽器廠商采取了另外的辦法來解決HTTP 1.1管道的缺陷:允許我們并行打開多個TCP會話。至于是多少個,大家可能已經似曾相識:4到8個不等。這就是前端工程師非常熟悉的

瀏覽器只允許從同一個服務器并行加載4到8個資源
這一認識的真正來歷。

HTTP持久連接雖然幫我們解決了TCP連接復用的問題,但是現階段的HTTP管道卻無法實現多個請求結果的交錯返回,所以瀏覽器只能開啟多個TCP連接,以達到并行地加載資源的目的。

只能說,這是作為繞過應用協議(HTTP)限制的一個權宜之計。可以這樣打一個比喻,一個水管無法同時運輸多種液體,那就只能給每一種液體開通一條運輸管了,至于這個水管什么時候可以智能化到同時運輸不同的液體,又能保證各自完整不受干擾到達目的地并在目的地自行分類?還是那一句,期待HTTP 2.0吧。

這里的連接數為什么是4到8個,是多方平衡的結果:這個數字越大,客戶端和服務器的資源占用越多(在高并發訪問的服務器中因為TCP連接造成的系統開銷不可忽視),每個主機4到8個連接只不過是大家都覺得比較安全的一個數字。

域名分區

前面說到,瀏覽器和服務器之間只能并發4到8個TCP連接,也就是同時下載4到8個資源,夠嗎?

看看我們現在的大部分網站,動不動就幾十個JS、CSS,一次六個,會造成后面大量的資源排隊等待;另外,只下載6個資源,對帶寬的利用率也是很低的。

打個比喻,一個工廠裝了100根水管,每次卻只能用其中6根接水,既慢,又浪費水管!

所以,我們前端性能優化中有一個最佳實踐:使用域名分區

對啊,何必把自己只限制在一個主機上呢?我們可以手工將所有資源分散到多個子域名,由于主機名稱不一樣了,就可以突破瀏覽器的連接限制,實現更高的并行能力。

通過這種方式“欺騙”瀏覽器,這樣瀏覽器和服務器之間的并行傳輸數量就變多了。

域名分區使用得越多,并行能力就越強!

但是,域名分區也是有代價的!

實踐中,域名分區經常會被濫用。

例如,假設你的應用面向的是2G網絡的手機用戶,你分配了好幾個域名,同時加載十幾二十多個CSS、JS,這里的問題在于:

  • 每一個域名都會多出來的DNS查詢開銷,這是額外的機器資源開銷和額外的網絡延時代價。2G網絡的DNS查詢可不像你公司的電腦一樣,相反可能是好幾秒的延遲
  • 同時加載多個資源,以2G網絡那種小得可憐的帶寬來看,后果往往就是帶寬被占滿,每一個資源都下載得很慢
  • 手機的耗電加快

所以在一些低帶寬高延時的場景,例如2G手機網絡,域名分區做過了的話,不光不會帶來前端性能的提升,反而會變成性能殺手。

域名分區是一種合理但又不完美的優化手段,最合適的辦法就是,從最小分區數目(不分區)開始,然后逐個增加分區并度量分區后對應用的影響,從而得到一個最優的域名數。

連接與拼合

我們前端性能優化中有這么一個所謂的最佳實踐原則:合并打包JS、CSS文件,以及做CSS sprite。

現在我們應該知道為什么要這樣做了,實際上就是因為現在HTTP 1.1的管道太弱了,這兩種技術的效果就好像是隱式地啟用了HTTP 管道:來自多個響應的數據前后相繼地連接在一起,消除了額外的網絡延遲。

實際上,就是把管道提高了一層,置入了應用中,也許到了HTTP 2.0時代,前端工程師就不用干這樣的活了吧?(HTTP 2.0的內容下篇講)

當然,連接拼合技術同樣有代價的。

  • 例如CSS sprite,瀏覽器必須分析整個圖片,即便實際上只顯示了其中的一小塊,也要始終把整個圖片都保存在內存中。瀏覽器沒有辦法把不顯示的部分從內存中剔除掉。
  • 再者,既然JS、CSS合并了,帶來的一般就是體積的增大,在帶寬有限的環境下(例如2G)下載時間就變長,一般導致的就是頁面渲染時間延后等后果。因為JavaScript 和CSS 處理器都不允許遞增式執行的,對于JavaScript 和CSS 的解析及執行,則要等到整個文件下載完畢。

打包文件到底多大合適呢?可惜的是,沒有理想的大小。然而,谷歌PageSpeed團隊的測試表明,30~50 KB(壓縮后)是每個JavaScript 文件大小的合適范圍:既大到了能夠減少小文件帶來的網絡延遲,還能確保遞增及分層式的執行。具體的結果可能會由于應用類型和腳本數量而有所不同。

資源內嵌

JavaScript 和CSS 代碼, 通過適當的script 和style 塊可以直接放在頁面中,而圖片甚至音頻或PDF 文件,都可以通過數據URI(data:[mediatype][;base64],data)的方式嵌入到頁面中。

上面的這種方式我們稱為資源內嵌

嵌入資源是另一種非常流行的優化方法, 把資源嵌入文檔可以減少請求的次數。尤其在2G網絡等情況中,內嵌資源可以有效地減少多次請求帶來的時延。可以參考這篇文章在2G中的一些實踐。

當然,有缺點:

  • 內嵌方式的資源,不能被瀏覽器、CDN 或其他緩存代理作為單獨的資源緩存。如果在多個頁面中都嵌入同樣的資源,那么這個資源將會隨著每個頁面的加載而被加載,從而增大每個頁面的總體大小。
  • 如果嵌入資源更新,那么所有以前出現過它的頁面都將被宣告無效,而由客戶端重新從服 務器獲取。
  • 圖片等非文本性資源通過base64 編碼,會導致開銷明顯增大:編碼后的資源大小比原大小增大33%!

Google的磚家給出一些經驗:

  • 只考慮嵌入1~2 KB 以下的資源,因為小于這個標準的資源經常會導致比它自身更高的HTTP 開銷
  • 如果文件很小,而且只有個別頁面使用,可以考慮嵌入。理想情況下,最好是只用一次的資源
  • 如果文件很小,但需要在多個頁面中重用,應該考慮集中打包
  • 如果小文件經常需要更新,就不要嵌入了
  • 通過減少 HTTP cookie 的大小將協議開銷最小化

小結

本文介紹了HTTP 1.1在前端性能優化中的一些應用,有些是為了繞過HTTP 1.1局限性的一些不得不做的事情,比如資源合并、壓縮、內嵌等,這些都可以說是HTTP 2.0來臨前的一些解決問題的“黑魔法”。

HTTP 1.1及其利用當然遠遠沒有本文說得那么簡單,我只是濃縮了一部分內容,有興趣可以去研究《HTTP權威指南》。

問答
BDD框架的前端如何搭建?
相關閱讀
全面進階 H5 直播(上)
NodeJs內存管理
WebGL 紋理顏色原理
【每日課程推薦】機器學習實戰!快速入門在線廣告業務及CTR相應知識

此文已由作者授權騰訊云 社區發布,更多原文請點擊

搜索關注公眾號「云加社區」,第一時間獲取技術干貨,關注后回復1024 送你一份技術課程大禮包!

海量技術實踐經驗,盡在云加社區!

本文轉載于:猿2048https://www.mk2048.com/blog/blog.php?id=hkckhj&title=自從我這樣擼代碼以后,公司網頁的瀏覽量提高了107%!

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

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

相關文章

python數列分段_按范圍分段的Python數組

首先,定義你的“極”數第二,根據這些“極”數生成間隔第三,定義盡可能多的列表。在然后,對于每個間隔,掃描列表并在相關列表中添加屬于該間隔的項代碼:source [1, 4, 7, 9, 2, 10, 5, 8]poles (0,3,6,25)…

51nod 1278 相離的圓

基準時間限制:1 秒 空間限制:131072 KB 分值: 10 難度:2級算法題 平面上有N個圓,他們的圓心都在X軸上,給出所有圓的圓心和半徑,求有多少對圓是相離的。例如:4個圓分別位于1, 2, 3, 4的位置&…

讓我們將包變成模塊系統!

使用構建系統將許多項目分為模塊/子項目( Maven , Gradle , SBT …); 編寫模塊化代碼通常是一件好事。 將代碼分為構建模塊主要用于: 隔離代碼部分(減少耦合) api / impl拆分 僅將…

R語言日期的表示和運算(詳細總結)

1、取出當前日期 Sys.Date() [1] "2014-10-29" date() #注意:這種方法返回的是字符串類型 [1] "Wed Oct 29 20:36:07 2014" 2、在R中日期實際是double類型,是從1970年1月1日以來的天數 typeof(Sys.Date()) [1] "double" …

html高度塌陷問題解決

高度塌陷的問題: 當開啟元素的BFC以后,元素將會有如下的特性 1 父元素的垂直外邊距不會和子元素重疊 開啟BFC的元素不會被浮動元素所覆蓋 開啟BFC的元素可以包含浮動的子元素 如何開啟元素的BFC 設置元素浮動 設置元素絕對定位 …

java空格鍵_Java KeyPressed-如果其他鍵也太舊,則無法檢測是否按下了空格鍵

如標題所示,在我的Java游戲中,無法檢測是否同時按下空格鍵和其他鍵。例如,空格鍵是射擊鍵,而箭頭鍵則使玩家移動。如果我按下向上箭頭鍵,向左箭頭鍵和空格鍵,那么它應該向左上方發射子彈。但是,…

How to fix the bug “Expected required, optional, or repeated.”?

參考:https://github.com/tensorflow/models/issues/1834 You need to download protoc version 3.3 (already compiled). Used protoc inside bin directory to run this command like this:tensorflow$ mkdir protoc_3.3tensorflow$ cd protoc_3.3tensorflow/prot…

立面設計模式–設計觀點

在上一篇文章中,我們描述了適配器設計模式 。 在今天的文章中,我們將展示另一種類似的“四結構幫派”模式 。 顧名思義,結構模式用于從許多不同的對象形成更大的對象結構。 外觀模式就是這樣一種模式,它為系統內的一組接口提供了簡…

Java第三次作業 1502 馬 帥

《Java技術》第三次作業 (一)學習總結 1.書中對面向對象封裝性的定義為:指把對象的屬性和行為看成一個密不可分的整體,把不需要讓外界知道的信息隱蔽起來。簡單來說,就是定義的一些對象,只有在本類中才可以…

sass運算

sass具有運算的特性,可以對數值型的Value(如:數字、顏色、變量等)進行加減乘除四則運算。 請注意運算符前后請留一個空格,不然會出錯。 scss.style css.style 本文轉載于:猿2048https://www.mk2048.com/blog/blog.php?idiij12j&titles…

163 coremail_Icoremail企業郵箱

高速穩定iCoremail企業郵箱于國內外多個網絡運營商的主干網數據中心放置郵件服務器,同時采用我司自主研發的Coremail電子郵件系統,從多方面保障了用戶的流暢體驗。安全可靠iCoremail企業郵箱使用歐洲最大的反病毒安全提供商的Sophos反病毒系列產品&#…

jquery-基礎事件[下]

<script>$(function () {mouseover mouseout mouseenter mouseleave的區別$(div).mouseover(function () {$(this).css(background, red);}).mouseout(function () {$(this).css(background, green);});$(div).mouseenter(function () {$(this).css(background, red);}).…

JavaOne 2012:NetBeans.Next –未來路線圖

我從Continental Ballroom 4和一個NetBeans主題&#xff08; 項目Easel &#xff09;到Continental Ballroom 5&#xff0c;走了必要的幾個步驟&#xff0c;以查看另一個面向NetBeans的演示文稿&#xff1a;“ NetBeans.Next –未來路線圖”。 Ashwin Rao發起了“羽毛之鳥”&am…

LeetCode day30

LeetCode day30 害&#xff0c;昨天和今天在搞數據結構的報告&#xff0c;后面應該也會把哈夫曼的大作業寫上來。 今天認識認識貪心算法。(&#xff61;&#xff65;?&#xff65;)&#xff89; 2697. 字典序最小回文串 給你一個由 小寫英文字母 組成的字符串 s &#xff0c;…

html注冊表

這是第一次使用html寫一個簡單的注冊表&#xff08;有不對的地方希望大家可以幫我指出來謝謝?&#xff09; <!DOCTYPE html><html><head> <title>木木音樂網第一次注冊表</title></head><body><h2>使用手機號碼注冊</…

C#復習正則表達式

由于前段時間為了寫工具學的太J8粗糙 加上最近一段時間太浮躁 所以靜下心來復習 一遍以前學的很弱的一些地方1 委托 public delegate double weituo(double a, double b);public static double test1(double a,double b){return a * b;}public static double test2(double a,…

使用JPA偵聽器的數據庫加密

最近&#xff0c;我不得不將數據庫加密添加到幾個字段中&#xff0c;并且發現了很多不好的建議。 建筑問題 最大的問題是建筑。 如果持久性管理器悄悄地處理您的加密&#xff0c;那么根據定義&#xff0c;您的體系結構將在持久性和安全性設計之間要求緊密而不必要的綁定。 您…

Java是先難后易嗎_在解決問題的時候,是先難后易還是先易后難?

有家長問&#xff0c;孩子一旦聽到不同聲音&#xff0c;就沮喪&#xff0c;一旦有難的事情&#xff0c;就逃避&#xff0c;怎么辦&#xff1f;回答這個問題之前&#xff0c;我們問一個問題“你給孩子玩穿紐扣游戲&#xff0c;是一開始給孩子玩容易穿的紐扣好呢&#xff1f;還是…

在vue中安裝使用vux

最近因為的工作的原因在弄vue&#xff0c;從后端弄到前端之前一直用js&#xff0c;現在第一次接觸vue感覺還挺有意思的&#xff0c;就是自己太菜了&#xff0c;這個腦子呀。。。。不太夠用。。。。。頁面設計用了一個叫vux的東西&#xff0c;vux可以提供一些組件&#xff0c;用…

form表單 獲取與賦值

form表單中使用頻繁的組件: 文本框、單選框、多選框、下拉框、文本域form通過getValues()獲取表單中所有name的值 通過setValues({key:values})給對應的name值進行賦值&#xff0c;其中key對應的name值 在給單選框和多選框賦值時&#xff0c;有幾個疑惑的地方&#xff1a;  …