LionEdu 1–5 前端工程的展現,NextJS 完美出擊

DEBUG
LT Lab
Published in
5 min readMay 14, 2020

如果你是前端新手或者是自家產品技術包袱很沈重的專案,在使用 NextJS 可以仔細評估一下其中的效益;會用 NextJS framewrok 都基於用了 ReactJS 需要 SSR(Server Side Render),讓 SEO 能正確的爬到內容,但並非所有的開發項目都需要將 View 的部分給拆分出來,過往的後端開發模式 MVC (Model-View-Controler) 或許會是更好的方案,透過 Controller 去調用 View 的模板,並將資料塞進指定位置並回應請求,也大大降低開發中的複雜度。

技術包袱沈重的專案,應該都是以後端為主的 MVC 開發架構,會考慮使用 ReactJS 不外乎想把 View 給抽離出來,做更專業的分工,減少過往前端切版,後端再套版重工的問題,ReactJS 屬於 UI Library ,由瀏覽器端渲染畫面(Client Side Render(CSR)),如果有 SSR 的需求,可以考慮透過自家使用的後端語言(諸如 ASP.NET、PHP 等)做伺服端 JS 渲染(V8JS引擎);如果前者不是那麼順利的話,想使用 NextJS 來解決 SSR 的問題,可能會是另一個大工程,會需要啟動 NodeJS Service,目的是在處理 UI Render 的問題,現行的 http Service 也需要做調整;可能最後評估下來是保持現狀,以策安全。

自己測試用伺服端去做 SSR 的經驗也沒那麼順利,用 PHP 去安裝 V8JS 擴展,就搞得昏天黑地,最後放棄收場;如果是使用 NodeJS 去做 SSR 網路上的教學文就蠻多的,可以透過 react-dom/server 提供的方法做到,自己當時實作結果,首次載入會做 Server 跟 Client 兩次渲染的問題,Try Try 滋味就沒深入研究。

ReactJS 的 SSR 方案並非只有 NextJS ,還有另一套叫做 AfterJS,印象中它的出現是要解決當時 NextJS 路由問題,但軟體工程的可怕在於沒有最好只有更好,NextJS 路由後來也做得越來越完善。(之前也踩過坑,動態路由重刷新會有 404 的問題,當時是透過 fridays/next-routes 來解決路由問題)。

NextJS 是前端工程的展現,從過去切版時期所產出的待加工品,變成成品或元件的過程,最後透過軟體工程的整合(服務之間的分離,資料流的傳遞),組合出完整的應用,每個職位各司其職(一人分飾多角,就一起加油吧…),更專精於該領域的開發與優化。

NextJS 它算是 hybrid 的方式,首次載入使用 SSR,後續頁面的切換使用NextJS 的路由處理,透過 CSR 的方式去更新畫面。在 pages 目錄下本身就是路由結構,這邊頁面的檔案型別為 NextPage,具有 function compoent 或 class compoent 的方法或屬性,還擁有一個方法(getInitialProps),會觸發 SSR 或 CSR。

SSG 使用情境,將不常異動的資料內容或者是靜態頁面,預先打包成靜態檔案(HTML、CSS、JS),當請求進來時直接輸出靜態檔,相較於 SSR 不需再重新渲染畫面,減少伺服器的負載。

https://espeo.eu/blog/client-and-server-side-rendering-static-site-generators/

除了 getInitialProps,NextJS 9.3 提供三個方法做到 SSR 或 SSG(Static Site Generators)

getStaticProps 及 getStaticPaths 主要處理靜態檔案及靜態檔動態路由捕捉,運行時間在於 build 的時候;getServerSideProps 及 getInitialProps,會依據請求運行於 Server 端,差別在於 getInitialProps 會因為運行 next/router 路由,而在 Client 端發出 XHR 請求。

NextJS 另一個重點是路由,他依據 pages 下的目錄結構來決定(也可自訂 server 來客製化路由位置),會 import 到兩種東西 next/link 或 next/router,差在於一個是用 a 標籤來表示,另一個是透過 JS 的方式來控制。如果需要使用動態變數,做動態路由,檔案命名會以中括號表示,括號裡面放變數名稱。

next/router 調用的方法,還有一個 options 參數使用,是否做淺層路由(shallow routing),網址變更但不觸發 getInitialProps ,可用於換頁時,資料已更新連帶變更 url,當做頁面刷新時,能有相同內容,須注意網址變更需要相同的路由位置。

NextJS 的基本技能不外乎,Webpack、ReactJS、Typescript(如果喜歡強型別)及 CSS,以上技能需要協助或加強的,歡迎找我們教育訓練組的老面孔Jinwei Chang,前端開發多年經驗,教學認真又富耐心,業界號稱移動的代碼庫,代碼解說具有深度又不失幽默與易懂,就這樣了,不幫 Jinwei Chang 哥哥工商了(P.S. 因為工商才有機會聽哥哥講 Docker)。

--

--

DEBUG
LT Lab
Editor for

軟體工程的可怕是沒有最優,只有更優的代碼,每天被放大鏡檢視的錯誤(BUG),已鍛鍊內心的強大,有時可能厚者臉皮裝傻帶過,更多時候是不願服輸,比昨日的自己還強大。