了解 Vue SSR 這一篇足以

文章目錄

    • 1 - 什么是服務器端渲染?
      • 1.1 新建server文件夾
      • 1.2 生成一個node項目
      • 1.3 安裝express
      • 1.4 服務端渲染小案例
      • 1.5 運行查看效果
      • 1.6 打開瀏覽器
      • 1.7 右鍵查看源代碼
    • 2 - 什么是客戶端渲染?
      • 2.1 新建client文件夾
      • 2.2 生成一個vue項目
      • 2.3 安裝依賴并啟動
      • 2.4 瀏覽器查看效果
      • 2.5 查看源代碼
    • 3 - 客戶端渲染vs服務端渲染
      • 3.1 運行架構對比
      • 3.2 開發模式對比
      • 3.3 特點優勢總結
    • 4 - vue框架中的服務端渲染
      • 4.1 新建vue-ssr文件夾
      • 4.2 把server文件夾中的文件拷貝進來
      • 4.3 安裝必要依賴
      • 4.4 vue服務端渲染最小demo
      • 4.5 瀏覽器訪問
      • 4.6 查看源代碼
      • 4.7 遺留問題
    • 5 - 理解同構理念
    • 6 - Nuxt.js框架使用
      • 1. 使用nuxt.js創建一個ssr項目
      • 2. 啟動項目
      • 3. 查看源代碼
      • 4. 搭建首頁
      • 5. 異步數據獲取
        • 1. 認識asyncData方法
        • 2. 獲取文章列表(移動端項目)
        • 3. 渲染接口數據
        • 4. 預覽效果并查看源代碼
    • 7- 總結
      • 7.1 服務端渲染和客戶端渲染各自指什么?有什么特點?
      • 7.2 同構的本質是什么?
      • 7.3 Nuxt.js中如何實現異步數據獲取(asyncData方法)?

1 - 什么是服務器端渲染?

server side render 前端頁面的產生是由服務器端生成的,我們就稱之為服務端渲染

1.1 新建server文件夾

server

1.2 生成一個node項目

npm init -y

1.3 安裝express

express 官方文檔

npm install express --save

1.4 服務端渲染小案例

app.js

const express = require('express')
const app = express()
const port = 3000
// 當路徑為跟路徑,返回完整的html片段
app.get('/', (req, res) => res.send(`<html><body><h1>hi,hello</h1></body></html>
`))app.listen(port, () => console.log(`Example app listening on port ${port}!`))

1.5 運行查看效果

node app.js

1.6 打開瀏覽器

http://localhost:3000

在這里插入圖片描述

1.7 右鍵查看源代碼

在這里插入圖片描述

總結:所謂的服務端渲染值得是頁面的內容完全是由服務端側決定到底要展示出什么內容

2 - 什么是客戶端渲染?

client side render 服務端只提供json格式的數據,渲染成什么樣子由客戶端通過js控制

通過vite快速創建一個基于vue框架的客戶端渲染樣例

2.1 新建client文件夾

client

2.2 生成一個vue項目

我們使用vite工具快速生成一個vue項目,https://vitejs.dev/

npm init @vitejs/app client-vue-app --template vue

2.3 安裝依賴并啟動

cd vue-app
npm install (or `yarn`)
npm run dev (or `yarn dev`)

2.4 瀏覽器查看效果

http://localhost:8080

在這里插入圖片描述

2.5 查看源代碼

在這里插入圖片描述

結論:通過查看源代碼我們發現,源代碼并沒有顯示我們頁面中實際渲染的內容,我們只看到一個main.js文件,和一個id為app的根元素,所以我們知道網頁內容是通過js來動態的進行渲染的,js運行在瀏覽器,瀏覽器也就是客戶端,這種由瀏覽器端的js做主導渲染網頁內容的方式,我們就稱之為客戶端渲染

思考題:如何得知一個網站是哪種方式的渲染?

3 - 客戶端渲染vs服務端渲染

客戶端渲染我們叫做CSR渲染方式,服務端渲染我們叫做SSR渲染

3.1 運行架構對比

在這里插入圖片描述

說明

CSR執行流程:瀏覽器加載html文件 -> 瀏覽器下載js文件 -> 瀏覽器運行vue代碼 -> 渲染頁面

SSR執行流程:瀏覽器加載html文件 -> 服務端裝填好內容 -> 返回瀏覽器渲染

3.2 開發模式對比

CSR:前后端通過接口JSON數據進行通信,各自開發互不影響

SSR:前后端分工搭配復雜,前端需要寫好html模板交給后端,后端裝填模板內容返給瀏覽器

3.3 特點優勢總結

客戶端渲染(CSR)服務端渲染(SSR)
首次渲染時間很短
seo支持良好
前后端分工開發效率

思考:如果我們的項目既想要使用vue高效率的開發項目,同時還想要首屏渲染時間很短,那該怎么辦?

4 - vue框架中的服務端渲染

為了解決第3章節提出的問題,目前我們的vue組件都是在瀏覽器側通過js渲染出來的,所以首次加載時間很慢,那么我們把vue組件交給服務端負責渲染,渲染為完整內容之后直接返給客戶端,是不是就可以可以解決既想渲染快,還想繼續使用vue進行開發的問題了?

vue ssr基礎使用

4.1 新建vue-ssr文件夾

vue-ssr

4.2 把server文件夾中的文件拷貝進來

4.3 安裝必要依賴

npm install vue vue-server-renderer --save

4.4 vue服務端渲染最小demo

app.js

const Vue = require('vue')
const server = require('express')()const renderer = require('vue-server-renderer').createRenderer()server.get('*', (req, res) => {const app = new Vue({data: {url: req.url},template: `<div>訪問的 URL 是:{{ url }}</div>`,})renderer.renderToString(app, (err, html) => {if (err) throw errres.send(html)})
})server.listen(8888,() => console.log(`Example app listening on port 8888!`))

4.5 瀏覽器訪問

http://localhost:8888

在這里插入圖片描述

4.6 查看源代碼

在這里插入圖片描述

結論:我們通過在服務器端渲染vue組件的方式,讓網頁中又有了完整的內容,這樣我們就可以既使用了vue開發又節省了首次渲染時間

4.7 遺留問題

修改app.js,添加一個button元素并使用vue的方式綁定click事件

const Vue = require('vue')
const server = require('express')()const renderer = require('vue-server-renderer').createRenderer()server.get('*', (req, res) => {const app = new Vue({data: {url: req.url},template: `<div>訪問的 URL 是:{{ url }}<button @click="alert('123')">click me!</button></div>`,})renderer.renderToString(app, (err, html) => {if (err) throw errres.send(html)})
})server.listen(8888,() => console.log(`Example app listening on port 8888!`))

運行發現,頁面成功顯示了button按鈕,但是可惜的是,沒有成功綁定事件,點擊無效,事實上除了事件沒有綁定之外,服務器端雖然完成了vue的渲染,但是給到客戶端的時候已經成了字符串了,一系列我們熟悉的vue應用的特性,我們都無法使用,比如數據響應式更新,那該怎么辦呢?

為了解決以上問題,我們需要引入一個新的概念,稱作 同構

5 - 理解同構理念

一套vue(react)代碼,在服務端執行一次,在客戶端再執行一次,就做同構

const app = new Vue({data: {url: req.url},template: `<div>訪問的 URL 是:{{ url }}<button @click="alert('123')">click me!</button></div>`
})

上面所示的vue代碼,我們在服務端的執行保持不變,只要我們把這段代碼在客戶端再重新執行一遍,不就可以擁有原本vue應用的所有特性了么,確實如此,不過這個過程的難度太大,我們現在只需要理解,所謂的同構是指:同一套vue代碼在服務端執行一次在客戶端再執行一次

  1. 服務端執行完成渲染解決了首次加載速度慢的問題
  2. 瀏覽器執行解決了綁定事件及恢復vue本身特性的問題

6 - Nuxt.js框架使用

nuxt.js是一套使用vue框架開發應用的服務端渲染框架,提供了開箱即用的功能

1. 使用nuxt.js創建一個ssr項目

npm create nuxt-app <項目名>

按照提示選擇項目之后完成創建,需要注意,這一步要選擇ssr
在這里插入圖片描述

2. 啟動項目

cd vue-ssr-app
npm run dev

http://localhost:3000

在這里插入圖片描述

3. 查看源代碼

在這里插入圖片描述

顯然,我們看到了網頁上有實際渲染的內容,這是服務端負責的渲染

4. 搭建首頁

pages/index.vue

在nuxt.js生成的項目中我們依舊像之前一樣寫單文件組件.vue代碼,ElementUI組件也可以正常使用

<template><div class="container"><Logo /><div class="articleList"><el-collapse><el-collapse-item title="一致性 Consistency" name="1"><div>與現實生活一致:與現實生活的流程、邏輯保持一致,遵循用戶習慣的語言和概念;</div></el-collapse-item></el-collapse></div></div>
</template><script>
export default {}
</script><style>
.container{padding:0 200px;
}
.articleList{margin-top:30px;
}
</style>

5. 異步數據獲取

https://axios.nuxtjs.org/

1. 認識asyncData方法

asyncData方法會在組件(限于頁面組件)每次加載之前被調用。它可以在服務端或路由更新之前被調用,你可以利用 asyncData方法來獲取數據,Nuxt.js 會將 asyncData 返回的數據融合組件 data 方法返回的數據一并返回給當前組件

官網推薦使用的請求方式 https://axios.nuxtjs.org/

async asyncData({ $axios }) {const ip = await $axios.$get('http://icanhazip.com')return { ip }
},
data(){return {name:'cp'}
}----合并完之后的data數據----
{name:'cp',ip
}

2. 獲取文章列表(移動端項目)

async asyncData ({ $axios }) {const url = 'http://ttapi.research.itcast.cn/app/v1_1/articles?channel_id=0&timestamp=1606309443970&with_top=1'const res = await $axios.$get(url)// eslint-disable-next-line no-consoleconsole.log('文章數據列表:', res)return {list: res.data.results}}

3. 渲染接口數據

<el-collapse><el-collapse-item v-for="item in list" :key="item.id" :title="item.title.slice(0,40)"><div>評論數:{{ item.comm_count }}  點贊數:{{ item.like_count }}</div></el-collapse-item>
</el-collapse>

4. 預覽效果并查看源代碼

結論:我們完成了既使用vue開發模式,又實現了服務端渲染模式,nice~

7- 總結

7.1 服務端渲染和客戶端渲染各自指什么?有什么特點?

SSR 服務端渲染  網頁內容由服務端生成   首屏時間短  有利于seo
CSR 客戶端渲染  vue、react框架渲染方式  spa都是客戶端渲染   首屏渲染時間長不利于seo

7.2 同構的本質是什么?

一份vue代碼在服務端渲染一遍  然后在客戶端再渲染一遍
服務端渲染解決了首屏顯示快  客戶端渲染是需要把事件、響應式特性等vue經典的特性都綁回去我們既可以使用vue的開發模式 又可以享受倆種渲染方式的優勢

7.3 Nuxt.js中如何實現異步數據獲取(asyncData方法)?

asyncData函數時Nuxtjs框架內置的一個函數  
執行結果和和data進行融合  一起返給當前組件 

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/248514.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/248514.shtml
英文地址,請注明出處:http://en.pswp.cn/news/248514.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

3 數組中的重復數字

題目描述 在一個長度為 n 的數組里的所有數字都在 0 到 n-1 的范圍內。數組中某些數字是重復的&#xff0c;但不知道有幾個數字是重復的&#xff0c;也不知道每個數字重復幾次。請找出數組中任意一個重復的數字。 Input: {2, 3, 1, 0, 2, 5}Output: 2 思路 給出了長度為n且數組…

小型軟件項目開發流程探討

一&#xff0e;導言國內很多項目都是小型項目, 參與人員少(兩到五個人), 要快速交付(一兩個月) . 要成功完成這種項目, 除了使用成熟且被團隊成員熟練使用的技術之外, 有一個良好的開發流程, 也是很必要的. 二&#xff0e;小型軟件項目開發流程下圖是我對小型軟件項目開發流程…

Vue2的核心原理剖析

? 用了這么久的Vue2了你真的 知其然&#xff0c;知其所以然么&#xff1f; ?今天博主就為大家帶來一篇對Vue核心功能的部分剖析\textcolor{pink}{今天博主就為大家帶來一篇對Vue核心功能的部分剖析}今天博主就為大家帶來一篇對Vue核心功能的部分剖析 ?后續文章會用更多小案…

Scrum之成敗——從自身案例說起,僅供參考

從07年中初次接觸Scrum的概念到其中幾年項目中逐漸實踐CI、TDD&#xff0c;到親自掌握項目實踐Scrum近一年&#xff0c;最終我們放棄了Scrum這個框架和所謂的“自組織”。原因為何&#xff1f; 1.成員放棄了Scrum所“賦予”的“權利” 比如領用任務、評估工作量、自組織協作、決…

sanic官方文檔解析之下載和Configuration

1,sanic框架是做什么的? sanic的官方網址:https://sanic.readthedocs.io/en/latest/sanic框架是一個類似于flask框架的在Python3.5以上版本的文本服務器,他能夠快速的編寫,它是通過驚人的開發效率完成開發,希望通過這篇文章得到激勵sanic框架的理念是:簡單,高效 sanic的應用如…

首秀 Express 框架

文章目錄框架特性express的使用初始化項目&#xff1a;下載框架模塊&#xff1a;測試代碼&#xff1a;總結以上代碼&#xff1a;請求處理的中間件概念&#xff1a;中間件——app.use基本用法&#xff1a;next的用法app.use中間件的應用路由的保護網站維護公告自定義404&#xf…

云原生技能樹測評

前言 利用午休后的10多分鐘時間&#xff0c;看了看APP的技能樹板塊&#xff0c;簡單的提出幾個看法&#xff01; 答題過程 可以設置為闖關類型&#xff0c;答對一道后可以進入下一關&#xff0c;或者是一個章節為一關&#xff0c;讓大家一直有一種期待 回答錯誤數量 可以…

原型和閉包

原型和閉包 一切皆對象 一切皆對象&#xff08;類型值除外&#xff09; undefined, number, string, boolean屬于簡單的值類型 函數、數組、對象、new Number(10)都是對象。他們都是引用類型 Null是基本數據類型&#xff0c;不是引用數據類型 基本數據類型的值就是它本身的值&a…

python 排序算法

冒泡排序&#xff1a; 1 #coding:utf-82 3 比較相鄰的元素&#xff0c;每一趟交換后&#xff0c;最后的元素是最大的。4 第一次比較n-1次&#xff0c;第二次比較n-2次。。。第n-1次比較1次5 進行n-1次冒泡次數6 最優時間復雜度O(n),最壞時間復雜度O(n^2)7 8 9 def bubble_sort…

獎勵 CSDN 社區的領軍人物

設計動機 領軍人物榜單在這里&#xff1a;https://blog.csdn.net/rank/list/role CSDN 是中國 IT 人士學習、成長、成功的平臺&#xff0c; 這個平臺有很多博主&#xff0c; 博主寫的很多優秀文章獲得了粉絲。 那么&#xff0c; 博主獲得粉絲之后&#xff0c; 博主以粉絲為榮…

一文教會你何為重繪、回流?

文章目錄css圖層圖層創建的條件重繪(Repaint)回流觸發重繪的屬性觸發回流的屬性常見的觸發回流的操作優化方案requestAnimationFrame----請求動畫幀寫在最后學習目標&#xff1a; 了解前端Dom代碼、css樣式、js邏輯代碼到瀏覽器展現過程了解什么是圖層了解重繪與回流了解前端層…

mockjs中的方法(三)

1&#xff09;Mock.mock()&#xff1b; Mock.mock( url, type, template, function(options) ); 其中 url 是定義我們要請求的 url 地址&#xff0c;以便于我們請求的時候 mock 去進行攔截&#xff0c;知道我們要去請求那個值&#xff1b;但是它也是可選的&#xff0c;而且格式…

js函數、js對象的這些點你真的懂嗎?

本篇學習目標 ?了解函數&#xff08;高級&#xff09;原型原型鏈概念\textcolor{green}{了解函數&#xff08;高級&#xff09;原型原型鏈概念}了解函數&#xff08;高級&#xff09;原型原型鏈概念 ?掌握函數作用域\textcolor{green}{掌握函數作用域}掌握函數作用域 ?掌握…

前端處理跨域的幾種方式

什么是跨域&#xff1f; 跨域是指一個域下的文檔或腳本試圖去請求另一個域下的資源&#xff0c;這里跨域是廣義的。 廣義的跨域&#xff1a; 1、資源跳轉&#xff1a;A鏈接、重定向、表單提交 2、資源嵌入&#xff1a; <link>、<script>、<img>、<frame&g…

程序員必知的緩存套圖

文章目錄1. 線程與進程1.1 進程:1.2. 線程:1.3. 關系2. 瀏覽器內核模塊組成4. 事件循環機制5. 緩存5.1. 緩存理解5.2. 緩存分類5.3. 緩存使用示意圖5.4. 緩存中的header參數1. 線程與進程 1.1 進程: 進程是計算機中的程序關于某數據集合上的一次運行活動&#xff0c;是系統進…

安裝webpack及使用

前言 你是否也是只會運用框架中集成好的Webpack配置呢&#xff1f;你明白每一項的意義么&#xff1f;你懂多少Webpack的個性化配置項呢&#xff1f;本篇文章為你講解Webpack中的各種配置項參數及作用&#xff01; 文章目錄了解Webpack相關開啟項目編譯打包應用使用webpack配置…

Python基礎-os模塊 sys模塊

sys模塊 與操作系統交互的一個接口 文件夾相關 os.makedirs(dirname1/dirname2) 可生成多層遞歸目錄os.removedirs(dirname1) 若目錄為空&#xff0c;則刪除&#xff0c;并遞歸到上一級目錄&#xff0c;如若也為空&#xff0c;則刪除&#xff0c;依此類推os.mkdir(dirnam…

php單例型(singleton pattern)

搞定&#xff0c;吃飯 <?php /* The purpose of singleton pattern is to restrict instantiation of class to a single object. It is implemented by creating a method within the class that creates a new instance of that class if one does not exist. If an obje…

開啟關閉各種服務

開啟&關閉 Mac版 查找被占用的8080端口&#xff0c;根據pid殺掉進程 查找8080端口 losf -i:8080 根據pid殺掉進程 kill -9 pid iMac:~ acui$ lsof -i:8080 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME java 62948 ting 93u IPv6 0x6697d6…

助你提高效率的幾個Vue指令

前言 很多使用Vue的同學往往最容易忽略的指令&#xff0c;由于在這里考慮到很多初學甚至還沒有開始接觸Vue的同學呢&#xff0c;在介紹v-clos之前呢就先以大家都熟知的v-model編寫小demo v-model 相信大家對v-model并不陌生&#xff0c;簡單來講他就是用于在表單控件以及組建…