SSR 是 Sever-side Render 的縮寫,意思是指「在 Server 端就產生(Render)出畫面」。目前大概有幾種產生畫面的時機點:前端
最先期的網站都是 SSR 的方式進行,但每次的從新 Render 會形成後端的負擔提高也讓使用者的體驗變差。然後來的 React/Vue 之類的 Framework 則是基於 CSR 的方式讓使用者體驗,並達到了先後端分離的優勢。但 CSR 仍是伴隨着幾個問題:react
所以,若是可以兼具 CSR 與 SSR 的 Isomorphic ,成了一條新的解法。如下咱們講的 SSR 都是 Isomorphic 同時兼具兩種方式的 SSR。git
「Next.js is a lightweight framework for static and server‑rendered applications.」github
Next 是一個基於 React 的 SSR 解決方案,更多的細節能夠參考官網。npm
根據官方的教學,能夠透過 NPM 的方式手動安裝:json
$ npm install --save next react react-dom
複製代碼
接着再把 package.json 中執行的方式改爲 NEXT:後端
{
"scripts": {
"dev": "next",
"build": "next build",
"start": "next start"
}
}
複製代碼
而後創建一個頁面在 /pages/index.js 檔案:bash
export default () => <div>Welcome to next.js!</div>
複製代碼
最後,運行指令就會將專案跑在 3000 PORT:app
npm run dev
複製代碼
許多人開發 React 會搭配 create-react-app 的 scaffold 來跳過複雜的環境設定,Next.js 也有:框架
$ npm install -g create-next-app
$ create-next-app my-app
$ cd my-app/
$ yarn start
複製代碼
Next 是根據 /pages 目錄做爲 Route 的分配,舉例來講 /pages 的 index 就會對應到 Root URL。咱們先在 /pages 目錄下創建一個 hello.js 的檔案:
const Hello = (props) => (
<div>
<h1>Hello Next</h1>
</div>
)
export default Hello
複製代碼
此時就會多了一個 Route 在 /hello 。
在 Next 中提供了 Link 的 Component 讓咱們能夠進行頁面間的 Client Side 換頁:
import Link from 'next/link'
const Hello = (props) => (
<div>
<Link href={`/`}>
<a>index</a>
</Link>
<Link href={`/hello`}>
<a>hello</a>
</Link>
</div>
)
export default Hello
複製代碼
咱們如今有一個頁面,上面有連結。咱們前面有說過 Next.js 是一個兼具 CSR 與 SSR 的框架,那他是怎麼處理的呢?先區分一下兩種來源:
Next 的作法是透過 getInitialProps 的方式,在 Render 以前就先透過 req 來判斷來源爲什麼:
import Link from 'next/link'
const Hello = (props) => (
<div>
<h1>{props.text}</h1>
<Link href={`/hello`}>
<a>reload</a>
</Link>
</div>
)
Hello.getInitialProps = async function({req, query}) {
if (req)
return { text: 'hello server' }
return { text: 'hello client' }
}
export default Hello
複製代碼
這樣執行以後,咱們能夠發現:
Next 能夠優雅地替咱們解決 Isomorphic 的複雜機制,達到同時有 SSR 與 CSR 的解法。透過了簡單的實做來了解如何開始,若是以後新專案有須要是直得考慮導入的!
本著做由Chang Wei-Yaun (v123582)製做, 以創用CC 姓名標示-相同方式分享 3.0 Unported受權條款釋出。