一、什么是 SSR ?
-
SSR就是服務器渲染,什么是服務器渲染?由服務器組裝好DOM元素,生成HTML字串給到瀏覽器,也就是在瀏覽器里面是可以看到整個頁面的DOM原始碼的, -
SSR解決的問題:SEO:搜索引擎的優先爬取級別是頁面的HTML結構,當我們使用SSR的時候,服務端已經生成了與業務相關聯的HTML,這樣的資訊對于SEO是很友好的,內容呈現:客戶端無需等待所有的JS檔案加載完成即可看見渲染的業務相關視圖(壓力來到了服務端這邊,這也是需要做權衡的地方,需要區分哪些由服務端渲染,哪些可以交給客戶端), -
SSR相關的弊端:代碼兼容:對于開發人員來講,需要去兼容代碼在不同環境的運行Vue SSR所需要的服務端環境是Node,有一些客戶端的物件,比如dom、windows之類的則無法使用,服務器負載:相對于前后端分離模式下服務器只需要提供靜態資源來說,SSR需要的服務器負載更大,所以在專案中使用SSR模式要慎重,比如一整套圖表頁面,相對于服務端渲染,可能用戶不會在乎初始加載的前幾秒,可以交由客戶端使用類似于骨架屏,或者懶加載之類的提升用戶體驗, -
Vue與Vue SSR與原生HTML頁面原始碼區別對比,在網頁上右鍵查看原始碼:Vue SSR與原生HTML是可以看到原始碼標簽的
Vue默認是看不到原始碼標簽的,因為它是 JS 組裝的,
二、什么是 Nuxt.js ?
-
目前做
SSR的方式有幾種,大概列舉一下:1、前端撰寫
原生靜態頁面,給到服務器,通過服務器框架進行組合資料,例如php的Web 開發,2、使用 prerender-spa-plugin 插件,作者是
Vue核心團隊的成員,這種實作方式并不叫SSR,而是預渲染,不過效果上是一樣的,甚至某種程度上來說可能要比SSR更好,相比官方提供的SSR 繁瑣配置,prerender配置更簡單快捷,3、
Vue官方提供的輪子在Node端做SSR, 相對于prerender插件來說,SSR上手真的超級復雜,有興趣可以自行查看 Vue SSR 指南,這種方法可以做到真實資料實時渲染,完全可供SEO小蜘蛛盡情的爬來爬去,完全前后端同構,路由配置共享,不再影響服務器404請求,但是配置比較麻煩、處理流程比較復雜 (比對預渲染插件,復雜太多)約束較多,對服務器會造成較大的壓力,服務器成本太高了,4、Nuxt.js 是使用
Webpack和Node.js進行封裝的基于Vue的SSR框架,不需要自己搭建一套SSR程式,而是通過其約定好的檔案結構和API就可以實作一個首屏渲染的Web應用,我這里選擇使用 Nuxt.js 來做
SSR,
三、通過 Nuxt.js 創建專案
-
Nuxt.js 官方安裝流程,專案需要依賴
Node環境,我這里用的包管理工具是NPM,Nuxt.js版本是2.14.5, -
創建專案,確保安裝了
npx(npx在NPM版本5.2.0默認安裝了):$ npx create-nuxt-app <專案名>或者用
yarn:$ yarn create nuxt-app <專案名>我這里用
npx創建一個測驗專案,例如:$ npx create-nuxt-app nuxt-test// 進入到檔案夾,執行創建專案命令 dengzemiaodeMacBook-Pro:test dengzemiao$ npx create-nuxt-app nuxt-test create-nuxt-app v3.5.2 ? Generating Nuxt.js project in nuxt-test // 專案初始配置,自己看著選,用什么選什么 不懂就選 None,后面也可以裝的, ? Project name: nuxt-test ? Programming language: JavaScript ? Package manager: Npm ? UI framework: None ? Nuxt.js modules: Axios - Promise based HTTP client ? Linting tools: (Press <space> to select, <a> to toggle all, <i> to invert sele ction) ? Testing framework: None ? Rendering mode: Universal (SSR / SSG) ? Deployment target: Server (Node.js hosting) ? Development tools: jsconfig.json (Recommended for VS Code if you're not using typescript) ? What is your GitHub username? dengzemiao ? Version control system: None .....等待一段時間,就會提示創建專案成功 🎉 Successfully created project nuxt-test // 如果是開發中,運行 npm run dev 就可以,開發者模式 To get started: cd nuxt-test npm run dev // 如果是需要發布到線上了,需要先 build 在 start 才能正式發布 To build & start for production: cd nuxt-test npm run build npm run start
四、Nuxt.js 本地運行
-
這篇文章只講
創建專案到發布服務器,以及服務器怎么部署才能通過服務器訪問,其他專案細節配置放在其他文章中去寫, -
創建完成專案之后,可以先運行專案一下,用上面
To get started或To build & start for production中的方式運行起來專案,只是前者是development模式,后者是production模式,dengzemiaodeMacBook-Pro:test dengzemiao$ cd nuxt-test dengzemiaodeMacBook-Pro:nuxt-test dengzemiao$ npm run dev > nuxt-test@1.0.0 dev /Users/dengzemiao/Desktop/Project/web/test/nuxt-test > nuxt ╭───────────────────────────────────────╮ │ │ │ Nuxt @ v2.14.12 │ │ │ │ ? Environment: development │ │ ? Rendering: server-side │ │ ? Target: server │ │ │ │ Listening: http://localhost:3000/ │ │ │ ╰───────────────────────────────────────╯然后通過上面的
http://localhost:3000/打開瀏覽器進行訪問,但是這個是開發環境, -
在
pages里面的.vue檔案都會被自動轉成路由,檔案夾也是一樣, -
例如:專案
pages檔案夾里面有個index.vue檔案,它會被編譯成index.html,在路由中也就是/index,可以嘗試修改index.vue里面的內容,或者新建一個.vue檔案進行測驗內容, -
例如:我在
pages里面創建一個測驗檔案dzm.vue,運行起來專案,訪問的路徑就是http://localhost:3000/dzm

五、Nuxt.js 直接 ip 訪問專案(正式和測驗都適用)
-
運行開發環境
$ npm run dev╭───────────────────────────────────────╮ │ │ │ Nuxt @ v2.14.12 │ │ │ │ ? Environment: development │ │ ? Rendering: server-side │ │ ? Target: server │ │ │ │ Listening: http://localhost:3000/ │ │ │ ╰───────────────────────────────────────╯ -
運行正式環境
$ npm run build+$ npm run start╭──────────────────────────────────────────╮ │ │ │ Nuxt @ v2.14.12 │ │ │ │ ? Environment: production │ │ ? Rendering: server-side │ │ ? Target: server │ │ │ │ Memory usage: 29.1 MB (RSS: 73.1 MB) │ │ │ │ Listening: http://localhost:3000/ │ │ │ ╰──────────────────────────────────────────╯ -
通過上面的兩個運行的結果,得到的地址都是
http://localhost:3000/,這個是固定本地localhost:3000才可以進訪問,需要改成支持本地ip也能訪問,也就是你拿到本機電腦的ip加上埠也能進行訪問到,例如:http://10.0.93.169:3000 -
找到
nuxt.config.js,添加下面代碼:export default { head: {...}, css: [...], // 配置服務器(主要是這個配置) server: { // port: 8000, // default: 3000 // host: '0.0.0.0', // default: localhost, host: '0', // 等于 host: '0.0.0.0' 這樣配置 timing: false },再次運行專案,正式或測驗都行,訪問地址就會變成本機的
ip地址加埠:╭─────────────────────────────────────────╮ │ │ │ Nuxt @ v2.14.12 │ │ │ │ ? Environment: development │ │ ? Rendering: server-side │ │ ? Target: server │ │ │ │ Memory usage: 29.4 MB (RSS: 74 MB) │ │ │ │ Listening: http://10.0.93.169:3000 │ │ │ ╰─────────────────────────────────────────╯本地運行專案就到這里結束了,下面需要將專案發布到服務器運行起來,
四、Nuxt.js 上傳服務器(Nginx + Node + PM2)
-
下面的這些操作如果需要測驗,可以放在本地機器上進行搭建,把本地電腦當服務器使使,
-
服務器安裝Nginx + Node + PM2, -
Nuxt.js是依賴Node,所以服務器需要安裝Node,裝了Node就會自帶NPM,然后通過NPM安裝PM2:$ npm install -g pm2PM2是Node的行程管理工具,為啥用這個?舉個例子:運行專案之后,命令列視窗是不能關閉的,如果關閉了就無法訪問這個專案地址了,所以需要支持關閉命令列視窗,運行的專案依然能夠訪問,也就是后臺掛起行程,PM2就可以做到這個事情, -
安裝好上面環境,在
Nginx根目錄里面通過Git拉下來Nuxt.js原始碼,可以新開檔案夾存放也是可以的,隨你自己$ git clone xxxxx.git // 如果存在代碼就拉一下代碼 保持最新 $ git pull這里說一下,在網上搜一下會搜到很多只需要匯入幾個檔案就可以運行專案的文章,但是有時候會出現
編譯函式找不到、資源檔案找不到之類的問題,所以如果不是特別熟悉Nuxt.js的話,直接將整個專案拉下來使用,不需要去單獨匯入某些檔案,這樣也完美的避開一些細節上的坑,例如匯入下面幾個檔案:.nuxt static nuxt.config.js package.json package-lock.json -
將代碼拉到服務器后,需要先走一遍
npm安裝,安裝一下依賴包$ npm install -
然后編譯專案
$ npm run build -
PM2運行專案,后臺掛起,PM2啟動有個需要注意的,那就是你的專案名稱必須跟專案package.json檔案里面的name欄位值一樣,一模一樣,它是根據這個去標識的,否則不會生效,// 之前是通過 $ npm run dev 或者 $ npm run start,但是命令列視窗不能關閉 // 啟動測驗環境后臺掛起 $ pm2 start npm --name "你的專案名稱" -- run dev // 啟動正式環境后臺掛起 $ pm2 start npm --name "你的專案名稱" -- run start 在正式服務器就啟動正式環境,例如: $ pm2 start npm --name "nuxt-test" -- run start -
然后可以通過
$ pm2 list查看是否掛起成功,這樣顯示了就是掛起成功了┌─────┬──────────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐ │ id │ name │ namespace │ version │ mode │ pid │ uptime │ ? │ status │ cpu │ mem │ user │ watching │ ├─────┼──────────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤ │ 0 │ nuxt-test │ default │ N/A │ fork │ 1190 │ 0s │ 0 │ online │ 0% │ 7.8mb │ den… │ disabled │ └─────┴──────────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘現在就可以通過你這臺電腦或者服務器的
ip地址加埠號進行訪問了,例如:http://10.0.90.164:3000/, -
如果需要停掉后臺掛起,執行洗掉命令即可,
id就是$ pm2 list串列中的id值:$ pm2 delete id 例如: $ pm2 delete 0 -
如果專案修改調整了,上傳了新的東西,只需要拉下代碼編譯后,重啟
PM2對應環境行程即可:測驗環境 - 初始化:
$ git pull+$ npm install+$ pm2 start npm --name "你的專案名稱" -- run dev測驗環境 - 初始化:
$ git pull+$ npm install+$ npm run build+$ pm2 start npm --name "你的專案名稱" -- run start注意:
$ pm2 start ....命令,每次啟動都會在$ pm2 list串列中新增一個管理行程,所以只需要初始化創建了就行了,后面如果不是通過$ pm2 delete id手動洗掉了,就不需要每次$ pm2 start ....,只需要重啟即可:測驗環境 - 后續版本更新:
$ git pull+$ npm install+$ pm2 restart id正式環境 - 后續版本更新:
$ git pull+$ npm install+$ npm run build+$ pm2 restart id -
額外說一句:如果
PM2啟動專案之后,不知道訪問那個地址,那可以先$ pm2 delete id洗掉行程,執行自帶的運行方式$ npm run dev或$ npm run tart,需要哪個環境就運行哪個命令,運行之后可以拿到訪問地址,拿到之后關掉,在通過PM2運行訪問同意一個地址,注意埠號別變化了,如果埠被占用,會分配一個新的埠:╭──────────────────────────────────────────╮ │ │ │ Nuxt @ v2.14.12 │ │ │ │ ? Environment: production │ │ ? Rendering: server-side │ │ ? Target: server │ │ │ │ Memory usage: 29.4 MB (RSS: 74.6 MB) │ │ │ │ Listening: http://10.0.90.164:3000/ │ │ │ ╰──────────────────────────────────────────╯ -
最終通過
PM2啟動掛起之后,現在需要配置一下Nginx,之前啟動是Node服務,訪問是沒問題的,但是現在需要通過Nginx反代理到Node,也就是通過Nginx去訪問到Node的資源地址, -
找到
Nginx的nginx.conf檔案,在里面添加一個新的服務,以及一個反代理服務http { # 新建一個 nuxt server 服務 upstream nuxt { # 這里就是上面配置的 Node ip + 埠號,之前默認是 localhost:3000 server 0.0.0.0:3000; keepalive 64; } server { listen 8083; #服務器埠 server_name www.nuxt.com; #這里對應你服務器的域名 location / { proxy_pass http://nuxt; #這里對應上面 upstream 中新建的服務名 index index.html index.htm; } } }
-
配置好這個之后,通過
$ nginx啟動Nginx或者$ nginx -s reload重繪Nginx組態檔生效, -
配置好之后,啟動
Node,啟動Nginx,這樣就可以直接通過Node的ip + :3000埠直接訪問,也可以通過Nginx的ip或域名 + :8083埠訪問了,對外當然是走Nginx了,配置一下域名,
-
到這就完事了,其他就是專案內部的細節配置跟使用了,會寫到另外的文章里面去!
-
Nuxt.js(Vue SSR)專案配置以及開發細節
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/255911.html
標籤:其他
上一篇:Js+Map實作兩數之和
下一篇:codemirror 使用總結
