中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

歷史上第一個網(wǎng)頁長這樣

2021-12-26    分類: 網(wǎng)站建設(shè)


1991 年 8 月,第一個靜態(tài)頁面誕生了,這是由 Tim Berners-Lee 發(fā)布的,想要告訴人們什么是萬維網(wǎng)。從靜態(tài)頁面到 ajax 技術(shù),從 Server Side Render 到 React Server Components,歷史的車輪滾滾向前,一個又一個技術(shù)誕生和沉寂。

前言

1994 年,萬維網(wǎng)聯(lián)盟(W3C,World Wide Web Consortium)成立,超文本標(biāo)記語言(HTML,Hyper Text Markup Language)正式確立為網(wǎng)頁標(biāo)準(zhǔn)語言,我們的旅途從此開始。

本文將沿著時間線,從“發(fā)現(xiàn)問題-解決問題”的角度,帶領(lǐng)大家了解 Web 技術(shù)發(fā)展的關(guān)鍵歷程,了解典型技術(shù)的誕生以及技術(shù)更迭的緣由,思考技術(shù)發(fā)展的原因。


Tim Berners-Lee


Tim Berners-Lee(蒂姆·伯納斯·李),英國科學(xué)家,萬維網(wǎng)之父,于 1989 年在歐洲核子研究組織(CERN)正式提出萬維網(wǎng)的設(shè)想。該網(wǎng)絡(luò)最初是為了滿足世界各地大學(xué)和研究所的科學(xué)家之間對自動信息共享的需求而設(shè)計和開發(fā)的,這也是為什么HTML的頂層聲明是document,標(biāo)簽名、文檔對象模型的名稱也是由此而來。

1990 年 12 月,他開發(fā)出了世界上第一個網(wǎng)頁瀏覽器。1993 年 4 月 30 日,歐洲核子研究組織將萬維網(wǎng)軟件置于公共領(lǐng)域,把萬維網(wǎng)推廣到全世界,讓萬維網(wǎng)科技獲得迅速的發(fā)展,深深改變了人類的生活面貌。

他創(chuàng)造了超文本標(biāo)記語言(HTML),并創(chuàng)建了歷史上第一個網(wǎng)站。當(dāng)然,現(xiàn)在只剩下了由 CERN 恢復(fù)的網(wǎng)站副本:info.cern.ch.


靜態(tài)網(wǎng)頁時代

早期的靜態(tài)網(wǎng)頁,只有最基本的單欄布局,HTML 所支持的標(biāo)簽也僅有

、

、。后來為了豐富網(wǎng)頁的內(nèi)容,、

標(biāo)簽誕生了。

這一階段,Web 服務(wù)器基本上只是一個靜態(tài)資源服務(wù)器,每當(dāng)客戶端瀏覽器發(fā)來訪問請求,它都來者不拒的建立連接,查找 URL 指向的靜態(tài)頁面,再返回給客戶端。


隨著網(wǎng)頁的飛速發(fā)展,人們發(fā)現(xiàn)要人工實(shí)現(xiàn)所有信息的編寫是非常困難的,而且非常耗時。

設(shè)想一下,假如一個頁面有兩塊區(qū)域展示的內(nèi)容是互相獨(dú)立的,那么你需要涵蓋所有的可能,需要編寫的頁面數(shù)量是兩塊區(qū)域的內(nèi)容數(shù)量的乘積!

此外,靜態(tài)網(wǎng)站只能夠根據(jù)用戶的請求返回指向的網(wǎng)頁,除了進(jìn)行超鏈接跳轉(zhuǎn),沒辦法實(shí)現(xiàn)任何交互。

此時,人們想要

網(wǎng)頁能夠動態(tài)顯示

直接使用數(shù)據(jù)庫里的數(shù)據(jù)

網(wǎng)頁實(shí)現(xiàn)一些用戶交互

讓頁面更美觀

Java 的誕生

1994 年,網(wǎng)景公司發(fā)布了 Navigator 瀏覽器,但他們急需一種網(wǎng)頁腳本語言,以使瀏覽器可以與網(wǎng)頁互動。


1995年,網(wǎng)景公司的 Brendan Eich 迫于公司的壓力,只花了十天就設(shè)計了 JS 的最初版本,并命名為 Mocha。后來網(wǎng)景公司為了蹭 Java 的熱度,把 JS 最終改名為 Java。但實(shí)際情況是,網(wǎng)景公司和 Sun 公司結(jié)成聯(lián)盟,才更名為 Java。


從此網(wǎng)頁有了一些簡單的用戶交互,比如表單驗證;也有了一些JS為基礎(chǔ)的動效,如走馬燈。

但是讓網(wǎng)頁真正開始進(jìn)入動態(tài)網(wǎng)頁時代的卻是以 PHP 為代表的后端網(wǎng)站技術(shù)。

擴(kuò)展資料:第一次瀏覽器大戰(zhàn)

在網(wǎng)景公司推出 Java 的時候,微軟以 JS 為基礎(chǔ),編寫了 J 和 VB 作為瀏覽器語言,并在 1995 年的 8 月推出了 IE 1.0。

由于微軟在系統(tǒng)里捆綁瀏覽器,而 90% 的人都在使用 Windows 操作系統(tǒng),大量用戶被動地選擇了 IE。面對微軟快速搶占瀏覽器份額,網(wǎng)景公司無奈之下只能快速將 Java 向 ECMa 提交標(biāo)準(zhǔn),制定了 ECMa 標(biāo)準(zhǔn)。

在這段時間,還發(fā)生過一件趣事,IE 4.0 發(fā)布當(dāng)天 Netscape 的員工們發(fā)現(xiàn)公司的草坪上出現(xiàn)了一個大大的 IE 圖標(biāo),這明顯是一個挑釁的舉動。作為回應(yīng),Netscape 把自己的吉祥物 “Mozilla” 放在 IE 的圖標(biāo)上,并掛上胸牌,寫著 “Netscape 72,Microsoft 18”——在當(dāng)時, IE 的市場份額確實(shí)不如 Netscape Navigator。


但這無法解決份額的問題,網(wǎng)景公司最終在第一次瀏覽器大戰(zhàn)中落敗,于 1998 年,被美國在線(aOL)以42億美元收購。

在 1998 年網(wǎng)景公司被收購前,網(wǎng)景公司公開了 Navigator 源代碼,想通過廣大程序員的參與重新獲得市場份額。Navigator 改名為 Mozilla。這也是火狐瀏覽器的由來,也是第二次瀏覽器大戰(zhàn)的伏筆。

CSS

1994 年,Hkon Wium Lie 最初提出了 CSS 的想法。1996 年 12 月,W3C 推出了 CSS 規(guī)范的第一版本。

美觀是所有人的追求。HTML 誕生以來,網(wǎng)頁基本上就是一個簡陋的富文本容器。由于缺少布局和美化手段,早期網(wǎng)頁流行用table標(biāo)簽進(jìn)行布局。為了解決網(wǎng)頁“丑”的問題,Hkon Wium Lie 和 Bert Bos 共同起草了 CSS 提案,同期的 W3C 也對這個很感興趣。


早期網(wǎng)頁外觀

早期的 CSS 存在多種版本,在 PSL96 版本你甚至可以在里面使用邏輯表達(dá)式。但因為它太容易擴(kuò)展,瀏覽器廠商那么多,會變得很難統(tǒng)一,最終被放棄。


在眾多提案中,H?kon W Lie 的 CHSS(Cascading HTML Style Sheets)最早提出了樣式表可疊加的概念。


行尾的百分比表示這條樣式的權(quán)重,最終將根據(jù)權(quán)重計算最終值。圖中將會計算30pt * 40% + 20pt * 60%作為h2字體大小的最終值。

為了解決 CSS 兼容性的問題,網(wǎng)景公司甚至還將 CSS 用 JS 來編寫。

CSS 從誕生開始就伴隨著大量的 bug,不同瀏覽器表現(xiàn)不同坑害了無數(shù)的程序員。今天創(chuàng)新互聯(lián)能用上相對靠譜的 css,不得不說這是一個奇跡。

動態(tài)網(wǎng)頁技術(shù)

1995 年,Rasmus Lerdof 創(chuàng)造的 PHP 開始活躍在各大網(wǎng)站,它讓 Web 可以訪問數(shù)據(jù)庫了,PHP 實(shí)現(xiàn)了人們渴望的動態(tài)網(wǎng)頁。

這里的動態(tài)網(wǎng)頁不是指網(wǎng)頁動效,而是指內(nèi)容的動態(tài)展示、豐富的用戶交互。PHP 就像給網(wǎng)絡(luò)世界打開了一扇窗,各種動態(tài)網(wǎng)頁技術(shù)(如 aSP、JSP)雨后春筍般的冒了出來,萬維網(wǎng)也因此開始高速發(fā)展,MVC 模式也開始出現(xiàn)在后端網(wǎng)站技術(shù)中。


動態(tài)網(wǎng)頁技術(shù)解決了以前各種令人無法呼吸的痛,生活總會越來越好的:

可以用數(shù)據(jù)庫作為基礎(chǔ)來展示網(wǎng)頁內(nèi)容

可以實(shí)現(xiàn)表單和一些簡單交互

再也不用編寫一大堆靜態(tài)頁面了

PHP 等動態(tài)網(wǎng)頁技術(shù)的原理,大體上都是根據(jù)客戶端的請求,從數(shù)據(jù)庫里獲取相對應(yīng)的數(shù)據(jù),然后塞到網(wǎng)頁里去,返回給客戶端一個填充好內(nèi)容的網(wǎng)頁。這個階段也是前后端耦合的。


網(wǎng)頁開發(fā)流程

而當(dāng)一些基礎(chǔ)的需求被滿足之后,動態(tài)網(wǎng)頁技術(shù)帶來的不足也漸漸暴露出來:

網(wǎng)頁總是刷新。用戶名密碼校驗需要刷新以展示錯誤提示;因下拉選擇器選擇不同而展示的內(nèi)容需要刷新才能展示;每次數(shù)據(jù)交互必然會刷新一次頁面。

網(wǎng)頁和后端邏輯混合。相信老前端們都有過這樣的經(jīng)歷:開發(fā)完HTML后,會把頁面發(fā)給后端修改,加上數(shù)據(jù)注入邏輯;聯(lián)調(diào)或者debug的時候兩個人坐在一塊看,查問題的效率很低。

有大量重復(fù)代碼無法復(fù)用。舉一個典型的例子,論壇。很多時候只有內(nèi)容有變化,菜單、側(cè)邊欄等幾乎不會有改變,但每次請求的時候還是得再將整個網(wǎng)頁傳輸一遍。不僅頁面會刷新,速度慢,還挺耗流量(這個年代上網(wǎng)也是一種奢侈)。

然后 aJaX 站了出來。

aJaX

aJaX,async Java and XML,于 1998 年開始初步應(yīng)用,2005 年開始普及。aJaX 的廣泛使用,標(biāo)志著 Web2.0 時代的開啟。這同時也是各大瀏覽器爭鋒的時代。

現(xiàn)在,我們可以通過 aJaX 來動態(tài)獲取數(shù)據(jù),利用 DOM 操作動態(tài)更新網(wǎng)頁內(nèi)容了。來看看加入了 aJaX 的網(wǎng)頁是怎么工作的:


這個時候前端路由還沒有興起,大多數(shù)情況下還是后端返回一整個頁面,部分內(nèi)容通過 aJaX 進(jìn)行獲取。

隨著智能手機(jī)的出現(xiàn),aPP 開始萌芽。相比起網(wǎng)頁,aPP 編寫好之后只需要數(shù)據(jù)接口就能工作;而網(wǎng)頁不僅需要后端寫業(yè)務(wù)邏輯,控制跳轉(zhuǎn),還要寫一部分接口用于 aJaX 請求。

這個階段前端能做的事情還是很少,還背負(fù)著“切圖仔”的綽號。隨著 HTML5 草案的提出,前端能做的交互越來越多,程序員們急需解決以下問題:

后端業(yè)務(wù)代碼和數(shù)據(jù)接口混合,還得兼容 aPP 的接口(很多企業(yè)既有 aPP 又有網(wǎng)站)

前端的代碼復(fù)雜度急劇增加

能不能讓前端也像 aPP 一樣,只需要請求數(shù)據(jù)接口即可展現(xiàn)內(nèi)容呢?

擴(kuò)展資料:第二次瀏覽器大戰(zhàn)

2004 年 Firefox 發(fā)布,拉開了第二次瀏覽器大戰(zhàn)的序幕。同期市面上誕生的各種新興瀏覽器,如 Safari、Chrome 等,也加入了戰(zhàn)爭。


此前由于 XP 系統(tǒng)實(shí)在過于火爆,導(dǎo)致 IE 6 無任何競爭對手,微軟甚至解散了瀏覽器的大部分員工,只留下幾個人象征性地維護(hù)順便修補(bǔ)一下 bug。這讓開發(fā)人員非常痛苦。

此時 Firefox 以優(yōu)越于 IE 的性能和非常友好的編程工具,迅速將那些被 IE6 搞得焦頭爛額的網(wǎng)頁開發(fā)人員們,從水火之中救出,導(dǎo)致先讓前端工程師成為忠實(shí)的第一批用戶,然后,經(jīng)由這些有經(jīng)驗的開發(fā)人員們推廣到了普通的用戶群體。

基于 webkit 內(nèi)核的 Safari,借助自家產(chǎn)品(iOS、MacOS)的壟斷快速收割移動端和 mac 端市場份額;同樣基于 webkit 內(nèi)核的 Chrome,趁著微軟放松警惕,憑借優(yōu)越于市場上所有瀏覽器的性能,如同中國歷史上的成吉思汗一樣大殺四方,快速擴(kuò)展市場份額。

微軟知道,自己已經(jīng)失去了最初能稱霸的機(jī)會,這次它不想失去,IE 再次開始迭代,各大瀏覽器廠商又開始不顧標(biāo)準(zhǔn),迭代再次開始,為了統(tǒng)一化標(biāo)準(zhǔn),W3C 開發(fā)了 HTML5,但是遲遲得不到微軟的認(rèn)可。在其他瀏覽器紛紛支持 HTML5 后,微軟發(fā)現(xiàn),自己又成了孤家寡人,份額不斷縮水。

2016 年,Chrome 瀏覽器份額超越 IE,第二次瀏覽器大戰(zhàn)結(jié)束。


瀏覽器大戰(zhàn)極大的推動了技術(shù)進(jìn)步,正是 Google 研發(fā)出的 V8 引擎極大的提升了 JS 的運(yùn)行效率,NodeJS 才有機(jī)會誕生,前端才能走向全棧。JS 其實(shí)沒有你想象的那么慢。

SPa

2008 年 HTML5 草案提出,各大瀏覽器開啟良性競爭,爭先實(shí)現(xiàn) HTML5 功能。由于 HTML5 帶來前端代碼復(fù)雜度的增加,前端為了尋求良好的可維護(hù)性和可復(fù)用性,也不得不參考后端 MVC 進(jìn)行了設(shè)計和拆分,后來出現(xiàn)了三大前端框架:Vue(2014)、React(2010)、angularJS(2009)。


單頁應(yīng)用返回一個空白的 HTML,并通過 JS 腳本進(jìn)行動態(tài)生成內(nèi)容,從此和頁面刷新說拜拜。

后端不再負(fù)責(zé)模板渲染,前端和 aPP 開始對等,后端的 aPI 也可以通用化了。前后端終于得以分離。(PS:最終目標(biāo)是成為后端)

但 SPa 因為返回的是空 HTML,所有 JS 也被打包為一個文件,需要在一開始就加載完所有的資源,

請求網(wǎng)頁后白屏?xí)r間比傳統(tǒng)網(wǎng)頁要長

爬蟲爬到的是空白頁面,沒辦法做 SEO

在業(yè)務(wù)復(fù)雜的情況下,請求文件很大,渲染非常慢。

這使得前端不得不拆分過于龐大的單頁應(yīng)用,出現(xiàn)了框架的多頁面概念,也出現(xiàn)了多種解決方案。

很多網(wǎng)頁首次加載的時候其實(shí)并不需要太多的東西,比如論壇首頁與貼子詳情頁,完全可以將其拆開,用戶在新打開的頁面閱讀反而體驗更好(多頁應(yīng)用)。

又比如管理后臺,可以在頁面框架內(nèi),將每個菜單對應(yīng)的管理頁拆出來動態(tài)加載(import)。


Server Side Render

Server Side Render,服務(wù)端渲染,簡稱 SSR,又稱服務(wù)端同構(gòu)、直出,一般使用 NodeJS 實(shí)現(xiàn)。

這里的服務(wù)端渲染和以前的不一樣,SSR 會利用已經(jīng)“脫水”的首屏數(shù)據(jù)來渲染首屏頁面返回給客戶端,到了瀏覽器再注入瀏覽器事件,并且保留單頁應(yīng)用的能力,對 SEO 非常友好。但學(xué)習(xí)成本高,限制較多。

讓我們看看傳統(tǒng) SPa 和加入了 SSR 的 SPa 在請求上的區(qū)別:


客戶端渲染示意


服務(wù)端渲染示意

傳統(tǒng) SPa 可以更快的返回頁面,請求響應(yīng)時間更短;加載 JS 后才開始渲染,白屏?xí)r間更長,loading 結(jié)束后用戶感知到的相對可交互時間更早。

而 SSR 在接到瀏覽器請求時,先從后端拉取首屏數(shù)據(jù)渲染在頁面內(nèi)才返回,請求響應(yīng)時間更長;因為節(jié)約了一段瀏覽器請求首屏數(shù)據(jù)的時間,白屏?xí)r間更短。由于 JS 異步加載,用戶感知的相對可交互時間變晚。但體驗上 SSR 一般更好。

在極端情況下,用戶眼中傳統(tǒng) SPa 會一直顯示 loading,使用了 SSR 的頁面則會出現(xiàn)“點(diǎn)不動”的情況。

大多數(shù)時候 SSR 體驗會更佳,因為服務(wù)端承擔(dān)了大部分渲染工作,這也導(dǎo)致服務(wù)端負(fù)載變高。但在業(yè)務(wù)復(fù)雜的情況下,SSR 首屏請求的接口數(shù)很多,導(dǎo)致返回 HTML 變慢。

歸根結(jié)底,SSR 不能很好的應(yīng)付業(yè)務(wù)復(fù)雜的情況,首屏要加載的東西還是太多了。所以我們要怎樣讓用戶感知到的白屏?xí)r間變短呢?

減小加載體積

減少接口請求數(shù)

PWa 緩存

分塊渲染

NodeJS

說完了 SSR,必須說一下 NodeJS。2010 年 NodeJS 正式立項到現(xiàn)在已經(jīng) 11 個年頭了,NodeJS 的誕生來自于 Ryan Dahl(下圖) 的靈感。他想以非阻塞的方式做所有事情,用完全異步方式可以處理非常多的請求(高并發(fā))。


NodeJS 的出現(xiàn)讓前端向全棧的發(fā)展邁出了重大的一步。很多公司開始用 NodeJS 搞 BFF(backend for frontend),我們也開始把 Controller 層放到 NodeJS 來處理,后端只負(fù)責(zé)基礎(chǔ)業(yè)務(wù)數(shù)據(jù)。也就是現(xiàn)在的三層架構(gòu):


這種架構(gòu)在跨端的時候具有良好的適配性,我們可以根據(jù)業(yè)務(wù)需求,為不同端設(shè)計不同的 Controller 和 View,而后臺可以不做變更。這種架構(gòu)省去了很多溝通成本,前端專注頁面的展示,后端專注業(yè)務(wù)邏輯。

當(dāng)然,NodeJS 還可以對后端數(shù)據(jù)進(jìn)行預(yù)處理,前端根據(jù)自己的需要自己設(shè)計數(shù)據(jù)結(jié)構(gòu),頁面開發(fā)與接口調(diào)試形成閉環(huán),還為后端分擔(dān)了壓力。

擴(kuò)展資料:第三次瀏覽器大戰(zhàn)


智能手機(jī)的飛速發(fā)展,這張圖表現(xiàn)的淋漓盡致。第三次瀏覽器大戰(zhàn)是爭奪移動端市場份額的一戰(zhàn),也是當(dāng)下正在進(jìn)行的一戰(zhàn)。

Benedict Evans: “Mobile is eating the world.”(移動設(shè)備正在蠶食世界) “Mobile remakes the Internet.”(移動設(shè)備正在重構(gòu)Internet)

而未來,瀏覽器真正的對手不再是瀏覽器,而是小程序這樣結(jié)合了aPP和網(wǎng)頁優(yōu)點(diǎn)的新興技術(shù)。

未來

早在 2009 年,F(xiàn)acebook 的工程師就開發(fā)了 bigPipe,讓 Facebook 頁面打開速度提高了兩倍。bigPipe 使用分塊渲染的思想,將網(wǎng)頁的渲染變成了一小塊一小塊的,服務(wù)端渲染好一塊頁面就發(fā)送給客戶端。他們直接把木桶拆了,打破了短板效應(yīng)。


服務(wù)端渲染 VS 流式分塊渲染

時隔 11 年,也就是 2020 年 12 月,React 團(tuán)隊提出了 React Server Components,算是一個可擴(kuò)展的前后端融合方案。其理念和 bigPipe 類似,把組件放在服務(wù)端渲染,節(jié)省了從瀏覽器進(jìn)行數(shù)據(jù)請求的開支,一些運(yùn)行時也可以不用放到瀏覽器,減小了包大?。ㄈ?markdown 在服務(wù)端渲染好了,也就不再需要把工具庫發(fā)送給瀏覽器了)。React Server Components 的引入,也同步做到了自動的 Code Split。


React Server Components 原理

不同的是 React Server Components 返回的不是 HTML,而是帶有結(jié)構(gòu)和數(shù)據(jù)的自定義類 JSON 數(shù)據(jù)。


這種結(jié)構(gòu),是對服務(wù)端渲染的核心(結(jié)構(gòu)+數(shù)據(jù))進(jìn)行抽象,結(jié)合 React 的工作方式(如 Suspense),平緩的從服務(wù)端過渡到了客戶端,維持了組件狀態(tài),并且可以更自由的拼裝服務(wù)器組件和客戶端組件。


客戶端組件和服務(wù)端組件混用

關(guān)于拆分這條思路,讓我想到微前端,雖然現(xiàn)在微前端還有很多問題,但微應(yīng)用即服務(wù)也不乏為一條解決之道。未來前端或許會往“小而美”的方向發(fā)展,甚至形成一個以服務(wù)端組件為單位的包管理器,網(wǎng)頁打包大小會越來越小,更多的組件是從網(wǎng)絡(luò)上直接獲取。

此外,我也很期待 Web Components 的發(fā)展,有了原生的支持,0kb runtime 也不是不可能了。合久必分分久必合,現(xiàn)存很多前端框架也可以得到統(tǒng)一了。當(dāng)然現(xiàn)在 Web Components 想要投入使用,首先離不開瀏覽器的支持,而且必須有一個平緩的過渡,此外兼容性也是一個大問題(最后還是苦了程序員們)。

本文首發(fā)公眾號:騰訊技術(shù)工程(ID:Tencent_TEG)

當(dāng)前標(biāo)題:歷史上第一個網(wǎng)頁長這樣
網(wǎng)站地址:http://www.rwnh.cn/news/142201.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、外貿(mào)網(wǎng)站建設(shè)、服務(wù)器托管網(wǎng)站排名、App開發(fā)、網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

南陵县| 松桃| 昌江| 靖边县| 台中县| 北票市| 大宁县| 蒲江县| 巍山| 封开县| 水富县| 金秀| 绵竹市| 安阳市| 彝良县| 红安县| 商丘市| 海兴县| 大埔县| 磴口县| 灵宝市| 石嘴山市| 辽阳县| 阿图什市| 寻甸| 苏州市| 龙南县| 静乐县| 大埔区| 鄢陵县| 托里县| 宁陵县| 三都| 博爱县| 酉阳| 安丘市| 含山县| 博湖县| 明溪县| 天峻县| 正蓝旗|