###
1. 何為渲染?
頁面上的數據要發生更新,就是渲染。
* 這個工作放在服務器進行就是服務器渲染,放在瀏覽器進行就是瀏覽器渲染。
服務器端渲染,指的是后臺語言通過一些模板引擎生成 html。
瀏覽器端渲染,指的是用 js 去生成 html,前端做路由。
* 客戶端渲染和服務器端渲染的最重要的區別就是究竟是誰來完成html文件的完整拼接,如果是在服務器端完成的,然后返回給客戶端,就是服務器端渲染,而如果是前端做了更多的工作完成了html的拼接,則就是客戶端渲染。
2. 瀏覽器端渲染路線:
請求一個 html。
服務端返回一個 html。
瀏覽器下載 html 里面的 js/css 文件。
等待 js 文件下載完成。
等待 js 加載并初始化完成。
由 js 代碼向后端請求數據(ajax/fetch)。
等待后端數據返回。
客戶端從無到完整地,把數據渲染為響應頁面。?
3. 服務端渲染路線:
請求一個 html。
服務端請求數據
服務器初始渲染。
服務端返回已經有正確內容的頁面。
客戶端請求 js/css 文件。
等待 js 文件下載完成。
等待 js 加載并初始化完成。
客戶端把剩下一部分渲染完成。
##### 服務器端渲染的優缺點是?
**優點:**
1. 前端耗時少。因為后端拼接完了html,瀏覽器只需要直接渲染出來。
2. 有利于SEO。因為在后端有完整的html頁面,所以爬蟲更容易爬取獲得信息,更有利于seo。
3. 無需占用客戶端資源。即解析模板的工作完全交由后端來做,客戶端只要解析標準的html頁面即可,這樣對于客戶端的資源占用更少,尤其是移動端,也可以更省電。
4. 后端生成靜態化文件。即生成緩存片段,這樣就可以減少數據庫查詢浪費的時間了,且對于數據變化不大的頁面非常高效 。
**缺點:**
1. 不利于前后端分離,開發效率低。使用服務器端渲染,則無法進行分工合作,則對于前端復雜度高的項目,不利于項目高效開發。另外,如果是服務器端渲染,則前端一般就是寫一個靜態html文件,然后后端再修改為模板,這樣是非常低效的,并且還常常需要前后端共同完成修改的動作; 或者是前端直接完成html模板,然后交由后端。另外,如果后端改了模板,前端還需要根據改動的模板再調節css,這樣使得前后端聯調的時間增加。
2. 占用服務器端資源。即服務器端完成html模板的解析,如果請求較多,會對服務器造成一定的訪問壓力。而如果使用前端渲染,就是把這些解析的壓力分攤了前端,而這里確實完全交給了一個服務器。
### 客戶端渲染的優缺點是?
**優點:**
1. 前后端分離。前端專注于前端UI,后端專注于api開發,且前端有更多的選擇性,而不需要遵循后端特定的模板。
2. 體驗更好。比如,我們將網站做成SPA或者部分內容做成SPA,這樣,尤其是移動端,可以使體驗更接近于原生app。
**缺點:**
1. 前端響應較慢。如果是客戶端渲染,前端還要進行拼接字符串的過程,需要耗費額外的時間,不如服務器端渲染速度快。
2. 不利于SEO。目前比如百度、谷歌的爬蟲對于SPA都是不認的,只是記錄了一個頁面,所以SEO很差。因為服務器端可能沒有保存完整的html,而是前端通過js進行dom的拼接,那么爬蟲無法爬取信息。 除非搜索引擎的seo可以增加對于JavaScript的爬取能力,這才能保證seo。
##### 使用服務器端渲染還是客戶端渲染?
不談業務場景而盲目選擇使用何種渲染方式都是耍流氓。比如企業級網站,主要功能是展示而沒有復雜的交互,并且需要良好的SEO,則這時我們就需要使用服務器端渲染;而類似后臺管理頁面,交互性比較強,不需要seo的考慮,那么就可以使用客戶端渲染。
另外,具體使用何種渲染方法并不是絕對的,比如現在一些網站采用了首屏服務器端渲染,即對于用戶最開始打開的那個頁面采用的是服務器端渲染,這樣就保證了渲染速度,而其他的頁面采用客戶端渲染,這樣就完成了前后端分離。
- js
- js繼承
- keyCode
- 好的網站
- 零散知識點-js
- This
- 對象深拷貝和淺拷貝
- 數組方法
- 數組的深拷貝和淺拷貝
- JS 引擎的執行機制
- js中的new
- 常用正則
- 函數柯里化
- 會修改當前數組的方法
- 不會修改當前數組的方法
- 函數式編程
- 循環遍歷
- 基礎知識
- 異步
- js知識總結
- fileReader
- HTML
- 零散知識點
- html5新特性
- viewport
- CSS
- cursor
- css3新特性
- 水平居中
- 垂直居中
- display解析
- 塊級元素和行內元素
- css技巧和方法
- 清除浮動
- Less
- Sass
- 綜合
- 微信小程序
- 前端面試
- CSS-面試
- JS-面試
- js-web-api
- js知識
- MVC-面試
- jQuery與框架的區別
- 閉包
- promise
- http狀態碼
- cdn
- 離線存儲
- 事件
- web安全
- 性能優化
- 響應式
- 服務器渲染和本地渲染
- 模板是什么?
- VUE流程
- 瀏覽器渲染過程
- this的指向
- new的使用
- HTML-面試
- title和alt區別
- html5元素
- h5新特性
- 圖片格式
- 零散面試總結
- react
- 生命周期-react
- state
- props
- 組件通信
- 虛擬DOM
- 源碼分析
- webstorm-template
- element與component區別
- 組件的理解
- JXS
- vue與react區別
- 16.8版本
- vue
- 生命周期-vue
- 實現流程
- webpack
- 概念
- 入口起點
- 出口
- loader
- 模式
- 插件
- manifest
- redux
- 介紹
- 核心概念
- 三大原則
- 基礎
- action
- reducer
- store
- 數據流
- 高級
- 異步action
- 異步數據流
- middleware
- ES6阮一峰
- ...
- let
- es6箭頭函數
- const
- 塊級作用域
- 頂層對象的屬性
- global 對象
- 變量的解構賦值
- 字符串的擴展
- promise對象
- 正則的擴展
- 數值的擴展
- Math對象的擴展
- 函數的擴展
- 數組的擴展
- 對象的擴展
- symbol
- async函數
- class的基本用法
- Class 的繼承
- Set 和 Map 數據結構
- 開發工具
- 好用的軟件
- chrome插件
- 其他實用工具
- 微信公眾號-前端早讀課
- 【第1352期】map和reduce,處理數據結構的利器
- 微信公眾號-前端大全
- JS 的執行機制
- 一篇文章理解 JS 繼承
- 瀏覽器
- 緩存
- 《Webkit技術內幕》之頁面渲染過程
- 跨域
- 安全
- XSS
- 設計模式
- 發布訂閱模式
- 工廠模式
- MV*模式
- 觀察者模式
- react-router
- 一些小技巧
- js一些小算法
- 1.已知一個數組中的值,在另外一個數組中查找該值
- 累加器
- 數組隨機
- 數組扁平化并去重排序
- Immutable
- 常用命令
- hybrid
- schema封裝
- typescript