說實話,我我的仍是以爲文筆愈來愈不錯了,之前的文章都是一個問題悶到天黑,文章寫的有點亂因爲文章過於龐大致使不是一鼓作氣的,思路有時候會很混亂。因此我也準備開始寫系列文,哈哈,嘗試一下嘛~系列文的好處就是每次講一個點,爭取講的細緻一些,但願你們多多指教~php
筆者小白技術棧目前主要是react,全家桶裏react,react-router,redux等用的差很少了,最近想攻關一下服務端渲染(SSR),提到服務端渲染,一大堆繁瑣的webpack配置,後端路由配置等等等等搞得我頭大,煩的不行。我這我的不是很喜歡接觸新東西,可能每一個人學習方式不一樣,我喜歡先會用一個東西,用明白了再去研究它的原理,所以,有沒有相似於一鍵配置或者傻瓜式配置的服務端渲染框架腳手架呢,秉着這個理念,百度了一下就是——Next.js了。html
本人很是喜歡create-react-app這個腳手架,可是官方明確代表了目前不支持服務端渲染,因此只好放棄了,其實基於這個腳手架也是能夠配置的,不過我仍是先弄一個可用的,而後回來再填坑本身配置吧~前端
先來講一下服務端渲染吧,目前作的項目確實是服務端渲染的,可是不是我搭的,我我的寫的一些東西都不是服務端渲染的,因此下面的結論是不少篇文章事後總結的,具體文章在下面,知識這東西就是拿來分享學習的嘛,學會了就是個人~哈哈node
最原始的前端,頁面在瀏覽器獲取到JavaScript和CSS等文件以後開始渲染,徹底在客戶端(也就是瀏覽器),路由是客戶端路由,也就是如今大部分的SPA單頁應用。react
頁面由服務端渲染事後直接返回html頁面給前端,url的變動會刷新整個頁面,也就是之前的php和jsp模式webpack
高端點的詞Universal APP,爲何要同構,由於客戶端渲染存在一個缺點,就是首屏加載過大文件或過多文件會變得特別慢,所以能夠把首屏放在服務端來渲染來提高首屏速度,首屏加載事後路又開始交給客戶端控制,又變成了SPA應用,整個代碼都是用JavaScript來編寫,服務端採用nodejs。git
關於Next.js,我就很少BB了,我寫這篇文章的同時也是我第一次接觸Next.js因此才叫採坑入門,你們感興趣的能夠去官網學學,還挺詳細的 ---> Next.jsgithub
學習編程的咱們都知道,入門系列是hello world,這裏我以爲next.js仍是挺友好的,由於它真的免除了咱們平時所理解的服務端渲染的各類繁雜配置,只須要簡單的幾步就能夠新建一個Universal App。web
好吧,你只須要新建一個文件夾,而後運行下面一段命令編程
// 初始化應用
yarn init
// 安裝三個依賴
yarn add react react-dom next
// package.json配置啓動
{
...
// 新增啓動方式,選擇使用next啓動
"script": {
"dev": "next"
}
...
}
複製代碼
OK,你已經完成了基於next的服務端搭建,是否是真的很簡單。 接下來咱們運行一下yarn dev
。
由於3000常常被另外一個項目使用,因此我把啓動端口改爲3006了,修改script的啓動方式便可:
"script": {
"dev": "next -p 3006"
}
複製代碼
而後咱們訪問http://localhost:3006:
const Home = () => (
<h1>我是Next的首頁</h1>
);
export default Home;
複製代碼
看到這裏,新手小夥伴應該跟我同樣感嘆Next.js強大的同時也會有一個疑問,等一下,怎麼就渲染了?路由你都沒配置憑啥就出首頁了,通常的SPA至少也會配置路由才能進行頁面跳轉,這裏沒配置路由首頁出來了我還有其餘頁面呢,怎麼辦?
原來,這些東西還都是Next給咱們配置好的,剛纔說了Next.js默認匹配pages目錄的index.js做爲根路徑/,其餘的路徑也是這樣按文件名匹配的。
而咱們的各類路由跳轉依賴的再也不是react-router而是next.js給咱們封裝好的路由(其實redux也是,後面會說到)。
/pages/index.js頁面 ----> /
import React, { Fragment } from 'react';
import Link from 'next/link';
const Home = () => (
<Fragment>
<h1>我是Next的首頁</h1>
<Link href='/userList'>
<a>用戶列表頁</a>
</Link>
</Fragment>
);
export default Home;
複製代碼
/pages/userList.js ----> /userList
const UserList = () => (
<h2>我是用戶列表頁</h2>
);
export default UserList;
複製代碼
不過蘿蔔白菜各有所愛,雖然我的以爲很強大可是看不到路由仍是感受怪怪的,並且寫法也有變化,也就是路由必須在pages路徑下才能夠,這樣工程大了之後豈不是會很混亂,並且頁面和路由融合在一塊兒redux怎麼辦,感受很臃腫啊,做爲一個剛從純前端SPA過分過來的確定很彆扭,我以爲不可能這麼low吧,確定不會吧,稍後再探索吧。
服務端渲染與 Universal React App
D2 - 打造高可靠與高性能的React同構解決方案
QQ羣:641113448 (備註:Next.js)