国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
但擴(kuò)展的成本是多少?
架構(gòu)TL;DR
更詳細(xì)的說(shuō)明
從數(shù)據(jù)庫(kù)生成頁(yè)面
在沒(méi)有服務(wù)器的情況下提交和存儲(chǔ)數(shù)據(jù)
樂(lè)觀URL 路由和無(wú)服務(wù)器後備方案
支持更大規(guī)模
首頁(yè) web前端 css教學(xué) 靜態(tài)第一:帶有無(wú)服務(wù)器渲染作為後備的預(yù)先生成的jamstack網(wǎng)站

靜態(tài)第一:帶有無(wú)服務(wù)器渲染作為後備的預(yù)先生成的jamstack網(wǎng)站

Apr 16, 2025 am 11:06 AM

Static First: Pre-Generated JAMstack Sites with Serverless Rendering as a Fallback

JAMstack 架構(gòu)正日益受到關(guān)注,它提供了一種高效的網(wǎng)站構(gòu)建方法。

JAMstack 的核心原則之一是預(yù)渲染。這意味著提前將網(wǎng)站生成一系列靜態(tài)資源,以便能夠以最快的速度、最低的開(kāi)銷(xiāo)從CDN 或其他優(yōu)化的靜態(tài)託管環(huán)境中為訪問(wèn)者提供服務(wù)。

但是,如果我們要提前預(yù)生成網(wǎng)站,如何讓它們看起來(lái)更動(dòng)態(tài)呢?如何構(gòu)建需要頻繁更改的網(wǎng)站?如何處理用戶生成的內(nèi)容?

實(shí)際上,這正是無(wú)服務(wù)器函數(shù)的理想應(yīng)用場(chǎng)景。 JAMstack 和無(wú)服務(wù)器是最佳拍檔,它們完美地互補(bǔ)。

本文將探討一種模式:在幾乎完全由用戶生成內(nèi)容組成的網(wǎng)站中,使用無(wú)服務(wù)器函數(shù)作為預(yù)生成頁(yè)面的後備方案。我們將採(cǎi)用一種樂(lè)觀URL 路由技術(shù),其中404 頁(yè)面是一個(gè)無(wú)服務(wù)器函數(shù),以便動(dòng)態(tài)添加無(wú)服務(wù)器渲染。

聽(tīng)起來(lái)很複雜?也許吧。但它有效嗎?絕對(duì)有效!

您可以試用演示網(wǎng)站來(lái)了解這個(gè)用例。但是,請(qǐng)您看完本文後再試用。

您回來(lái)了?太好了,讓我們深入探討。

這個(gè)示例網(wǎng)站的理念是:讓您創(chuàng)建一條溫馨的留言和虛擬鼓勵(lì)信息發(fā)送給朋友。您可以撰寫(xiě)留言,自定義棒棒糖(或冰棒,為我的美國(guó)朋友們準(zhǔn)備的)並獲得一個(gè)URL 與您的收件人分享。就這樣,您就照亮了他們的一天。還有什麼比這更好的呢?

傳統(tǒng)上,我們會(huì)使用一些服務(wù)器端腳本處理表單提交,將新的棒棒糖(我們的用戶生成內(nèi)容)添加到數(shù)據(jù)庫(kù)中並生成唯一的URL。然後,我們會(huì)使用更多服務(wù)器端邏輯來(lái)解析對(duì)這些頁(yè)面的請(qǐng)求,查詢數(shù)據(jù)庫(kù)以獲取填充頁(yè)面視圖所需的數(shù)據(jù),使用合適的模板進(jìn)行渲染,並將其返回給用戶。

這看起來(lái)合情合理。

但擴(kuò)展的成本是多少?

技術(shù)架構(gòu)師和技術(shù)主管在評(píng)估項(xiàng)目範(fàn)圍時(shí)經(jīng)常會(huì)遇到這個(gè)問(wèn)題。他們需要規(guī)劃、支付和配置足夠的資源以應(yīng)對(duì)成功的情況。

這個(gè)虛擬棒棒糖網(wǎng)站並非普通的裝飾品。由於我們都想互相發(fā)送積極的信息,這個(gè)網(wǎng)站將讓我成為億萬(wàn)富翁!隨著消息的傳播,流量水平將會(huì)飆升。我最好有一個(gè)好的策略來(lái)確保服務(wù)器能夠處理繁重的負(fù)載。我可能會(huì)添加一些緩存層、一些負(fù)載均衡器,並且我會(huì)設(shè)計(jì)我的數(shù)據(jù)庫(kù)和數(shù)據(jù)庫(kù)服務(wù)器,以便能夠分擔(dān)負(fù)載,而不會(huì)因?yàn)閯?chuàng)建和提供所有這些棒棒糖的需求而不堪重負(fù)。

但是……我不知道如何做這些事情。

而且我不知道添加這些基礎(chǔ)設(shè)施並保持其正常運(yùn)行的成本是多少。這很複雜。

這就是我喜歡通過(guò)預(yù)渲染盡可能簡(jiǎn)化我的託管的原因。

提供靜態(tài)頁(yè)面比從需要執(zhí)行一些邏輯以按需為每個(gè)訪問(wèn)者生成視圖的Web 服務(wù)器動(dòng)態(tài)提供頁(yè)面要簡(jiǎn)單得多且成本更低。

由於我們正在處理大量用戶生成的內(nèi)容,使用數(shù)據(jù)庫(kù)仍然是有意義的,但我不會(huì)自己管理它。相反,我將選擇許多可用作服務(wù)的數(shù)據(jù)庫(kù)選項(xiàng)之一。我將通過(guò)其API 與它進(jìn)行交互。

我可能會(huì)選擇Firebase、MongoDB 或其他任何數(shù)量的數(shù)據(jù)庫(kù)。 Chris 在一個(gè)關(guān)於無(wú)服務(wù)器資源的優(yōu)秀網(wǎng)站上編譯了一些這樣的資源,非常值得探索。

在本例中,我選擇Fauna 作為我的數(shù)據(jù)存儲(chǔ)。 Fauna 提供了一個(gè)很好的API 用於存儲(chǔ)和查詢數(shù)據(jù)。它是一個(gè)非SQL 風(fēng)格的數(shù)據(jù)存儲(chǔ),它正是我所需要的。

至關(guān)重要的是,F(xiàn)auna 已將提供數(shù)據(jù)庫(kù)服務(wù)作為一項(xiàng)完整的業(yè)務(wù)。他們擁有我永遠(yuǎn)不會(huì)擁有的深厚領(lǐng)域知識(shí)。通過(guò)使用像這樣的數(shù)據(jù)庫(kù)即服務(wù)提供商,我為我的項(xiàng)目繼承了一個(gè)專家數(shù)據(jù)服務(wù)團(tuán)隊(duì),包括高可用性基礎(chǔ)設(shè)施、容量和合規(guī)性安心、熟練的支持工程師和豐富的文檔。

與其自己動(dòng)手,不如使用這樣的第三方服務(wù),這就是它的優(yōu)勢(shì)所在。

架構(gòu)TL;DR

在處理概念驗(yàn)證時(shí),我經(jīng)常發(fā)現(xiàn)自己會(huì)塗鴉一些邏輯流程。這是我為這個(gè)網(wǎng)站做的塗鴉:

以及一些解釋:

  1. 用戶通過(guò)填寫(xiě)普通的HTML 表單創(chuàng)建一個(gè)新的棒棒糖。
  2. 新內(nèi)容保存在數(shù)據(jù)庫(kù)中,並且它的提交會(huì)觸發(fā)新的站點(diǎn)生成和部署。
  3. 站點(diǎn)部署完成後,新的棒棒糖將可通過(guò)唯一的URL 訪問(wèn)。它將是一個(gè)靜態(tài)頁(yè)面,從CDN 快速提供服務(wù),不依賴於數(shù)據(jù)庫(kù)查詢或服務(wù)器。
  4. 在站點(diǎn)生成完成之前,任何新的棒棒糖都將無(wú)法作為靜態(tài)頁(yè)面訪問(wèn)。對(duì)棒棒糖頁(yè)面的不成功請(qǐng)求將回退到一個(gè)頁(yè)面,該頁(yè)面通過(guò)動(dòng)態(tài)查詢數(shù)據(jù)庫(kù)API 來(lái)動(dòng)態(tài)生成棒棒糖頁(yè)面。

這種方法首先假設(shè)靜態(tài)/預(yù)生成的資源,然後在靜態(tài)視圖不可用時(shí)才回退到動(dòng)態(tài)渲染,正如聯(lián)合利華的Markus Schork 所描述的那樣,這被稱為“靜態(tài)優(yōu)先”,我很喜歡這個(gè)說(shuō)法。

更詳細(xì)的說(shuō)明

您可以直接深入研究該網(wǎng)站的代碼(它是開(kāi)源的,您可以隨意探索),或者我們可以進(jìn)一步討論。

您想更深入地挖掘並探索此示例的實(shí)現(xiàn)?好的,我將更詳細(xì)地解釋:

  • 從數(shù)據(jù)庫(kù)獲取數(shù)據(jù)以生成每個(gè)頁(yè)面
  • 使用無(wú)服務(wù)器函數(shù)將數(shù)據(jù)發(fā)佈到數(shù)據(jù)庫(kù)API
  • 觸發(fā)完整的站點(diǎn)重新生成
  • 在尚未生成頁(yè)面時(shí)按需渲染

從數(shù)據(jù)庫(kù)生成頁(yè)面

稍後,我們將討論如何將數(shù)據(jù)發(fā)佈到數(shù)據(jù)庫(kù),但首先,讓我們假設(shè)數(shù)據(jù)庫(kù)中已經(jīng)有一些條目。我們將要生成一個(gè)包含每個(gè)條目的頁(yè)面的網(wǎng)站。

靜態(tài)網(wǎng)站生成器非常擅長(zhǎng)這一點(diǎn)。它們會(huì)處理數(shù)據(jù),將其應(yīng)用於模板,並輸出準(zhǔn)備提供服務(wù)的HTML 文件。我們可以為此示例使用任何生成器。我選擇Eleventy 是因?yàn)樗鄬?duì)簡(jiǎn)單且站點(diǎn)生成速度快。

為了向Eleventy 提供一些數(shù)據(jù),我們有很多選擇。一種方法是提供一些返回結(jié)構(gòu)化數(shù)據(jù)的JavaScript。這非常適合查詢數(shù)據(jù)庫(kù)API。

我們的Eleventy 數(shù)據(jù)文件將如下所示:

 <code>// 設(shè)置與Fauna 數(shù)據(jù)庫(kù)的連接。 // 使用環(huán)境變量進(jìn)行身份驗(yàn)證// 并訪問(wèn)數(shù)據(jù)庫(kù)。 const faunadb = require('faunadb'); const q = faunadb.query; const client = new faunadb.Client({ secret: process.env.FAUNADB_SERVER_SECRET }); module.exports = () => { return new Promise((resolve, reject) => { // 獲取最新的100,000 個(gè)條目(為了我們的示例) client.query( q.Paginate(q.Match(q.Ref("indexes/all_lollies")),{size:100000}) ).then((response) => { // 獲取每個(gè)條目的所有數(shù)據(jù)const lollies = response.data; const getAllDataQuery = lollies.map((ref) => { return q.Get(ref); }); return client.query(getAllDataQuery).then((ret) => { // 將數(shù)據(jù)發(fā)送回Eleventy 以用于站點(diǎn)構(gòu)建resolve(ret); }); }).catch((error) => { console.log("error", error); reject(error); }); }) }</code>

我將此文件命名為lollies.js,它將使其返回的所有數(shù)據(jù)在名為lollies 的集合中可用於Eleventy。

我們現(xiàn)在可以在我們的模板中使用該數(shù)據(jù)。如果您想查看獲取該數(shù)據(jù)並為每個(gè)項(xiàng)目生成頁(yè)面的代碼,您可以在代碼存儲(chǔ)庫(kù)中查看。

在沒(méi)有服務(wù)器的情況下提交和存儲(chǔ)數(shù)據(jù)

當(dāng)我們創(chuàng)建一個(gè)新的棒棒糖頁(yè)面時(shí),我們需要將用戶內(nèi)容捕獲到數(shù)據(jù)庫(kù)中,以便將來(lái)可以將其用於填充給定URL 的頁(yè)面。為此,我們使用傳統(tǒng)的HTML 表單將數(shù)據(jù)發(fā)佈到合適的表單處理程序。

表單看起來(lái)像這樣(或在存儲(chǔ)庫(kù)中查看完整代碼):

<code></code>

在我們的託管方案中沒(méi)有Web 服務(wù)器,因此我們需要設(shè)計(jì)一個(gè)地方來(lái)處理從此表單提交的HTTP 發(fā)布請(qǐng)求。這是無(wú)服務(wù)器函數(shù)的完美用例。我正在為此使用Netlify Functions。如果您願(yuàn)意,可以使用AWS Lambda、Google Cloud 或Azure Functions,但我喜歡Netlify Functions 工作流程的簡(jiǎn)單性,以及它將我的無(wú)服務(wù)器API 和我的UI 保留在同一個(gè)代碼存儲(chǔ)庫(kù)中的事實(shí)。

避免將後端實(shí)現(xiàn)細(xì)節(jié)洩露到前端是一個(gè)好習(xí)慣。清晰的分離有助於使事情更易於移植和整潔。查看上面表單元素的action 屬性。它將數(shù)據(jù)發(fā)佈到我網(wǎng)站上名為/new 的路徑,這並沒(méi)有真正暗示它將與哪個(gè)服務(wù)進(jìn)行通信。

我們可以使用重定向?qū)⑺酚傻轿覀兿矚g的任何服務(wù)。我將它發(fā)送到我將在此項(xiàng)目中配置的無(wú)服務(wù)器函數(shù),但如果我們願(yuàn)意,可以輕鬆地將其自定義為將數(shù)據(jù)發(fā)送到其他地方。 Netlify 為我們提供了一個(gè)簡(jiǎn)單且高度優(yōu)化的重定向引擎,該引擎在CDN 級(jí)別引導(dǎo)我們的流量,因此用戶可以非??焖俚芈酚傻秸_的位置。

下面的重定向規(guī)則(位於我的項(xiàng)目的netlify.toml 文件中)將/new 的請(qǐng)求代理到由Netlify Functions 託管的名為newLolly.js 的無(wú)服務(wù)器函數(shù)。

 <code># 將“new”URL 解析為函數(shù)[[redirects]] from = "/new" to = "/.netlify/functions/newLolly" status = 200</code>

讓我們看看那個(gè)無(wú)服務(wù)器函數(shù):

  • 將新數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)庫(kù)中,
  • 為新頁(yè)面創(chuàng)建一個(gè)新的URL,並
  • 將用戶重定向到新創(chuàng)建的頁(yè)面,以便他們可以看到結(jié)果。

首先,我們將需要各種實(shí)用程序來(lái)解析表單數(shù)據(jù)、連接到Fauna 數(shù)據(jù)庫(kù)並為新的棒棒糖創(chuàng)建易於閱讀的短唯一ID。

 <code>const faunadb = require('faunadb'); // 用于訪問(wèn)FaunaDB const shortid = require('shortid'); // 生成短唯一URL const querystring = require('querystring'); // 幫助我們解析表單數(shù)據(jù)// 首先,我們使用我們的數(shù)據(jù)庫(kù)設(shè)置一個(gè)新的連接。 // 環(huán)境變量幫助我們安全地連接// 到正確的數(shù)據(jù)庫(kù)。 const q = faunadb.query const client = new faunadb.Client({ secret: process.env.FAUNADB_SERVER_SECRET })</code>

現(xiàn)在,我們將向處理對(duì)無(wú)服務(wù)器函數(shù)的請(qǐng)求添加一些代碼。處理程序函數(shù)將解析請(qǐng)求以從表單提交中獲取所需的數(shù)據(jù),然後為新的棒棒糖生成一個(gè)唯一的ID,然後將其作為新記錄創(chuàng)建到數(shù)據(jù)庫(kù)中。

 <code>// 處理對(duì)無(wú)服務(wù)器函數(shù)的請(qǐng)求exports.handler = (event, context, callback) => { // 獲取表單數(shù)據(jù)const data = querystring.parse(event.body); // 添加一個(gè)唯一的路徑ID。并記下它- 我們稍后會(huì)將用戶發(fā)送到它c(diǎn)onst uniquePath = shortid.generate(); data.lollyPath = uniquePath; // 組裝準(zhǔn)備發(fā)送到數(shù)據(jù)庫(kù)的數(shù)據(jù)const lolly = { data: data }; // 在fauna db 中創(chuàng)建棒棒糖條目client.query(q.Create(q.Ref('classes/lollies'), lolly)) .then((response) => { // 成功!將用戶重定向到此新棒棒糖頁(yè)面的唯一URL return callback(null, { statusCode: 302, headers: { Location: `/lolly/${uniquePath}`, } }); }).catch((error) => { console.log('error', error); // 錯(cuò)誤!返回帶有statusCode 400 的錯(cuò)誤return callback(null, { statusCode: 400, body: JSON.stringify(error) }); }); }</code>

讓我們檢查一下我們的進(jìn)度。我們有辦法在數(shù)據(jù)庫(kù)中創(chuàng)建新的棒棒糖頁(yè)面。我們還有一個(gè)自動(dòng)構(gòu)建,它會(huì)為我們的每個(gè)棒棒糖生成一個(gè)頁(yè)面。

為了確保為每個(gè)棒棒糖都有一套完整的預(yù)生成頁(yè)面,我們應(yīng)該在每次成功將新條目添加到數(shù)據(jù)庫(kù)時(shí)觸發(fā)重建。這非常容易做到。由於我們的靜態(tài)網(wǎng)站生成器,我們的構(gòu)建已經(jīng)自動(dòng)化了。我們只需要一種觸發(fā)它的方法。使用Netlify,我們可以定義任意數(shù)量的構(gòu)建鉤子。它們是Webhook,如果它們收到HTTP POST 請(qǐng)求,它們將重建和部署我們的站點(diǎn)。這是我在Netlify 的站點(diǎn)管理控制臺(tái)中創(chuàng)建的一個(gè):

為了重新生成站點(diǎn),包括數(shù)據(jù)庫(kù)中記錄的每個(gè)棒棒糖的頁(yè)面,我們可以在將新數(shù)據(jù)保存到數(shù)據(jù)庫(kù)後立即向此構(gòu)建鉤子發(fā)出HTTP POST 請(qǐng)求。

這是執(zhí)行此操作的代碼:

 <code>const axios = require('axios'); // 簡(jiǎn)化發(fā)出HTTP POST 請(qǐng)求// 觸發(fā)新的構(gòu)建以永久凍結(jié)此棒棒糖axios.post('https://api.netlify.com/build_hooks/5d46fa20da4a1b70XXXXXXXXX') .then(function (response) { // 在無(wú)服務(wù)器函數(shù)的日志中報(bào)告console.log(response); }) .catch(function (error) { // 描述無(wú)服務(wù)器函數(shù)日志中的任何錯(cuò)誤console.log(error); });</code>

您可以在完整的代碼中看到它,它已添加到數(shù)據(jù)庫(kù)插入的成功處理程序中。

如果我們?cè)谂c收件人分享新棒棒糖的URL 之前,願(yuàn)意等待構(gòu)建和部署完成,那麼這一切都很好。但是我們並不耐心,當(dāng)我們獲得剛剛創(chuàng)建的棒棒糖的新URL 時(shí),我們會(huì)立即想要分享它。

遺憾的是,如果我們?cè)谡军c(diǎn)完成重新生成以包含新頁(yè)面之前訪問(wèn)該URL,我們將得到404。但令人高興的是,我們可以利用這個(gè)404。

樂(lè)觀URL 路由和無(wú)服務(wù)器後備方案

使用自定義404 路由,我們可以選擇將每個(gè)對(duì)棒棒糖頁(yè)面的失敗請(qǐng)求發(fā)送到一個(gè)頁(yè)面,該頁(yè)面可以直接在數(shù)據(jù)庫(kù)中查找棒棒糖數(shù)據(jù)。如果我們願(yuàn)意,我們可以在客戶端JavaScript 中執(zhí)行此操作,但更好的方法是從無(wú)服務(wù)器函數(shù)動(dòng)態(tài)生成一個(gè)準(zhǔn)備查看的頁(yè)面。

方法如下:

首先,我們需要告訴所有希望訪問(wèn)棒棒糖頁(yè)面的請(qǐng)求(這些請(qǐng)求返回為空)改為轉(zhuǎn)到我們的無(wú)服務(wù)器函數(shù)。我們通過(guò)在Netlify 重定向配置中添加另一個(gè)規(guī)則來(lái)實(shí)現(xiàn):

 <code># 未找到的棒棒糖應(yīng)該直接代理到API [[redirects]] from = "/lolly/*" to = "/.netlify/functions/showLolly?id=:splat" status = 302</code>

只有在對(duì)棒棒糖頁(yè)面的請(qǐng)求沒(méi)有找到準(zhǔn)備提供服務(wù)的靜態(tài)頁(yè)面時(shí),才會(huì)應(yīng)用此規(guī)則。它會(huì)創(chuàng)建一個(gè)臨時(shí)重定向(HTTP 302) 到我們的無(wú)服務(wù)器函數(shù),該函數(shù)看起來(lái)像這樣:

 <code>const faunadb = require('faunadb'); // 用于訪問(wèn)FaunaDB const pageTemplate = require('./lollyTemplate.js'); // JS 模板文字// 設(shè)置和授權(quán)Fauna DB 客戶端const q = faunadb.query; const client = new faunadb.Client({ secret: process.env.FAUNADB_SERVER_SECRET }); exports.handler = (event, context, callback) => { // 從請(qǐng)求中獲取棒棒糖ID const path = event.queryStringParameters.id.replace("/", ""); // 在DB 中查找棒棒糖數(shù)據(jù)client.query( q.Get(q.Match(q.Index("lolly_by_path"), path)) ).then((response) => { // 如果找到,則返回視圖return callback(null, { statusCode: 200, body: pageTemplate(response.data) }); }).catch((error) => { // 未找到或發(fā)生錯(cuò)誤,將悲傷的用戶發(fā)送到通用錯(cuò)誤頁(yè)面console.log('Error:', error); return callback(null, { body: JSON.stringify(error), statusCode: 301, headers: { Location: `/melted/index.html`, } }); }); }</code>

如果對(duì)任何其他頁(yè)面(不在站點(diǎn)的/lolly/ 路徑內(nèi))的請(qǐng)求返回404,我們不會(huì)將該請(qǐng)求發(fā)送到我們的無(wú)服務(wù)器函數(shù)以檢查棒棒糖。我們可以直接將用戶發(fā)送到404 頁(yè)面。我們的netlify.toml 配置允許我們通過(guò)在文件中添加更多回退規(guī)則來(lái)定義任意數(shù)量的404 路由級(jí)別。文件中第一個(gè)成功的匹配將被採(cǎi)用。

 <code># 未找到的棒棒糖應(yīng)該直接代理到API [[redirects]] from = "/lolly/*" to = "/.netlify/functions/showLolly?id=:splat" status = 302 # 真正的404 可以直接轉(zhuǎn)到這里: [[redirects]] from = "/*" to = "/melted/index.html" status = 404</code>

我們完成了!我們現(xiàn)在擁有一個(gè)“靜態(tài)優(yōu)先”的站點(diǎn),如果尚未將URL 生成靜態(tài)文件,它將嘗試使用無(wú)服務(wù)器函數(shù)動(dòng)態(tài)渲染內(nèi)容。

非??焖?!

支持更大規(guī)模

每次創(chuàng)建新條目時(shí)都觸發(fā)構(gòu)建以重新生成棒棒糖頁(yè)面的技術(shù)可能並非永遠(yuǎn)都是最佳的。雖然構(gòu)建的自動(dòng)化意味著重新部署站點(diǎn)非常簡(jiǎn)單,但當(dāng)我們開(kāi)始變得非常受歡迎時(shí),我們可能希望開(kāi)始限制和優(yōu)化事情。 (這只是時(shí)間問(wèn)題,對(duì)吧?)

沒(méi)關(guān)係。當(dāng)我們要?jiǎng)?chuàng)建非常多的頁(yè)面並且數(shù)據(jù)庫(kù)中更頻繁地添加內(nèi)容時(shí),以下是一些需要考慮的事情:

  • 我們可以不為每個(gè)新條目觸發(fā)重建,而是可以將站點(diǎn)重建為計(jì)劃作業(yè)。也許這可以每小時(shí)或每天發(fā)生一次。
  • 如果每天構(gòu)建一次,我們可能決定只為過(guò)去一天提交的新棒棒糖生成頁(yè)面,並將每天生成的頁(yè)面緩存以供將來(lái)使用。構(gòu)建中的這種邏輯將幫助我們支持大量棒棒糖頁(yè)面,而不會(huì)使構(gòu)建時(shí)間過(guò)長(zhǎng)。但我不會(huì)在這裡討論構(gòu)建內(nèi)緩存。如果您好奇,您可以在Netlify 社區(qū)論壇中詢問(wèn)。

通過(guò)將靜態(tài)預(yù)生成資源與提供動(dòng)態(tài)渲染的無(wú)服務(wù)器後備方案相結(jié)合,我們可以滿足令人驚訝的廣泛用例——同時(shí)避免需要配置和維護(hù)大量動(dòng)態(tài)基礎(chǔ)設(shè)施。

您還可以使用這種“靜態(tài)優(yōu)先”方法滿足哪些其他用例?

以上是靜態(tài)第一:帶有無(wú)服務(wù)器渲染作為後備的預(yù)先生成的jamstack網(wǎng)站的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請(qǐng)聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開(kāi)發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)

熱門(mén)話題

什麼是'渲染障礙CSS”? 什麼是'渲染障礙CSS”? Jun 24, 2025 am 12:42 AM

CSS會(huì)阻塞頁(yè)面渲染是因?yàn)闉g覽器默認(rèn)將內(nèi)聯(lián)和外部CSS視為關(guān)鍵資源,尤其是使用引入的樣式表、頭部大量?jī)?nèi)聯(lián)CSS以及未優(yōu)化的媒體查詢樣式。 1.提取關(guān)鍵CSS並內(nèi)嵌至HTML;2.延遲加載非關(guān)鍵CSS通過(guò)JavaScript;3.使用media屬性優(yōu)化加載如打印樣式;4.壓縮合併CSS減少請(qǐng)求。建議使用工具提取關(guān)鍵CSS,結(jié)合rel="preload"異步加載,合理使用media延遲加載,避免過(guò)度拆分與復(fù)雜腳本控制。

什麼是AutoPrefixer,它如何工作? 什麼是AutoPrefixer,它如何工作? Jul 02, 2025 am 01:15 AM

Autoprefixer是一個(gè)根據(jù)目標(biāo)瀏覽器範(fàn)圍自動(dòng)為CSS屬性添加廠商前綴的工具。 1.它解決了手動(dòng)維護(hù)前綴易出錯(cuò)的問(wèn)題;2.通過(guò)PostCSS插件形式工作,解析CSS、分析需加前綴的屬性、依配置生成代碼;3.使用步驟包括安裝插件、設(shè)置browserslist、在構(gòu)建流程中啟用;4.注意事項(xiàng)有不手動(dòng)加前綴、保持配置更新、非所有屬性都加前綴、建議配合預(yù)處理器使用。

什麼是圓錐級(jí)函數(shù)? 什麼是圓錐級(jí)函數(shù)? Jul 01, 2025 am 01:16 AM

theconic-Gradient()functionIncsscreatesCircularGradientsThatRotateColorStopSaroundAcentralPoint.1.IsidealForPieCharts,ProgressIndicators,colordichers,colorwheels和decorativeBackgrounds.2.itworksbysbysbysbydefindefingincolordefingincolorstopsatspecificains off.

CSS教程,用於創(chuàng)建粘性標(biāo)頭或頁(yè)腳 CSS教程,用於創(chuàng)建粘性標(biāo)頭或頁(yè)腳 Jul 02, 2025 am 01:04 AM

TocreatestickyheadersandfooterswithCSS,useposition:stickyforheaderswithtopvalueandz-index,ensuringparentcontainersdon’trestrictit.1.Forstickyheaders:setposition:sticky,top:0,z-index,andbackgroundcolor.2.Forstickyfooters,betteruseposition:fixedwithbot

CSS自定義屬性的範(fàn)圍是什麼? CSS自定義屬性的範(fàn)圍是什麼? Jun 25, 2025 am 12:16 AM

CSS自定義屬性的作用域取決於其聲明的上下文,全局變量通常定義在:root中,而局部變量則定義在特定選擇器內(nèi),以便組件化和隔離樣式。例如,定義在.card類(lèi)中的變量?jī)H對(duì)匹配該類(lèi)的元素及其子元素可用。最佳實(shí)踐包括:1.使用:root定義全局變量如主題色;2.在組件內(nèi)部定義局部變量以實(shí)現(xiàn)封裝;3.避免重複聲明同一變量;4.注意選擇器特異性可能引發(fā)的覆蓋問(wèn)題。此外,CSS變量區(qū)分大小寫(xiě),且應(yīng)在使用前定義以避免錯(cuò)誤。若變量未定義或引用失敗,則會(huì)採(cǎi)用回退值或默認(rèn)值initial。調(diào)試時(shí)可通過(guò)瀏覽器開(kāi)發(fā)者工

CSS教程專注於移動(dòng)優(yōu)先設(shè)計(jì) CSS教程專注於移動(dòng)優(yōu)先設(shè)計(jì) Jul 02, 2025 am 12:52 AM

Mobile-firstCSSdesignrequiressettingtheviewportmetatag,usingrelativeunits,stylingfromsmallscreensup,optimizingtypographyandtouchtargets.First,addtocontrolscaling.Second,use%,em,orreminsteadofpixelsforflexiblelayouts.Third,writebasestylesformobile,the

CSS教程,用於創(chuàng)建加載旋轉(zhuǎn)器和動(dòng)畫(huà) CSS教程,用於創(chuàng)建加載旋轉(zhuǎn)器和動(dòng)畫(huà) Jul 07, 2025 am 12:07 AM

創(chuàng)建CSS加載旋轉(zhuǎn)器的方法有三種:1.使用邊框的基本旋轉(zhuǎn)器,通過(guò)HTML和CSS實(shí)現(xiàn)簡(jiǎn)單動(dòng)畫(huà);2.使用多個(gè)點(diǎn)的自定義旋轉(zhuǎn)器,通過(guò)不同延遲時(shí)間實(shí)現(xiàn)跳動(dòng)效果;3.在按鈕中添加旋轉(zhuǎn)器,通過(guò)JavaScript切換類(lèi)來(lái)顯示加載狀態(tài)。每種方法都強(qiáng)調(diào)了設(shè)計(jì)細(xì)節(jié)如顏色、大小、可訪問(wèn)性和性能優(yōu)化的重要性,以提升用戶體驗(yàn)。

如何創(chuàng)建本質(zhì)上響應(yīng)的網(wǎng)格佈局? 如何創(chuàng)建本質(zhì)上響應(yīng)的網(wǎng)格佈局? Jul 02, 2025 am 01:19 AM

要?jiǎng)?chuàng)建內(nèi)在響應(yīng)式網(wǎng)格佈局,核心方法是使用CSSGrid的repeat(auto-fit,minmax())模式;1.設(shè)置grid-template-columns:repeat(auto-fit,minmax(200px,1fr))讓瀏覽器自動(dòng)調(diào)整列數(shù)並限制每列最小和最大寬度;2.使用gap控制格子間距;3.容器應(yīng)設(shè)為相對(duì)單位如width:100%、配合box-sizing:border-box避免寬度計(jì)算錯(cuò)誤並用margin:auto居中;4.可選設(shè)置行高與內(nèi)容對(duì)齊方式提升視覺(jué)一致性,如row

See all articles