[英]NextJS: Loading Font from Database
我正在使用 NextJS 和 Tailwind CSS。
在我的應用程序中,用戶可以 select 包含不同配色方案的主題以及 fonts 的預選列表。他們可以為應用程序選擇他們喜歡的字體。
這些只是谷歌 Fonts。
我不確定根據從數據庫收到的字體名稱加載字體的最佳方法是什么。 我可以從serverSideProps
中的database
加載數據,但是如何在渲染之前加載字體,這樣就不會出現屏幕閃爍。 你能幫忙嗎?
更新
截至目前,我已經完成了以下工作:
在tailwind.config.js
中,我用可用的不同 fonts 擴展了主題。
主題:{ fontFamily: { inter: ['Inter', 'sans-serif'], cal: ["Cal Sans", "Inter", "sans-serif"], arima:['Arima Madurai','cursive' ], opensans:['Open Sans', 'sans-serif'], } }
我為每種字體創建了一個樣式表,它存儲在這個位置的公共文件夾中:
/字體/opensans/stylesheet.css
/字體/cal/stylesheet.css
/字體/inter/stylesheet.css
/fonts/arima/stylesheet.css
這些樣式表包含字體。 下面是一個例子:
@font-face {
font-family: "Cal Sans";
src: url("CalSans-SemiBold.woff2") format("woff2"),
url("CalSans-SemiBold.woff") format("woff");
font-weight: 600;
font-style: normal;
font-display: swap;
}
pages/index.js
),我使用serverSideProps
加載用戶的首選項並將其傳遞給Layout
組件。 這個布局組件的head
是通過next/head
創建的。 讓我們將從服務器接收到的字體屬性稱為themeFont
。 假設用戶的偏好是Cal Sans
,並且用戶的偏好作為值cal
存儲在數據庫中。 因此, themeFont
值將為cal
。
在頭部,我按如下方式加載相關樣式表:
<Head>
<link rel="stylesheet" href={`/fonts/${themeFont}/stylesheet.css`}></link>
</Head>
/fonts/cal/stylesheet.css
和所需的字體。 沒有加載其他字體。 然后我可以在帶有font-cal
的組件中使用它,因為它已在tailwind.config.css
中定義它工作正常。 我仍然看到閃爍,可能是因為font-display:swap
,也可能是其他原因。 但我仍然覺得這不是最佳解決方案,可以用更好的方式完成。
在這方面尋求幫助。
您的方向是正確的,您應該使用getServerSideProps
在<link>
標記中設置所需的字體。 但是你應該先添加rel="preload"
屬性來加載 fonts 然后你可以為你的 css 放置鏈接。
<link rel="preload" href="/fonts/theme-font.woff2" as="font" type="font/woff2" ></link>
元素的 rel 屬性的預加載值允許您在 HTML 中聲明獲取請求,指定您的頁面將很快需要的資源,您希望在頁面生命周期的早期開始加載,在瀏覽器的主要渲染機制啟動之前。
然后為避免閃爍使用font-display
屬性的fallback
值,它將隱藏文本約 100 毫秒,如果字體尚未下載,將使用回退文本。
@font-face {
font-family: "Cal Sans";
font-display: fallback;
src: url("CalSans-SemiBold.woff2") format("woff2"),
}
您可以將以下值用於不同策略的font-display
:
作為替代解決方案,您可以將 fonts 嵌入到 css styles 中:
@font-face {
font-family: "Cal Sans";
font-display: fallback;
src: url(PASTE-BASE64-HERE) format('woff2')
}
檢查此演示作為參考,您可以在那里將 woff2 文件轉換為 base64。
兩個想法:
https://fontsource.org/docs/getting-started
那么只要知道字體是什么,就應該可以動態導入對應的字體了。 我不知道字體會不會在這里閃爍。
await import `@fontsource/${fontName}`;
這假設您知道fontName
將是一個有效的 Google 字體名稱,或者您需要try
/ catch
它。
getServerSideProps
執行此操作,然后使用自定義<Head>
元素指向 fonts.googleapis.com 上相應的fonts.googleapis.com
文件並將其加載為在其他內容呈現之前<Head>
的一部分(或者至少在呈現過程中)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.