主頁 >  其他 > Next.js 在 Serverless 中從踩坑到破繭重生

Next.js 在 Serverless 中從踩坑到破繭重生

2022-05-11 07:55:56 其他

作者

楊蘇博,偏后端的全堆疊開發,目前負責騰云扣釘的 Cloud Studio 產品,在團隊中負責接技術架構設計與 Review、Cloud Studio 編輯器內核設計與開發、部分核心插件設計與開發;對 WebIDE 領域中的 VS Code 和 Theia IDE 有深入研究與豐富實踐;多年 Serverless 領域從業經驗,是 Serverless First Malagu 開源框架的作者;熱愛開源,敢于創新,

前言

Next.js 是由 Vercel 團隊研發的一款全堆疊應用開發框架,我們使用 Next.js 開發前端頁面以及一些輕量級的后端 API,前端和后端都用 Javascript 技術堆疊,并且是前后端一體化的(在同一個專案中開發前后端),另一個被大家所熟知的特性是它的服務端渲染能力,對 SEO 友好,

Vercel 自身是一個用戶體驗極佳的 Serverless 平臺,支持包括 Next.js 在內的幾十框開發框架一鍵部署到 Vercel 平臺,Vercel 平臺自身擁有極強的適配擴展能力,第三方框架可以按照 Vercel 平臺的適配規則自主進行適配,

作為 Vercel 親兒子的 Next.js 可以完美適配 Vercel 平臺,通過 Next.js + Vercel,讓開發和部署體驗都能擁有極致的體驗,Vercel 團隊信奉著 “吃自己的狗糧” 原則,Vercel 自身很多應用都是基于自己的工具和平臺開發的,

美中不足

Next.js + Vercel 看起來是如此的完美:通過 Vercel CLI 一鍵部署 Next.js 到 Vercel,另外,Next.js 也能很方便地運行在云主機上,但是 Vercel 作為國外的 Serverless 平臺,對于國內用戶,總是存在種種難以逾越的限制,如何將 Next.js 完美運行在國內的 Serverless 平臺變得尤為重要,

國內 Serverless 平臺官方在如何讓 Next.js 運行起來各顯神通,讓 Next.js 在 Serverless 平臺上運行不難,而要做到像 Vercel 一樣的極致部署運行體驗卻很有挑戰,

在嘗試將 Next.js 部署到國內 Serverless 平臺的時候,比如騰訊云函式、阿里云函式計算,可能會遇到如下一些坑:

運行適配困難

Next.js 的運行需要一個 HTTP Server,而事件函式提供的是一個簡單簽名函式,無法直接運行,需要將事件函式模擬成一個近似 HTTP Server 的代理服務;

代碼體積過大

一個最簡單的 Next.js 應用的代碼體積為 245 MB 左右,打包壓縮后是 54 MB 左右,而函式代碼體積限制一般是在 50 MB 以內(阿里云函式計算通過 OSS 方式上傳代碼可以超過 50 MB 的限制,但不能超過 100 MB),代碼體積過大往往帶來一系列副作用:

  • 代碼上傳時間長,且容易失敗,部署成本變大(通過 NFS 和 Layer 解決);

  • 依賴更多云服務,如使用物件存盤服務部署代碼包,又或者把體積大的 node_modules 目錄上傳到 NFS 服務上,然后掛載到函式上,總之,讓應用架構變復雜;

  • 冷啟動時間變長,函式在第一次運行的時候,需要先加載遠端的代碼,如果代碼包越大,則冷啟動時間越長;

不過,通過騰訊云的 Web 函式和阿里云函式計算的 Custom Runtime,可以解決第一個問題,因為它允許我們運行一個真正的 HTTP Server,而第二個問題要困難很多,雖然其中部分問題可以通過一定手段緩解,比如冷啟動,可以通過預置并發解決,但是又會讓運行成本變得難以接受,所以解決問題的根本還是在代碼體積上,

為什么 Next.js 專案代碼體積大

為了分析這個問題,我們需要先了解 Next.js 的架構,Next.js 是一種 React 的服務端渲染框架,集成度極高,框架自身集成了 Webpack、SWC、Babel、Express 等,使得開發者僅依賴 Next、React 和 React-dom 就可以方便地構建自己的 SSR React 應用,我們甚至可以不用關心路由,Next.js 的高度集成性,易于實作代碼分割、路由跳轉、熱更新、服務端渲染和前端渲染,

在 Next.js 專案中,不僅僅包含了運行時所需要的依賴,還包含了本地開發、構建所需要的開發時依賴,而且開發時依賴體積又大,而我們常見的解決方案是簡單粗暴打包所有的依賴,從而導致 Next.js 專案代碼偏大,

Vercel 官方如何打包部署 Next.js

Vercel 官方打包部署 Next.js 方案比較復雜,Vercel 平臺底層基礎設施是集成了 AWS Lambda,Next.js 本質是部署在 AWS Lambda 平臺上,為了能讓 Next.js 能在 Lambda 上運行,Vercel 官方提供了一個專門用于構建 Next.js 專案的構建器:@vercel/next,該構建器的邏輯大致是把 Next.js 中的每一個 API 和服務端渲染的頁面都分別構建輸出為一個函式,這一系列函式都歸屬與 Vercel 平臺上的一個應用,所以這樣就保證了每個函式的代碼體積足夠的小,

Next.js 打包部署到國內 Serverless 平臺最佳實踐

解決函式適配困難:我們可以通過 Web 函式或者 Custom Runtime 來解決,不推薦使用自定義鏡像方式,因為自定義鏡像冷啟動很嚴重,并在其中運行一個 HTTP Server,且簡單適配 Next.js,Next.js 官方有示例,

解決代碼包體積過大問題:剔除掉運行時不需要的可選依賴和開發依賴,剔除方式如下:

npm install --omit optional --omit dev
 # 或者
yarn install --ignore-optional --prod

說明:因為 swc 構建工具是通過可選依賴安裝的,在運行時不需要,所以我們需要把可選依賴也剔除,

通過以上方式構來的代碼體積由原來的 54 MB 減小到了 18 MB,另外,值得一提的是阿里云函式計算 Custom Runtime 內置的 Node.js 版本為 v10.16.2,而 Next.js 最新版本要求必須是 Node.js 12.22.0+,所有直接部署在函式計算的 Custom Runtime 上的 Next.js 應用無法運行,此時我們就需要自行將 Node.js 的二進制下載到我們自己的代碼中(也可以通過 Layer 實作),然后指定新的 PATH 環境變數,

如果每次部需要做上面的操作是不是很繁瑣,而且還需要自己寫適配入口代碼,以及 Web 函式和 Custom Runtime 所必須的 bootstrap 檔案,且該檔案必須擁有可執行權限,額外安裝新版 Node.js 運行時,其實,這些能力在 Cloud Studio 云開發平臺中已經內置提供了,一個原生的 Next.js 應用,使用 Cloud Studio 云開發平臺可以一鍵部署到騰訊云函式或者阿里函式計算,對業務代碼零侵入,零門檻,只需如下幾步:

1.登錄進入 Cloud Studio 的 Dashboard 頁面

2.選擇 Next.js 模板,并創建一個作業空間

3.切換到 Cloud Studio 云部署套件視圖

4.選擇騰訊云部署選項,并微信掃描登錄

5.點擊【開始部署】按鈕,一鍵部署 Next.js 應用

6.點擊【訪問】按鈕,即刻預覽部署后的效果

說明:同樣的 Next.js 應用,無需做任何修改,采用上述一樣的步驟,一鍵部署到阿里云函式計算,

Cloud Studio 是基于瀏覽器的集成式開發環境(IDE),為開發者提供了一個永不間斷的云端作業站,其包含代碼高亮、自動補全、Git 集成、終端等 IDE 的基礎功能,同時支持實時除錯、插件擴展等,可以幫助開發者快速完成各種應用的開發、編譯與部署作業,用戶在使用 Cloud Studio 時無需安裝,隨時隨地打開瀏覽器就能使用,

目前 Cloud Studio 支持部署到騰訊云函式和阿里云函式計算,并且支持 15+ 前后端框架的一鍵部署,

寫在最后

開始胡亂打包,到后面的精致打包,讓代碼體積變小,從而避免了一些列的坑,至于我們為什么不采用像 Vercel 那樣的極致方案,原因有三點:實作成本太高、對 Next.js API 深度依賴,維護成本高和構建成多個函式管理成本極大(我們不可能想 Vercel 一樣提供一個高階平臺),通過 Cloud Studio 云開發平臺,我們可以一鍵部署 Next.js 等流行框架,對框架零改造,

關于我們

更多關于云原生的案例和知識,可關注同名【騰訊云原生】公眾號~

福利:

①公眾號后臺回復【手冊】,可獲得《騰訊云原生路線圖手冊》&《騰訊云原生最佳實踐》~

②公眾號后臺回復【系列】,可獲得《15個系列100+篇超實用云原生原創干貨合集》,包含Kubernetes 降本增效、K8s 性能優化實踐、最佳實踐等系列,

③公眾號后臺回復【白皮書】,可獲得《騰訊云容器安全白皮書》&《降本之源-云原生成本管理白皮書v1.0》

④公眾號后臺回復【光速入門】,可獲得騰訊云專家5萬字精華教程,光速入門Prometheus和Grafana,

【騰訊云原生】云說新品、云研新術、云游新活、云賞資訊,掃碼關注同名公眾號,及時獲取更多干貨!!

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/472281.html

標籤:其他

上一篇:ERC20 ERC677 代幣標準

下一篇:耗時2天,我自制了一臺體感游戲機

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more