Next.js 入門

更新於 發佈於 閱讀時間約 9 分鐘
React/Vue等框架預設都是CSR(Client-Side-Rendering),也就是畫面上任何元素的呈現,都是透過js去向後端拿資料後渲染在畫面上。因此,無論是SPA或MPA在該頁面的第一次載入會需要執行大量的js,速度會比較慢,但是之後的互動就會快很多,因為每次都是更動小區塊的畫面,使用者體驗很好。
然而,也因為CSR的特性,在SEO方面通常會較差,雖然Google爬蟲號稱可以爬取CSR渲染後的HTML,但可能還需要時間驗證效果如何。
因此,為了解決SEO問題,傳統的SSR(Server-Side-Rendering)又被拿出來討論了(現在講的SSR通常是指前端框架的SSR),許多大型專案紛紛開始採用SSR技術,如Next.js就是React的SSR框架,使用者透過瀏覽器進入某個頁面後,由Server產生完整的HTML並回傳瀏覽器,解決了第一次載入速度慢的問題,最重要的是解決了SEO問題。

安裝設置:

$ npx create-next-app@latest
安裝完成後,專案目錄結構如下:
執行$ npm run dev 可直接透過http://localhost:3000進入首頁,對應到pages/index.js。
#開發模式下啟動 Next.js 專案
$ npm run dev
Prod記得每次要先build再start:
#build next prod application
$ npm run build
#啟動next prod server
$ npm run start

接著看看它的source code,可以看到body中的html內容是完整的:
反之,CSR source code 只有root div,html內容皆是透過渲染產生的。

接著在pages下新增一個about.js,該頁面對應到http://localhost:3000/about,Next幫我們把Routing都處理好了,相當方便:

Next.js提供兩種pre-rendering的方式,一個是靜態頁面生成SSG(Static Site Generation),一個是伺服器渲染(SSR),預設為SSG,如上面建立的about頁面。
官方建議若是可以預先渲染的頁面,都採用SSG是比較好的方式,SSG的HTML是在build time建立好的,可以被CDN緩存,速度會比SSR快許多。相反的,若是頁面無法預先渲染,例如資料會頻繁更新或是會根據不同request產生不同內容,則適合用SSR。

Example:

  1. SSG: 透過外部api取得資料建立靜態頁面
使用getStaticProps透過外部api取得data傳入Article中,並渲染出畫面。
後端api回傳資料如下:
pages/article.js:
export async function getStaticProps() {
    const res = await fetch('http://localhost/redis/public/api/article')
    const data = await res.json()
    return {
        props: {
            data,
        },
    }
}
function Article({ data }) {
    return (
        <ul>
          {data.message.map((article) => (
            <li>{article.title} - {article.create_datetime}</li>
          ))}
        </ul>
    )
}
export default Article

2. SSG: 動態路由應用,建立多個靜態頁面。
後端api回傳資料:
export async function getStaticPaths() {
    const res = await fetch('http://localhost/redis/public/api/article')
    const data = await res.json()
  
    const paths = data.message.map((article) => ({
        params: { title: article.title.toString() },
    }))
  
    return { paths, fallback: false }
}
export async function getStaticProps({ params }) {
    const res = await fetch(`http://localhost/redis/public/api/article?title=${params.title}`)
    const data = await res.json()
    return { props: { data } }
}
function Article({ data }) {
    return (
        <ul>
            <li>{data.message.title} - {data.message.create_datetime}</li>
        </ul>
    )
}
export default Article
  • articles/[title].js 這種使用方式,目的為使用文章title來建立預渲染的路徑。
  • getStaticPaths: 用來生成所有需要預渲染的路徑,這邊是設定三篇文章的title。
  • getStaticProps: 根據params的文章title透過外部api取得文章資料,渲染該文章靜態頁面。
  • SSG方式需特別注意,只要DB資料有變動,例如有新增、修改文章或文章被刪除,就需要重新build code,產生新的靜態頁面。(npm run dev模式下會讓人誤以為是動態的,需特別注意)

3. SSR: 每次request頁面時,動態重新產生頁面的HTML。
export async function getServerSideProps() {
    const res = await fetch(`http://localhost/redis/public/api/article`)
    const data = await res.json()
    return { props: { data } }
}
function ArticleSSR({ data }) {
    return (
        <ul>
          {data.message.map((article) => (
            <li key={article.id}>{article.title} - {article.create_datetime}</li>
          ))}
        </ul>
    )
}
  
export default ArticleSSR
  • getServerSideProps: 每次request進來會執行這邊,取得資料後送到ArticleSSR渲染HTML。
  • 由於是每次request都會動態拿資料,因此適合變動頻繁的系統,不須重新build code。

結論:

  • Next.js框架支援SSR/SSG可以讓開發者根據情境選擇適合的用法,加上配置好的Routing,不須像React SPA轉MPA一樣要經過繁雜的設定,可說是相當的方便。
  • 關於SSR/SSG的選擇,建議除非有必要性,否則一律使用SSG速度會比較快,畢竟是預渲染好的頁面。若是使用情境會需要頻繁更動資料,無法忍受每次都要重build code的話,就選擇SSR。
  • Next.js不僅解決了SEO問題,還可以混用CSR,使用SSR/SSG,讓頁面第一次載入速度變快,小區塊UI變動則使用CSR,不必整個頁面重新生成,等於結合了各方優點,只要適當的使用,必能大大提升應用程式的使用者體驗。
即將進入廣告,捲動後可繼續閱讀
為什麼會看到廣告
avatar-img
21會員
161內容數
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
Vic Lin的沙龍 的其他內容
Laravel Migrate可以用來做資料庫版本控制,對開發團隊來說,可以快速修改Schema,了解每個工程師做了什麼change,比如新增、修改哪些欄位、表格等等,是非常實用的功能。 在開始之前,須先建立好DB,並設定好.env中的DB連線config。 建立migrate指令:
假設資料情境是「每位員工可能屬於多個部門,每個部門可能包含多位員工」,這種多對多的關係。 資料情境: 程式碼: 在Model中使用belongsToMany建立多對多關係,employee_department則為中間關聯表的table name。 列出所有員工,帶上對應的部門資料: 完整程式碼:
本篇主要是要探討,with/has/whereHas/doesntHave/whereDoesntHave之間的差別,以部落格文章及留言的例子來看。 資料情境: 程式碼與結果: with是把所有文章跟留言都找出來。 has是把所有有留言的文章找出來,不包含留言。
之前在執行某些專案的時候,常看到->with()這種寫法,因此一直都很好奇到底跟->join()寫法有什麼差別,哪一種寫法效能比較好呢? 資料情境: 假設現在情境是要撈出文章跟留言,目前共有2篇文章,每篇各有4萬筆留言,也就是留言table共有8萬筆資料: 程式碼: 實驗結果: 結論:
本筆記會以簡單的例子說明,如何在Laravel中進行unit test 與 feature test。 phpunit.xml則是設定檔,可以設定哪些檔案要做測試,哪些要排除在外等等。 使用命令建立新的test case: 建立feature test: 建立unit test: 執行測試:
對於使用Laravel來講,可以直接用composer來安裝predis,可以說是相當方便: config/database.php: redis預設有16個資料庫,這邊是各個資料庫的連接設定。 要使用predis,要記得把env file中的REDIS_CLIENT改成predis。 .env:
Laravel Migrate可以用來做資料庫版本控制,對開發團隊來說,可以快速修改Schema,了解每個工程師做了什麼change,比如新增、修改哪些欄位、表格等等,是非常實用的功能。 在開始之前,須先建立好DB,並設定好.env中的DB連線config。 建立migrate指令:
假設資料情境是「每位員工可能屬於多個部門,每個部門可能包含多位員工」,這種多對多的關係。 資料情境: 程式碼: 在Model中使用belongsToMany建立多對多關係,employee_department則為中間關聯表的table name。 列出所有員工,帶上對應的部門資料: 完整程式碼:
本篇主要是要探討,with/has/whereHas/doesntHave/whereDoesntHave之間的差別,以部落格文章及留言的例子來看。 資料情境: 程式碼與結果: with是把所有文章跟留言都找出來。 has是把所有有留言的文章找出來,不包含留言。
之前在執行某些專案的時候,常看到->with()這種寫法,因此一直都很好奇到底跟->join()寫法有什麼差別,哪一種寫法效能比較好呢? 資料情境: 假設現在情境是要撈出文章跟留言,目前共有2篇文章,每篇各有4萬筆留言,也就是留言table共有8萬筆資料: 程式碼: 實驗結果: 結論:
本筆記會以簡單的例子說明,如何在Laravel中進行unit test 與 feature test。 phpunit.xml則是設定檔,可以設定哪些檔案要做測試,哪些要排除在外等等。 使用命令建立新的test case: 建立feature test: 建立unit test: 執行測試:
對於使用Laravel來講,可以直接用composer來安裝predis,可以說是相當方便: config/database.php: redis預設有16個資料庫,這邊是各個資料庫的連接設定。 要使用predis,要記得把env file中的REDIS_CLIENT改成predis。 .env:
你可能也想看
Google News 追蹤
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
Server-Side Rendering (SSR) 是將 Vue.js 組件在伺服器上渲染為 HTML 字串,並直接發送到瀏覽器的一種技術。這樣可以提升頁面顯示速度,尤其在網速慢或設備性能差的情況下。SSR 應用的代碼可在伺服器和客戶端上共享,提高開發效率。
Thumbnail
※ 原本狀態:伺服器渲染 這是 MVC 架構下的 request / response 示意圖,在這張圖呈現的架構裡,畫面和資料都由同一個架構處理。 伺服器渲染流程: 瀏覽器針對特定網址送出請求。 路由器解析請求後,轉接給對應的 controller。 controller 按照要求,透過
Thumbnail
先從react開始: 其實市面上有許多前端框架像是react,angular,vue... 至於為什麼我會選擇react…
Thumbnail
在程式任何地方都能修改各種react組件狀態的做法分享
Thumbnail
CSR(Client Side Rendering)是一種將渲染資料的過程交由瀏覽器端處理的方法。
Thumbnail
伺服器端渲染(SSR)是一種在伺服器端渲染 HTML 頁面的技術。
Thumbnail
前言 現在的前端需求已經越來越高,要考慮HTML及CSS的切版美觀程度,以及React以及Flutter所提出的元件(Componet、widget)觀念,也就是將元件模組化,使元件可以更動態的被程式運行,而不用靜態的客製化每一個介面。開發一個好的元件可以提升整體的開發速度,讓任何使用元件的開發者
Thumbnail
在過年期間,利用集中時間跟完Mosh Hamedani的Next.js課程,掌握了前端至後端的技術應用。本文分享了學習過程中的收穫與成果,以及對於未來應用的展望。
Thumbnail
前端開發者常會遇到需要網頁素材的情況,雖然在公司中都可能有可以配合的平面設計師或是UIUX設計師,但在這個多工高效的時代不免也需要前端開發者也可以處理簡單的設計,也可提升設計審美或與設計師溝通的能力。 然而前端開發者也算是擁有設計師的天賦,透過程式碼來完成平面設計,將網頁的每個介面都視為平面設計,
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
Server-Side Rendering (SSR) 是將 Vue.js 組件在伺服器上渲染為 HTML 字串,並直接發送到瀏覽器的一種技術。這樣可以提升頁面顯示速度,尤其在網速慢或設備性能差的情況下。SSR 應用的代碼可在伺服器和客戶端上共享,提高開發效率。
Thumbnail
※ 原本狀態:伺服器渲染 這是 MVC 架構下的 request / response 示意圖,在這張圖呈現的架構裡,畫面和資料都由同一個架構處理。 伺服器渲染流程: 瀏覽器針對特定網址送出請求。 路由器解析請求後,轉接給對應的 controller。 controller 按照要求,透過
Thumbnail
先從react開始: 其實市面上有許多前端框架像是react,angular,vue... 至於為什麼我會選擇react…
Thumbnail
在程式任何地方都能修改各種react組件狀態的做法分享
Thumbnail
CSR(Client Side Rendering)是一種將渲染資料的過程交由瀏覽器端處理的方法。
Thumbnail
伺服器端渲染(SSR)是一種在伺服器端渲染 HTML 頁面的技術。
Thumbnail
前言 現在的前端需求已經越來越高,要考慮HTML及CSS的切版美觀程度,以及React以及Flutter所提出的元件(Componet、widget)觀念,也就是將元件模組化,使元件可以更動態的被程式運行,而不用靜態的客製化每一個介面。開發一個好的元件可以提升整體的開發速度,讓任何使用元件的開發者
Thumbnail
在過年期間,利用集中時間跟完Mosh Hamedani的Next.js課程,掌握了前端至後端的技術應用。本文分享了學習過程中的收穫與成果,以及對於未來應用的展望。
Thumbnail
前端開發者常會遇到需要網頁素材的情況,雖然在公司中都可能有可以配合的平面設計師或是UIUX設計師,但在這個多工高效的時代不免也需要前端開發者也可以處理簡單的設計,也可提升設計審美或與設計師溝通的能力。 然而前端開發者也算是擁有設計師的天賦,透過程式碼來完成平面設計,將網頁的每個介面都視為平面設計,