何提升Web頁面的性能,很多開發(fā)人員從多個方面來下手如JavaScript、圖像優(yōu)化、服務器配置,文件壓縮或是調整CSS。
很顯然HTML 已經達到了一個瓶頸,盡管它是開發(fā)Web 界面必備的核心語言。HTML頁面的負載也是越來越重。大多數(shù)頁面平均需要40K的空間,像一些大型網站會包含數(shù)以千計的HTML 元素,頁面Size會更大。
如何有效的降低HTML 代碼的復雜度和頁面元素的數(shù)量,本文主要解決了這個問題,從多個方面介紹了如何編寫簡練,清晰的HTML 代碼,能夠使得頁面加載更為迅速,且能在多種設備中運行良好。
在設計和開發(fā)過程中需要遵循以下原則:
HTML,CSS 和JavaScript三者的關系
HTML 是用于調整頁面結構和內容的標記語言。HTML 不能用于修飾樣式內容,也不能在頭標簽中輸入文本內容,使代碼變得冗長和復雜,相反使用CSS 來修飾布局元素和外觀比較合適。HTML元素默認的外觀是由瀏覽器默認的樣式表定義的,如在Chrome中h1標簽元素會渲染成32px的Times 粗體。
三條通用設計規(guī)則:
文檔結構方面也可以做優(yōu)化,如下:
<!DOCTYPE html> <html> <head> <title>Recipes: pesto</title> </head> <body> <h1>Pesto</h1> <p>Pesto is good!</p> </body> </html>
<head> <title>My pesto recipe</title> <link rel="stylesheet" href="/css/global.css"> <link rel="stylesheet" href="css/local.css"> </head>
使用這兩種方法,瀏覽器會在解析HTML代碼之前將CSS信息準備好。因此有助于提升頁面加載性能。
在頁面底部body結束標簽之前輸入JavaScript代碼,這樣有助于提升頁面加載的速度,因為瀏覽器在解析JavaScript代碼之前將頁面加載完成,使用JavaScript會對頁面元素產生積極的影響。
<body> ... <script src="/js/global.js"> <script src="js/local.js"> </body>
使用Defer和async屬性,腳本元素具有async 屬性無法保證會按順序執(zhí)行。
可在JavaScript代碼中添加Handlers。千萬別加到HTML內聯(lián)代碼中,比如下面的代碼則容易導致錯誤且不易于維護:
index.html:
<head> ... <script src="js/local.js"> </head> <body onload="init()"> ... <button onclick="handleFoo()">Foo</button> ... </body>
下面的寫法比較好:
index.html:
<head> ... </head> <body> ... <button id="foo">Foo</button> ... <script src="js/local.js"> </body>
js/local.js:
init(); var fooButton = document.querySelector('#foo'); fooButton.onclick = handleFoo();
驗證
優(yōu)化網頁的一種方法就是瀏覽器可處理非法的HTML 代碼。合法的HTML代碼很容易調試,且占內存少,耗費資源少,易于解析和渲染運行起來更快。非法的HTML代碼讓實現(xiàn)響應式設計變得異常艱難。
當使用模板時,合法的HTML代碼顯得異常重要,經常會發(fā)生模板單獨運行良好,當與其他模塊集成時就報各種各樣的錯誤,因此一定要保證HTML代碼的質量,可采取以下措施:
代碼格式
格式一致性使得HTML代碼易于閱讀,理解,優(yōu)化,調試。
語義標記
語義指意義相關的事物,HTML 可從頁面內容中看出語義:元素和屬性的命名一定程度上表達了內容的角色和功能。HTML5 引入了新的語義元素,如<header>,<footer>及<nav>。
選擇合適的元素來編寫代碼可保證代碼的易讀性:
例如:
<div>Name: <input type="text" id="name"></div>
換種寫法會更好:
1: <div> 2: <label for="name">Name:</label><input type="text" id="name"> 3: </div>
布局
要提高HTML代碼的性能,要遵循HTML 代碼以實現(xiàn)功能和為目標,而不是樣式。
CSS
雖然本文講解的是如何優(yōu)化HTML,下面介紹了一些使用css的基本技能:
以上就是本文介紹的優(yōu)化HTML代碼的技巧,一個高質量高性能的網站,往往取決于對細節(jié)的處理,因此我們在日常開發(fā)中,能夠考慮到用戶體驗,后期維護等方面,則會產生更高效的開發(fā)。
ava開發(fā)已經悄無聲息的走進我們的生活中,無論是手機軟件、手機Java游戲還是電腦軟件等,只要你使用到電子產品就會碰到和Java有關的東西,更多的企業(yè)正采用Java語言開發(fā)網站,也心音了好多志同道合的朋友開始加入Java開發(fā)的行列。千鋒教育強勢推出的Java+大數(shù)據(jù)的新課程,為更多的Java學習者打造更加先進的Java開發(fā)技術。
我們知道在Java的學習中,Javaweb是我們的必修階段,而在Javaweb開發(fā)中,我們學習的第一課便是HTML5和CSS的入門基礎。我們常說的要瀏覽的網頁就是由HTML語言來編寫的,而CSS就是能讓我們的網頁更加絢麗。通過HTML和CSS的編碼來顯示我們的網頁。所以web開發(fā)的必備技能便是HTML和CSS。
那什么是HTML呢?HTML就是超文本標記語言。下面是千鋒小編為大家準備的HTML的發(fā)展史,教你一步一步踏入Java的世界。
HTML1.0-2.0,分別是在1989年和1991年誕生,起初的這兩個版本只有幾個基本的標簽,而且做出來的網頁也不是很好看,但已經支持了超文本。所以幾乎web上的每一個人都有他們的主頁。
HTML3是在1995年的時候誕生,那時候還誕生了一場漫長而殘酷的瀏覽器戰(zhàn)爭,Netscape和 microsoft都在試圖爭霸世界,每個瀏覽器都在不斷的增加自己的專用擴展包。
HTML4有1998年誕生,此時瀏覽器戰(zhàn)爭結束web標準誕生,HTML的結構和表現(xiàn)分離到兩種語言,一種語言用于實現(xiàn)結構(HTML);一種語言用于表現(xiàn)(CSS)
HTML4.01在1999年誕生,與HTML4相比只是做了一些簡單的修補,所有的瀏覽器都采用一直的標準,除了IE瀏覽器,所以web開發(fā)人員都要單獨做一些工作。
XHTML在 2001年誕生,是XML和HTML的結合,只是XHTML相比于HTML的標準更加嚴格。但是web開發(fā)人員對HTML的靈活性更加的擁護。
HTML5是沿用了HTML4.01的大部分特性,提供了體現(xiàn)web新發(fā)展的新特性,完全支持XHTML風格的代碼,從此HTML5成為大家公認的標準。也就是我們現(xiàn)在都在用的版本HTML5。
HTML5 目標是書寫簡潔的HTML代碼,創(chuàng)建更加簡單的web程序。而我們HTML5常用的標簽:標題標簽、段落標簽、無序列表標簽、有序列表標簽等
我們目前用的CSS3是CSS的新標準,是對CSS2的更新,就像我們美麗的圖片,和我們在照片中做的特效,將我們的網頁裝飾的更加精彩,我們看起來更加舒服。
高樓之所以能高峨聳立,是因為有地基的權利支撐;同樣的Java開發(fā)之所以能夠盡善盡美,是因為我們的HTML和CSS的完美助力,學習Java開發(fā)從千鋒開始吧!
千鋒JavaEE+云數(shù)據(jù)講師團匯集行業(yè)頂尖師資,以從業(yè)經驗5年以上的技術大咖面授教學,原華為技術官、IBM技術負責人、中興項目負責人為首的千鋒講師,撐起國內JavaEE+云數(shù)據(jù)教學第一道防線,力保Java的教學品質。選擇千鋒Java培訓,是你成功的開始,過程中的努力,讓你的成功成為必然!
前后端分離已成為互聯(lián)網項目開發(fā)的業(yè)界標準使用方式,通過nginx+tomcat的方式(也可以中間加一個nodejs)有效的進行解耦,并且前后端分離會為以后的大型分布式架構、彈性計算架構、微服務架構、多端化服務(多種客戶端,例如:瀏覽器,車載終端,安卓,IOS等等)打下堅實的基礎。這個步驟是系統(tǒng)架構從猿進化成人的必經之路。
核心思想:前端html頁面通過ajax調用后端的restuful api接口并使用json數(shù)據(jù)進行交互。
在互聯(lián)網架構中,
web服務器:一般指像nginx,apache這類的服務器,他們一般只能解析靜態(tài)資源。
應用服務器:一般指像tomcat,jetty,resin這類的服務器可以解析動態(tài)資源也可以解析靜態(tài)資源,但解析靜態(tài)資源的能力沒有web服務器好。
一般都是只有web服務器才能被外網訪問,應用服務器只能內網訪問。
以前的JavaWeb項目大多數(shù)都是java程序員又當?shù)之攱專指闱岸耍╝jax/jquery/js/html/css等等),又搞后端(java/mysql/oracle等等)。
隨著時代的發(fā)展,漸漸的許多大中小公司開始把前后端的界限分的越來越明確,前端工程師只管前端的事情,后端工程師只管后端的事情。正所謂術業(yè)有專攻。
對于后端java工程師:
把精力放在java基礎,設計模式,jvm原理,spring+springmvc原理及源碼,linux,mysql事務隔離與鎖機制,mongodb,http/tcp,多線程,分布式架構(dubbo,dubbox,spring cloud),彈性計算架構,微服務架構(springboot+zookeeper+docker+jenkins),java性能優(yōu)化,以及相關的項目管理等等。
后端追求的是:三高(高并發(fā),高可用,高性能),安全,存儲,業(yè)務等等。
對于前端工程師:
把精力放在html5,css3,jquery,angularjs,bootstrap,reactjs,vuejs,webpack,less/sass,gulp,nodejs,Google V8引擎,javascript多線程,模塊化,面向切面編程,設計模式,瀏覽器兼容性,性能優(yōu)化等等。
前端追求的是:頁面表現(xiàn),速度流暢,兼容性,用戶體驗等等。
通常我們的JavaWeb項目都是使用了若干后臺框架,springmvc/struts + spring + spring jdbc/hibernate/mybatis 等等。大多數(shù)項目在java后端都是分了三層,控制層(controller/action),業(yè)務層(service/manage),持久層(dao)。控制層負責接收參數(shù),調用相關業(yè)務層,封裝數(shù)據(jù),以及路由&渲染到jsp頁面。然后jsp頁面上使用各種標簽(jstl/el/struts標簽等)或者手寫java表達式(<%=%>)將后臺的數(shù)據(jù)展現(xiàn)出來,玩的是MVC那套思路。緊接著系統(tǒng)發(fā)布,你需要用maven或者eclipse等工具把你的代碼打成一個war包,然后把這個war包發(fā)布到你的生產環(huán)境下的web容器(tomcat/jboss/weblogic/websphere/jetty/resin)里,對吧?發(fā)布完了之后,你要啟動你的web容器,開始提供服務,這時候你通過配置域名,dns等等相關,你的網站就可以訪問了。這樣一來,你的前后端代碼全都在那個war包里了,包括你的js,css,圖片,各種第三方的庫。
在瀏覽器中輸入你的網站域名(www.xxx.com),之后發(fā)生了什么?瀏覽器通過域名,再通過dns服務器找到你的服務器外網ip,將http請求發(fā)送到你的服務器,在tcp3次握手之后(http下面是tcp/ip),通過tcp協(xié)議開始傳輸數(shù)據(jù),你的服務器得到請求后,開始提供服務,接收參數(shù),之后返回你的應答給瀏覽器,瀏覽器再通過content-type來解析你返回的內容,呈現(xiàn)給用戶。
我們先假設你的首頁中有100張圖片,此時,用戶的看似一次http請求,其實并不是一次,用戶在第一次訪問的時候,瀏覽器中不會有緩存,你的100張圖片,瀏覽器要連著請求100次http請求(有人會跟我說http長連短連的問題,不在這里討論),你的服務器接收這些請求,都需要耗費內存去創(chuàng)建socket來玩tcp傳輸(消耗你服務器上的計算資源)。這樣的話,你的服務器的壓力會非常大,因為頁面中的所有請求都是只請求到你這臺服務器上,如果1個人還好,如果10000個人并發(fā)訪問呢(先不聊服務器集群,這里就說是單實例服務器),那你的服務器能扛住多少個tcp連接?你的帶寬有多大?你的服務器的內存有多大?你的硬盤是高性能的嗎?你能抗住多少IO?你給web服務器分的內存有多大?會不會宕機?
這就是為什么,越是大中型的web應用,他們越是要解耦。
理論上你可以把你的數(shù)據(jù)庫+應用服務+消息隊列+緩存+用戶上傳的文件+日志+等等都扔在一臺服務器上,你也不用玩什么服務治理,也不用做什么性能監(jiān)控,什么報警機制等等。但是這樣把雞蛋都放在一個籃子里,隱患非常大。如果因為一個子應用的內存不穩(wěn)定導致整個服務器內存溢出而hung住,那你的整個網站就掛掉了。
JSP的痛點:
以前的javaWeb項目大多數(shù)使用jsp作為頁面層展示數(shù)據(jù)給用戶,因為流量不高,因此也沒有那么苛刻的性能要求,但現(xiàn)在是大數(shù)據(jù)時代,對于互聯(lián)網項目的性能要求是越來越高。
1.動態(tài)資源和靜態(tài)資源全部耦合在一起,服務器壓力大,因為服務器會收到各種http請求,例如css的http請求,js的,圖片的等等。一旦服務器出現(xiàn)狀況,前后臺一起玩完,用戶體驗極差。
2.UI出好設計圖后,前端工程師只負責將設計圖切成html,需要由java工程師來將html套成jsp頁面,出錯率較高,修改問題時需要雙方協(xié)同開發(fā),效率低下。
3.jsp必須要在支持java的web服務器里運行(例如tomcat,jetty,resin等),無法使用nginx等(nginx據(jù)說單實例http并發(fā)高達5w,這個優(yōu)勢要用上),性能提不上來。
4.第一次請求jsp,必須要在web服務器中編譯成servlet,第一次運行會較慢。
5.每次請求jsp都是訪問servlet再用輸出流輸出的html頁面,效率沒有直接使用html高。
6.jsp內有較多標簽和表達式,前端工程師在修改頁面時會遇到很多痛點。
7.如果jsp中的內容很多,頁面響應會很慢,因為是同步加載。
8.需要前端工程師使用java的ide(例如eclipse),以及需要配置各種后端的開發(fā)環(huán)境,你們有考慮過前端工程師的感受嗎。
基于上述的一些痛點,我們應該把整個項目實現(xiàn)前后端真正的解耦!
前后分離的優(yōu)勢:
1.可以實現(xiàn)真正的前后端解耦,前端服務器使用nginx。
前端/WEB服務器放的是css,js,圖片等等一系列靜態(tài)資源(甚至你還可以css,js,圖片等資源放到特定的文件服務器,例如阿里云的oss,并使用cdn加速),前端服務器負責控制頁面引用&跳轉&路由,前端頁面異步調用后端的接口,后端/應用服務器使用tomcat(把tomcat想象成一個數(shù)據(jù)提供者),加快整體響應速度。
(這里需要使用一些前端工程化的框架比如nodejs,react,router,react,redux,webpack)
2.發(fā)現(xiàn)bug,可以快速定位是誰的問題,不會出現(xiàn)互相踢皮球的現(xiàn)象。
頁面邏輯,跳轉錯誤,瀏覽器兼容性問題,腳本錯誤,頁面樣式等問題,全部由前端工程師來負責。
接口數(shù)據(jù)出錯,數(shù)據(jù)沒有提交成功,應答超時等問題,全部由后端工程師來解決。
雙方互不干擾,前端與后端是相親相愛的一家人。
3.在大并發(fā)情況下,可以同時水平擴展前后端服務器,比如淘寶的一個首頁就需要2000+臺前端服務器做集群來抗住日均多少億+的日均pv。
4.減少后端服務器的并發(fā)/負載壓力
除了接口以外的其他所有http請求全部轉移到前端nginx上,接口的請求調用tomcat,參考nginx反向代理tomcat。
且除了第一次頁面請求外,瀏覽器會大量調用本地緩存。
5.即使后端服務暫時超時或者宕機了,前端頁面也會正常訪問,只不過數(shù)據(jù)刷不出來而已。
6.也許你也需要有微信相關的輕應用,那樣你的接口完全可以共用,如果也有app相關的服務,
那么只要通過一些代碼重構,也可以大量復用接口,提升效率。(多端應用)
7.頁面顯示的東西再多也不怕,因為是異步加載。
8.nginx支持頁面熱部署,不用重啟服務器,前端升級更無縫。
9.增加代碼的維護性&易讀性(前后端耦在一起的代碼讀起來相當費勁)。
10.提升開發(fā)效率,因為可以前后端并行開發(fā),而不是像以前的強依賴。
11.在nginx中部署證書,外網使用https訪問,并且只開放443和80端口,其他端口一律關閉(防止黑客端口掃描),內網使用http,性能和安全都有保障。
12.前端大量的組件代碼得以復用,組件化,提升開發(fā)效率,抽出來!
總結一下新的方式的請求步驟:
大量并發(fā)瀏覽器請求--->web服務器集群(nginx)--->應用服務器集群(tomcat)--->文件/數(shù)據(jù)庫/緩存/消息隊列服務器集群
同時又可以玩分模塊,還可以按業(yè)務拆成一個個的小集群,為后面的架構升級做準備。
*請認真填寫需求信息,我們會在24小時內與您取得聯(lián)系。