普通视图

发现新文章,点击刷新页面。
今天 — 2025年12月27日首页

Next.js第十七章(Script脚本)

作者 小满zs
2025年12月27日 06:01

Script组件

Next.js允许我们使用Script组件去加载js脚本(外部/本地脚本),并且他还对Script组件进行优化。

基本使用

局部引入

src/app/home/page.tsx

在home路由引入一个远程的js脚本,他只会在切换到home路由时才会加载,并且只会加载一次,然后纳入缓存。

import Script from 'next/script' //引入Script组件
export default function HomePage() {
    return (
        <div>
            <Script src="https://unpkg.com/vue@3/dist/vue.global.js" />
        </div>
    )
}

他的底层原理会把这个Script组件转换成<script>标签,然后插入到<head>标签中。

head.png

全局引入

src/app/layout.tsx

全局引入直接在app/layout.tsx中引入,他会自动在所有页面中引入,并且只会加载一次,然后纳入缓存。

import Script from 'next/script'
export default function RootLayout({ children }: { children: React.ReactNode }) {
    return (
        <html>
            <head>
                <Script src="https://unpkg.com/vue@3/dist/vue.global.js" />
            </head>
            <body>
                {children}
            </body>
        </html>
    )
}
加载策略

Next.js允许我们通过strategy属性来控制Script组件的加载策略。

  • beforeInteractive: 在代码和页面之前加载会阻塞页面渲染
  • afterInteractive(默认值): 在页面渲染到客户端之后加载。
  • lazyOnload: 在浏览器空闲时稍后加载脚本。
  • worker(实验性特性): 暂时不建议使用。
<Script id="VGUBHJMK1" strategy="beforeInteractive" src="https://unpkg.com/vue@3/dist/vue.global.js" />
<Script id="VGUBHJMK2" strategy="afterInteractive" src="https://unpkg.com/vue@3/dist/vue.global.js" />
<Script id="VGUBHJMK3" strategy="lazyOnload" src="https://unpkg.com/vue@3/dist/vue.global.js" />
<Script id="VGUBHJMK4" strategy="worker" src="https://unpkg.com/vue@3/dist/vue.global.js" />

webWorker模式 尚不稳定,谨慎使用,小提示可以给Script组件添加id,Next.js会追踪优化。

内联脚本

即使不从外部文件载入脚本,Next.js也支持我们通过{}直接在Script组件编写代码。

import Script from "next/script";
export default function RootLayout({
  children
}: Readonly<{
  children: React.ReactNode;
}>) {
  return (
    <html lang="en">
      <head>
        <Script id="VGUBHJMK5" strategy="beforeInteractive" src="https://unpkg.com/vue@3/dist/vue.global.js"></Script>
      </head>
      <body>
        {children}
        <div id="app"></div>
        <Script id="VGUBHJMK6"
         strategy="afterInteractive">
        {
           `
            const {createApp} = Vue
            createApp({
              template: '<h1>{{ message }}</h1>',
              setup() {
                return {
                  message: 'Next.js + Vue.js'
                }
              }
            }).mount('#app')
          `
        }
        </Script>
      </body>
    </html>
  );
}

第二种写法使用 dangerouslySetInnerHTML 属性来设置内联脚本。

<Script dangerouslySetInnerHTML={{__html: `
    const {createApp} = Vue
    createApp({
        template: '<h1>{{ message }}</h1>',
        setup() {
        return {
            message: 'Next.js + Vue.js'
        }
        }
    }).mount('#app')
    ` }} strategy="afterInteractive">
</Script>
事件监听
  • onload: 脚本加载完成时触发。
  • onReady: 脚本加载完成后,且组件每次挂载的时候都会触发。
  • onError: 脚本加载失败时触发。

Script组件只有在导入客户端的时候才会生效,所以需要使用'use client'声明这是一个客户端组件。

'use client'
 
import Script from 'next/script'
 
export default function Page() {
  return (
    <>
      <Script
        src="https://example.com/script.js"
        onLoad={() => {
          console.log('Script has loaded')
        }}
      />
    </>
  )
}

Next.js第十六章(font字体)

作者 小满zs
2025年12月27日 05:54

font字体

next/font模块,内置了字体优化功能,其目的是防止CLS布局偏移。font模块主要分为两部分,一部分是内置的Google Fonts字体,另一部分是本地字体。

基本用法

Goggle字体

在使用google字体的时候,Google字体和css文件会在构建的时候下载到本地,可以与静态资源一起托管到服务器,所以不会向Google发送请求。

  1. 基本使用
import { BBH_Sans_Hegarty } from 'next/font/google' //引入字体库
const bbhSansHegarty = BBH_Sans_Hegarty({
  weight: '400', //字体粗细
  display: 'swap', //字体显示方式
})
export default function RootLayout({ children }: Readonly<{ children: React.ReactNode }>) {
  return (
    <html lang="en">
      <body className={bbhSansHegarty.className}> {/** bbhSansHegarty会返回一个类名,用于加载字体 */}
        {children}
        sdsadasdjsalkdjasl
        你好
      </body>
    </html>
  );
}

google.png

  1. 可变字体

可变字体是一种可以适应不同字重和样式的字体,它可以在不同的设备上自动调整字体大小和样式,以适应不同的屏幕大小和分辨率。

import { Roboto } from 'next/font/google'
const roboto = Roboto({
  weight: ['400', '700'], //字体粗细 (不是所有字体都支持可变字体)
  style: ['normal', 'italic'], //字体样式   
  subsets: ['latin'],
  display: 'swap',
})

如何选择其他字体?可以参考Google Fonts

web.png

import { Inter,BBH_Sans_Bartle,Roboto_Slab,Rubik,Montserrat } from 'next/font/google' //引入其他字体库

API 参考

配置选项

属性 Google 本地 类型 必填 说明
src String/Array 字体文件路径
weight String/Array 可选 字体粗细,如 '400'
style String/Array - 字体样式,如 'normal'
subsets Array - 字符子集
axes Array - 可变字体轴
display String - 显示策略
preload Boolean - 是否预加载
fallback Array - 备用字体
adjustFontFallback Boolean/String - 调整备用字体
variable String - CSS 变量
declarations Array - 自定义声明
style

字体样式,如 'normal' 'italic(斜体)' 'oblique(倾斜)' 等。

weight

字体粗细,如 '400' '700' '900' 等。

display

auto:浏览器默认(通常为 block)

block:空白 3s → 备用字体 → 自定义字体

swap:备用字体 → 自定义字体

fallback:空白 100ms → 备用字体,3s 内加载完成则切换

optional:空白 100ms,100ms 内加载完成则使用,否则用备用字体

本地字体

字体下载地址:免费可商用字体

本地字体需要通过src属性指定字体文件路径,字体文件路径可以是单个文件,也可以是多个文件。

import localFont from 'next/font/local'
const local = localFont({
  src:'./font/zydtt.ttf', //本地字体文件路径
  display: 'swap', //字体显示方式
})
export default function RootLayout({ children }: Readonly<{ children: React.ReactNode }>) {
  return (
    <html lang="en">
      <body className={local.className}>
        {children}
        sdsadasdjsalkdjasl
        你好
      </body>
    </html>
  );
}

local.png

昨天以前首页
❌
❌