最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript中對(duì)于SPA單頁(yè)面的理解

 更新時(shí)間:2023年02月23日 11:42:59   作者:北海嶼鹿  
這篇文章主要介紹了JavaScript中對(duì)于SPA單頁(yè)面的理解,單頁(yè)應(yīng)用SPA是一種網(wǎng)絡(luò)應(yīng)用程序或網(wǎng)站的模型,它通過(guò)動(dòng)態(tài)重寫當(dāng)前頁(yè)面來(lái)與用戶交互

一、什么是SPA

SPA(single-page application),翻譯過(guò)來(lái)就是單頁(yè)應(yīng)用SPA是一種網(wǎng)絡(luò)應(yīng)用程序或網(wǎng)站的模型,它通過(guò)動(dòng)態(tài)重寫當(dāng)前頁(yè)面來(lái)與用戶交互,這種方法避免了頁(yè)面之間切換打斷用戶體驗(yàn)在單頁(yè)應(yīng)用中,所有必要的代碼(HTML、JavaScriptCSS)都通過(guò)單個(gè)頁(yè)面的加載而檢索,或者根據(jù)需要(通常是為響應(yīng)用戶操作)動(dòng)態(tài)裝載適當(dāng)?shù)馁Y源并添加到頁(yè)面頁(yè)面在任何時(shí)間點(diǎn)都不會(huì)重新加載,也不會(huì)將控制轉(zhuǎn)移到其他頁(yè)面舉個(gè)例子來(lái)講就是一個(gè)杯子,早上裝的牛奶,中午裝的是開(kāi)水,晚上裝的是茶,我們發(fā)現(xiàn),變的始終是杯子里的內(nèi)容,而杯子始終是那個(gè)杯子結(jié)構(gòu)如下圖

我們熟知的JS框架如react,vue,angular,ember都屬于SPA

二、SPA和MPA的區(qū)別

上面大家已經(jīng)對(duì)單頁(yè)面有所了解了,下面來(lái)講講多頁(yè)應(yīng)用MPA(MultiPage-page application),翻譯過(guò)來(lái)就是多頁(yè)應(yīng)用在MPA中,每個(gè)頁(yè)面都是一個(gè)主頁(yè)面,都是獨(dú)立的當(dāng)我們?cè)谠L問(wèn)另一個(gè)頁(yè)面的時(shí)候,都需要重新加載html、cssjs文件,公共文件則根據(jù)需求按需加載如下圖

單頁(yè)應(yīng)用與多頁(yè)應(yīng)用的區(qū)別

單頁(yè)面應(yīng)用(SPA)多頁(yè)面應(yīng)用(MPA)
組成一個(gè)主頁(yè)面和多個(gè)頁(yè)面片段多個(gè)主頁(yè)面
刷新方式局部刷新整頁(yè)刷新
url模式哈希模式歷史模式
SEO搜索引擎優(yōu)化難實(shí)現(xiàn),可使用SSR方式改善容易實(shí)現(xiàn)
數(shù)據(jù)傳遞容易通過(guò)url、cookie、localStorage等傳遞
頁(yè)面切換速度快,用戶體驗(yàn)良好切換加載資源,速度慢,用戶體驗(yàn)差
維護(hù)成本相對(duì)容易相對(duì)復(fù)雜

單頁(yè)應(yīng)用優(yōu)缺點(diǎn)

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

  • 具有桌面應(yīng)用的即時(shí)性、網(wǎng)站的可移植性和可訪問(wèn)性
  • 用戶體驗(yàn)好、快,內(nèi)容的改變不需要重新加載整個(gè)頁(yè)面
  • 良好的前后端分離,分工更明確

缺點(diǎn):

  • 不利于搜索引擎的抓取
  • 首次渲染速度相對(duì)較慢

三、實(shí)現(xiàn)一個(gè)SPA

  • 監(jiān)聽(tīng)地址欄中hash變化驅(qū)動(dòng)界面變化
  • pushsate記錄瀏覽器的歷史,驅(qū)動(dòng)界面發(fā)送變化

實(shí)現(xiàn)

hash模式

核心通過(guò)監(jiān)聽(tīng)url中的hash來(lái)進(jìn)行路由跳轉(zhuǎn)

// 定義 Router  
class Router {  
    constructor () {  
        this.routes = {}; // 存放路由path及callback  
        this.currentUrl = '';  
        // 監(jiān)聽(tīng)路由change調(diào)用相對(duì)應(yīng)的路由回調(diào)  
        window.addEventListener('load', this.refresh, false);  
        window.addEventListener('hashchange', this.refresh, false);  
    }  
    route(path, callback){  
        this.routes[path] = callback;  
    }  
    push(path) {  
        this.routes[path] && this.routes[path]()  
    }  
}  
// 使用 router  
window.miniRouter = new Router();  
miniRouter.route('/', () => console.log('page1'))  
miniRouter.route('/page2', () => console.log('page2'))  
miniRouter.push('/') // page1  
miniRouter.push('/page2') // page2  

history模式

history模式核心借用HTML5 history apiapi提供了豐富的router相關(guān)屬性先了解一個(gè)幾個(gè)相關(guān)的api

  • history.pushState瀏覽器歷史紀(jì)錄添加記錄
  • history.replaceState修改瀏覽器歷史紀(jì)錄中當(dāng)前紀(jì)錄
  • history.popState當(dāng)history發(fā)生變化時(shí)觸發(fā)
// 定義 Router  
class Router {  
    constructor () {  
        this.routes = {};  
        this.listerPopState()  
    }  
    init(path) {  
        history.replaceState({path: path}, null, path);  
        this.routes[path] && this.routes[path]();  
    }  
    route(path, callback){  
        this.routes[path] = callback;  
    }  
    push(path) {  
        history.pushState({path: path}, null, path);  
        this.routes[path] && this.routes[path]();  
    }  
    listerPopState () {  
        window.addEventListener('popstate' , e => {  
            const path = e.state && e.state.path;  
            this.routers[path] && this.routers[path]()  
        })  
    }  
}  
// 使用 Router  
window.miniRouter = new Router();  
miniRouter.route('/', ()=> console.log('page1'))  
miniRouter.route('/page2', ()=> console.log('page2'))  
// 跳轉(zhuǎn)  
miniRouter.push('/page2')  // page2  

四、如何給SPA做SEO

下面給出基于VueSPA如何實(shí)現(xiàn)SEO的三種方式

SSR服務(wù)端渲染

將組件或頁(yè)面通過(guò)服務(wù)器生成html,再返回給瀏覽器,如nuxt.js

靜態(tài)化

目前主流的靜態(tài)化主要有兩種:

(1)一種是通過(guò)程序?qū)?dòng)態(tài)頁(yè)面抓取并保存為靜態(tài)頁(yè)面,這樣的頁(yè)面的實(shí)際存在于服務(wù)器的硬盤中

(2)另外一種是通過(guò)WEB服務(wù)器的URL Rewrite的方式,它的原理是通過(guò)web服務(wù)器內(nèi)部模塊按一定規(guī)則將外部的URL請(qǐng)求轉(zhuǎn)化為內(nèi)部的文件地址,一句話來(lái)說(shuō)就是把外部請(qǐng)求的靜態(tài)地址轉(zhuǎn)化為實(shí)際的動(dòng)態(tài)頁(yè)面地址,而靜態(tài)頁(yè)面實(shí)際是不存在的。

這兩種方法都達(dá)到了實(shí)現(xiàn)URL靜態(tài)化的效果

使用Phantomjs針對(duì)爬蟲(chóng)處理

原理是通過(guò)Nginx配置,判斷訪問(wèn)來(lái)源是否為爬蟲(chóng),如果是則搜索引擎的爬蟲(chóng)請(qǐng)求會(huì)轉(zhuǎn)發(fā)到一個(gè)node server,再通過(guò)PhantomJS來(lái)解析完整的HTML,返回給爬蟲(chóng)。下面是大致流程圖

到此這篇關(guān)于JavaScript中對(duì)于SPA單頁(yè)面的理解的文章就介紹到這了,更多相關(guān)JS SPA單頁(yè)面內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用cypress編寫第一個(gè)測(cè)試用例

    使用cypress編寫第一個(gè)測(cè)試用例

    這篇文章主要為大家介紹了使用cypress編寫第一個(gè)測(cè)試用例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • JavaScript從數(shù)組中刪除指定值元素的方法

    JavaScript從數(shù)組中刪除指定值元素的方法

    這篇文章主要介紹了JavaScript從數(shù)組中刪除指定值元素的方法,實(shí)例分析了兩種常用的javascript操作數(shù)組指定元素的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-03-03
  • 關(guān)于js陀螺儀的理解分析

    關(guān)于js陀螺儀的理解分析

    這篇文章主要給大家介紹了關(guān)于js陀螺儀的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用js具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 淺析ES6與CommonJS中模塊的用法對(duì)比

    淺析ES6與CommonJS中模塊的用法對(duì)比

    ES6?的模塊化汲取了?CommonJS?和AMD?的優(yōu)點(diǎn),擁有簡(jiǎn)潔的語(yǔ)法和異步的支持,并且寫法也和?CommonJS?非常的相似,下面我們就來(lái)看看二者用法的差異吧
    2023-09-09
  • 精通JavaScript的this關(guān)鍵字

    精通JavaScript的this關(guān)鍵字

    這篇文章主要介紹了JavaScript的this關(guān)鍵字,真正幫助大家做到精通this關(guān)鍵字,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-02-02
  • javascript 閉包疑問(wèn)

    javascript 閉包疑問(wèn)

    今天在編碼時(shí),遇到一個(gè)問(wèn)題,特記錄下。希望對(duì)朋友有所幫助。
    2010-12-12
  • select、radio表單回顯功能實(shí)現(xiàn)避免使用jquery載入賦值

    select、radio表單回顯功能實(shí)現(xiàn)避免使用jquery載入賦值

    select、radio表單回顯避免使用jquery載入賦值,最好的做法是:在jsp頁(yè)面進(jìn)行邏輯判斷,具體實(shí)現(xiàn)如下,感興趣的朋友可以參考下哈,希望對(duì)大家有所幫助
    2013-06-06
  • json前后端數(shù)據(jù)交互相關(guān)代碼

    json前后端數(shù)據(jù)交互相關(guān)代碼

    本篇文章給大家分享了關(guān)于json前后端數(shù)據(jù)交互方法實(shí)現(xiàn)的相關(guān)知識(shí)點(diǎn)內(nèi)容,有興趣的讀者們可以參考學(xué)習(xí)下。
    2018-09-09
  • 返回對(duì)象在當(dāng)前級(jí)別中是第幾個(gè)元素的實(shí)現(xiàn)代碼

    返回對(duì)象在當(dāng)前級(jí)別中是第幾個(gè)元素的實(shí)現(xiàn)代碼

    我就是想怎么獲取 每個(gè)層 相對(duì)于父級(jí)層 是第幾個(gè),需要的朋友可以參考下。
    2011-01-01
  • JavaScript對(duì)象訪問(wèn)器Getter及Setter原理解析

    JavaScript對(duì)象訪問(wèn)器Getter及Setter原理解析

    這篇文章主要介紹了JavaScript對(duì)象訪問(wèn)器Getter及Setter原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-12-12

最新評(píng)論

南靖县| 营山县| 峡江县| 仲巴县| 莆田市| 柳林县| 焉耆| 无极县| 水富县| 原阳县| 永年县| 九龙县| 鲁甸县| 巴青县| 马山县| 历史| 霍邱县| 沂源县| 托里县| 肇东市| 大丰市| 启东市| 雅安市| 潜江市| 八宿县| 中阳县| 富宁县| 铅山县| 积石山| 金堂县| 葫芦岛市| 齐齐哈尔市| 清丰县| 涟源市| 衡阳县| 潍坊市| 林周县| 宜都市| 蓝田县| 共和县| 陵川县|