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

原生JS進行前后端同構

 更新時間:2018年04月22日 15:18:16   作者:hpoenixf  
本文通過實例給大家分享了原生JS進行前后端同構的相關知識點以及相關代碼,有需要的朋友參考學習下。

什么是前后端同構

明確三個概念:「后端渲染」指傳統(tǒng)的 ASP、Java 或 PHP 的渲染機制;「前端渲染」指使用 JS 來渲染頁面大部分內容,代表是現(xiàn)在流行的 SPA 單頁面應用;「同構渲染」指前后端共用 JS,首次渲染時使用 Node.js 來直出 HTML。一般來說同構渲染是介于前后端中的共有部分。

感覺前端的確是折騰,之前還在流行前后端分離,現(xiàn)在怎么又要做前后端同構了?

原因是現(xiàn)在流行的SPA前端單頁面應用比較沉重,首次訪問需要加載文件較多,第一次加載過慢,用戶需要等待前端進行渲染頁面。而且不利于SEO及緩存,并且有一定的開發(fā)門檻。

前后端同構通過復用模板和JS文件,讓一份代碼可以同時跑在服務器和瀏覽器,首次渲染使用nodejs渲染頁面,之后使用SPA路由跳轉??梢杂行p少用戶首次訪問的等待時間,并且對SEO比較友好,也便于緩存。

項目簡介

本前后端同構項目主要分為兩個部分,一個是基于koa2的渲染服務器,另一個是基于原生JS和zepto的前端SPA。

項目的特點是不使用vue和react等框架,門檻低,開發(fā)速度快,便于上手,比較輕巧,核心的router部分只有一百行左右的代碼。適用于頁面交互較少,變化不頻繁的場景下,可以有效的提升性能和加載速度。

前端部分

前端部分的核心是路由部分,具體實現(xiàn)可以基于history API或是hash,網上有很多實現(xiàn),這次主要講下架構
前端部分采用MVC分層結構。

router層做的主要是創(chuàng)建路由示例,調用路由的get方法,給特定頁面綁定來自control層的函數(shù)。
形式如:

import control from '../control'

//路由的構造函數(shù)支持傳入渲染函數(shù),路由的全局名稱,路由跳轉前調用的鉤子
router = new Router(render,'ROUTER',beforeFn)

router.get('/page/a', control.pageA')

control層主要做的是加載跟后端共有的渲染模板和渲染數(shù)據(jù),渲染出頁面后運行頁面函數(shù)

形式如:

let control = {
 pageA(req,res) {
  //webpack的動態(tài)加載,代碼分割功能
  import(/* webpackChunkName: "pageA" */'script/pageA').then(module=> {
  // 檢測該頁面是否已有服務器渲染好,是的話直接運行module.default
  //否則加載模板和數(shù)據(jù)進行渲染,最后再調用頁面函數(shù)
  if(this.needRender(module.default)) {
  //加載數(shù)據(jù)時訪問的地址就是當前準備渲染的頁面地址,只是加上了json=1的參數(shù)
   loadData('pageA').then(data => 
    res.render(xtpl,data,module.default))
  }
 }
}

// 捕捉webpack熱更新,讓他只進行相當于頁面跳轉的操作而不是刷新頁面
if(module.hot) {
 module.hot.accept(['script/pageA'], () => {
  control[ROUTER.req.currentControl].call(ROUTER,null,ROUTER.res)
 })
}

view層即模板,這里使用的是xtpl模板,在服務器環(huán)境和前端環(huán)境下都支持渲染頁面

頁面函數(shù)的形式

頁面函數(shù)要求使用es6的模塊寫法,配合webpack的按需加載功能

export default () => {
 window.addEventListener('scroll', fn)
//頁面函數(shù)支持返回一個卸載函數(shù),在頁面離開的時候會被調用
//主要用于內存的釋放,定時器的清除,事件監(jiān)聽的移除等等
 return function () {
  window.removeEventListener('scroll', fn)
 }
}

后端部分

使用koa2搭建的一個渲染服務器,在收到前端傳來的頁面請求時,會向API服務器請求數(shù)據(jù),并識別頁面請求是否帶有json=1的參數(shù),如果帶有,則為前端路由跳轉時的請求,直接返回數(shù)據(jù)即可,如果沒有帶json參數(shù),加載跟前端共用的模板,配合數(shù)據(jù)進行渲染,發(fā)送到瀏覽器。

相關文章

  • js案例之鼠標跟隨jquery版(實例講解)

    js案例之鼠標跟隨jquery版(實例講解)

    下面小編就為大家?guī)硪黄猨s案例之鼠標跟隨jquery版(實例講解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • Js操作樹節(jié)點自動折疊展開的幾種方法

    Js操作樹節(jié)點自動折疊展開的幾種方法

    這篇文章主要介紹了Js操作樹節(jié)點自動折疊展開的幾種方法,需要的朋友可以參考下
    2014-05-05
  • 微信小程序實現(xiàn)圓心進度條

    微信小程序實現(xiàn)圓心進度條

    這篇文章主要為大家詳細介紹了微信小程序實現(xiàn)圓心進度條,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • echarts圖形x、y坐標文字設置間隔顯示及相關問題詳解

    echarts圖形x、y坐標文字設置間隔顯示及相關問題詳解

    最近在做一個web的數(shù)據(jù)統(tǒng)計部分用到了Echart,下面這篇文章主要給大家介紹了關于echarts圖形x、y坐標文字設置間隔顯示及相關問題的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-08-08
  • JS如何實現(xiàn)基于websocket的多端橋接平臺

    JS如何實現(xiàn)基于websocket的多端橋接平臺

    我們在調試過程使用的工具有:modheader,postman等,但這些工具都會存在的問題:缺少客戶端里相應的設備信息;即使將cookie信息復制出來,也是存在過期的問題;多個設備之間切換時不方便;針對這些存在的問題,我基于websocket雙向通信的特點,實現(xiàn)了多端橋接管理平臺
    2021-05-05
  • javascript仿163網盤無刷新文件上傳系統(tǒng)

    javascript仿163網盤無刷新文件上傳系統(tǒng)

    這個仿163網盤無刷新文件上傳系統(tǒng),并沒有用使用.net的控件,完全的手工制作。
    2008-10-10
  • javascript閉包的使用之按鈕切換功能

    javascript閉包的使用之按鈕切換功能

    閉包就是能夠讀取其他函數(shù)內部變量的函數(shù).這篇文章通過實例代碼給大家介紹了javascript閉包的使用之按鈕切換功能,感興趣的朋友一起看看吧
    2018-08-08
  • style-loader為什么要使用pitch方法原理解析

    style-loader為什么要使用pitch方法原理解析

    這篇文章主要為大家介紹了style-loader為什么要使用pitch方法原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • js實現(xiàn)每日簽到功能

    js實現(xiàn)每日簽到功能

    這篇文章主要為大家詳細介紹了js實現(xiàn)每日簽到功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • js 將input框中的輸入自動轉化成半角大寫(稅號輸入框)

    js 將input框中的輸入自動轉化成半角大寫(稅號輸入框)

    本文主要介紹了稅號輸入框:將input框中的輸入自動轉化成半角大寫的方法,具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02

最新評論

墨竹工卡县| 海晏县| 阳城县| 宜宾县| 绥芬河市| 丹东市| 辽宁省| 卢龙县| 洪江市| 苍南县| 融水| 宁化县| 华蓥市| 北川| 浙江省| 石家庄市| 板桥市| 香港 | 大连市| 鄂托克前旗| 邳州市| 锦屏县| 虎林市| 巫山县| 新晃| 抚远县| 江城| 唐河县| 得荣县| 新津县| 信宜市| 昌宁县| 永胜县| 乌鲁木齐县| 定安县| 赤水市| 固安县| 龙胜| 蒙山县| 尤溪县| 台州市|