自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

分享七個(gè)你可能不知道的 Next.js 14 小技巧

開(kāi)發(fā) 前端
隨著NextJS 14的發(fā)布,我們見(jiàn)證了前端開(kāi)發(fā)領(lǐng)域的一次重大變革。這個(gè)版本不僅加強(qiáng)了對(duì)開(kāi)發(fā)者體驗(yàn)的關(guān)注,還通過(guò)諸如路由分組、動(dòng)態(tài)元數(shù)據(jù)、私有路由、可選的捕獲所有段以及活動(dòng)鏈接等功能,大幅提升了應(yīng)用的性能和可用性。

NextJS 14的發(fā)布不僅僅是一個(gè)簡(jiǎn)單的更新,它代表了對(duì)開(kāi)發(fā)者體驗(yàn)和應(yīng)用速度的全新關(guān)注。對(duì)于使用React的開(kāi)發(fā)者來(lái)說(shuō),NextJS 14承諾帶來(lái)更快速、更愉快的開(kāi)發(fā)體驗(yàn)。無(wú)論是新項(xiàng)目的開(kāi)始,還是現(xiàn)有項(xiàng)目的升級(jí),NextJS 14都值得一試。

今天,我將向大家介紹一些關(guān)于NextJS的概念,這些可能是許多開(kāi)發(fā)者所不知道的。你可以利用這些概念來(lái)優(yōu)化你的應(yīng)用,并改善開(kāi)發(fā)者體驗(yàn)。

1. 路由分組:整理雜亂的文件結(jié)構(gòu)(Route Groups)

在開(kāi)發(fā)大型Web應(yīng)用時(shí),文件夾結(jié)構(gòu)可能會(huì)變得復(fù)雜混亂,特別是在處理路由時(shí)。NextJS提供了一種稱為路由分組的功能,可以幫助你更有效地組織路由結(jié)構(gòu)。

混亂的文件結(jié)構(gòu):

在沒(méi)有使用路由分組的情況下,你可能會(huì)在pages文件夾中看到許多雜亂無(wú)章的路由文件,這使得找到特定路由變得困難。

使用路由分組整理:

通過(guò)使用路由分組,你可以將相關(guān)的路由放在同一個(gè)文件夾(即路由組文件夾)下。這樣,你就可以根據(jù)不同主題或功能輕松地找到相關(guān)路由。

例如,你可以創(chuàng)建一個(gè)名為auth的路由組文件夾,然后將所有與認(rèn)證相關(guān)的路由(如登錄、注冊(cè))放在這個(gè)文件夾下。

路由分組的優(yōu)勢(shì):

  • 清晰的文件結(jié)構(gòu):通過(guò)路由分組,你的項(xiàng)目結(jié)構(gòu)將更加清晰有序。
  • 易于維護(hù):分組后的結(jié)構(gòu)使得維護(hù)特定功能或模塊的路由更加容易。
  • 不影響URL結(jié)構(gòu):值得注意的是,路由分組不會(huì)在URL中添加文件夾名稱。例如,即使有一個(gè)名為auth的分組文件夾,URL仍然是http://localhost:3000/sign-in,而不是http://localhost:3000/auth/sign-in。

2. 靜態(tài)元數(shù)據(jù)(Static Metadata)

Next.js提供了一個(gè)元數(shù)據(jù)API,允許開(kāi)發(fā)者定義應(yīng)用程序的元數(shù)據(jù)(例如,在HTML的head元素中的meta和link標(biāo)簽),這對(duì)于提升搜索引擎優(yōu)化(SEO)和網(wǎng)頁(yè)分享性非常有幫助。

元數(shù)據(jù)API的使用

你可以在頁(yè)面組件(如page.tsx)或布局組件(如layout.tsx)中使用元數(shù)據(jù)API。

import type { Metadata } from 'next'
 
export const metadata: Metadata = {
  title: 'Hero's Blog',
  description: 'Blog created by Hero',
}

3. 動(dòng)態(tài)元數(shù)據(jù)(Dynamic Metadata)

在Next.js中,你可以使用generateMetadata函數(shù)來(lái)獲取需要?jiǎng)討B(tài)值的元數(shù)據(jù)。這對(duì)于提高網(wǎng)站的SEO得分非常有效。

動(dòng)態(tài)元數(shù)據(jù)的實(shí)現(xiàn)

import type { Metadata } from "next";

type Props = {
    params: {
        id: string
    }
};

export const generateMetadata = ({ params }: Props): Metadata => {
    return {
        title: `Product ${params.id}`
    }
};

export default function FavouriteProductDetails({ params }: Props) {
    return <h1>Favourite Product Details {params.id}</h1>
}

在這個(gè)示例中,我們定義了一個(gè)generateMetadata函數(shù),它根據(jù)傳入的params(在這個(gè)例子中是產(chǎn)品ID)動(dòng)態(tài)生成元數(shù)據(jù)。這樣,每個(gè)產(chǎn)品詳情頁(yè)都可以擁有獨(dú)特的標(biāo)題,有助于提升SEO效果。

元數(shù)據(jù)的排序

Next.js在處理元數(shù)據(jù)時(shí),會(huì)按照從根路徑到最終頁(yè)面的路徑順序來(lái)評(píng)估元數(shù)據(jù)。例如:

  • app/layout.tsx(根布局)
  • app/favourite/layout.tsx(嵌套的博客布局)
  • app/favourite/[slug]/page.tsx(博客頁(yè)面)

這種結(jié)構(gòu)確保了元數(shù)據(jù)可以從最頂層布局繼承下來(lái),同時(shí)也可以在更深層次的頁(yè)面中進(jìn)行定制和覆蓋。

使用動(dòng)態(tài)元數(shù)據(jù)的優(yōu)勢(shì)

  • SEO提升:通過(guò)為每個(gè)頁(yè)面提供獨(dú)特且相關(guān)的元數(shù)據(jù),可以顯著提高頁(yè)面在搜索引擎中的可見(jiàn)度。
  • 個(gè)性化體驗(yàn):動(dòng)態(tài)元數(shù)據(jù)允許根據(jù)頁(yè)面內(nèi)容或用戶行為提供更個(gè)性化的頁(yè)面標(biāo)題和描述。
  • 靈活性:動(dòng)態(tài)生成元數(shù)據(jù)的能力提供了高度的靈活性,使得開(kāi)發(fā)者可以針對(duì)不同的頁(yè)面和情境調(diào)整元數(shù)據(jù)。

通過(guò)動(dòng)態(tài)元數(shù)據(jù)的應(yīng)用,Next.js 14為開(kāi)發(fā)者提供了更多的控制權(quán),使他們能夠針對(duì)每個(gè)頁(yè)面精確地優(yōu)化SEO,從而提升用戶體驗(yàn)和網(wǎng)站的整體表現(xiàn)。

4. 私有路由

在Next.js中,私有路由指的是那些不能被用戶通過(guò)網(wǎng)站直接訪問(wèn)的文件夾,即那些不會(huì)直接提供給客戶端的Web頁(yè)面。

實(shí)現(xiàn)私有路由的方法

創(chuàng)建獨(dú)立的組件目錄

將組件放置在app目錄之外的單獨(dú)目錄中。這樣做可以確保這些組件不會(huì)被當(dāng)作頁(yè)面直接訪問(wèn)。

例如,你可以創(chuàng)建一個(gè)名為components的目錄來(lái)存放所有的共享組件。

在app目錄下的任意目錄中創(chuàng)建_components文件夾

在app目錄的任何子目錄中創(chuàng)建一個(gè)以下劃線開(kāi)頭的文件夾(如_components),這樣的文件夾和其中的文件不會(huì)被Next.js當(dāng)作頁(yè)面來(lái)處理。

例如,在app目錄下的favourite目錄中創(chuàng)建一個(gè)_components文件夾:

在目錄中創(chuàng)建不直接提供給客戶端的文件

在特定目錄中創(chuàng)建文件,這些文件不會(huì)直接作為頁(yè)面提供給客戶端,除非它們被顯式地添加到page.tsx文件中。

5. 捕獲所有段(Catch-all Segments)

在Next.js中,動(dòng)態(tài)路由可以通過(guò)在括號(hào)內(nèi)添加省略號(hào)[...segmentName]來(lái)擴(kuò)展為捕獲所有后續(xù)的段。

示例說(shuō)明

例如,路徑/docs/[...slug]/page.tsx不僅會(huì)匹配/docs/topic,還會(huì)匹配/docs/topic/1等更深層次的路由。但是,如果URL是/docs,它會(huì)返回一個(gè)404錯(cuò)誤。

代碼片段

import React from 'react';

type Params = {
    params: {
        slug: string[]
    }
};

export default function SlugPage({ params: { slug } }: Params) {
    return (
        <div>
            <h1>Viewing Custom Slug Page</h1>
            <span>URL Contains: {slug.toString()} </span>
        </div>
    );
}

在這個(gè)代碼片段中,我們定義了一個(gè)SlugPage組件,它接收slug作為參數(shù),并將其轉(zhuǎn)換為字符串顯示在頁(yè)面上。

解決404錯(cuò)誤

你可能想知道是否有辦法解決/docs這個(gè)路由的404錯(cuò)誤。答案是肯定的,你可以通過(guò)一些方法來(lái)解決這個(gè)問(wèn)題,答案在下面,請(qǐng)繼續(xù)往下看

6. 可選的捕獲所有段(Optional Catch-All Segments)

在Next.js中,通過(guò)將參數(shù)放在雙方括號(hào)中:[[...segmentName]],可以使捕獲所有段成為可選的。

例如,路由/docs/[[...slug]]/page.tsx不僅會(huì)匹配/docs/topic、/docs/topic/10等路由,還會(huì)匹配/docs本身。

可選的捕獲所有段與普通捕獲所有段的區(qū)別

  • 普通捕獲所有段:必須包含至少一個(gè)參數(shù),例如/docs/topic。
  • 可選的捕獲所有段:可以匹配沒(méi)有任何參數(shù)的路由,例如/docs。

7. 活動(dòng)鏈接(Active Links)

在網(wǎng)站上,你可能注意到當(dāng)前正在查看的頁(yè)面鏈接往往有特殊的樣式或覆蓋層。這是一種提升用戶體驗(yàn)的常用方法。今天,我將介紹如何實(shí)現(xiàn)這一功能。

創(chuàng)建一個(gè)導(dǎo)航欄組件

首先,在components目錄中創(chuàng)建一個(gè)名為Navbar.tsx的文件。這將是一個(gè)客戶端組件,因?yàn)橛脩魧⑴c導(dǎo)航欄互動(dòng)。在文件頂部添加“use client”指令,并從next/navigation中導(dǎo)入一個(gè)名為usePathname的鉤子。

示例代碼

"use client";
import Link from 'next/link';
import { usePathname } from 'next/navigation';
import React from 'react';

type Links = {
    title: string,
    url: string
};

export default function Navbar() {

    const links: Links[] = [
        {
            title: "Sign In",
            url: "/sign-in"
        },
        {
            title: "Favourite",
            url: "/favourite/1"
        },
    ];

    const pathname = usePathname();

    return (
        <div className='flex space-x-4'>
            {links.map(({ title, url }: Links) => {
                const isActive = pathname.startsWith(url);

                return <Link
                    className={isActive ? "font-bold text-emerald-500" : "text-white"}
                    key={title}
                    href={url}>
                    {title}
                </Link>
            })}
        </div>
    )
}

解釋代碼

  • 定義鏈接:通過(guò)創(chuàng)建一個(gè)名為links的常量來(lái)定義你想要在導(dǎo)航欄中顯示的鏈接。
  • 映射鏈接:使用map方法遍歷links數(shù)組,并為每個(gè)鏈接生成一個(gè)Link組件。
  • 活動(dòng)鏈接樣式:使用usePathname鉤子獲取當(dāng)前的路徑。然后通過(guò)比較當(dāng)前路徑和鏈接的url,決定是否為該鏈接應(yīng)用活動(dòng)狀態(tài)的樣式。

效果

當(dāng)用戶點(diǎn)擊其中一個(gè)鏈接時(shí),該鏈接的文本顏色會(huì)改變,這表明了用戶當(dāng)前所處的頁(yè)面。例如,點(diǎn)擊“Sign In”鏈接后,文本顏色變化,從而增強(qiáng)了用戶體驗(yàn)。

注意事項(xiàng)

確保你要使用的路由URL已經(jīng)存在,否則會(huì)出現(xiàn)404錯(cuò)誤。

通過(guò)以上步驟,你可以在Next.js應(yīng)用中創(chuàng)建一個(gè)具有活動(dòng)狀態(tài)樣式的導(dǎo)航欄,這不僅讓用戶界面看起來(lái)更加友好,還能提高用戶的導(dǎo)航體驗(yàn)。

結(jié)束

隨著NextJS 14的發(fā)布,我們見(jiàn)證了前端開(kāi)發(fā)領(lǐng)域的一次重大變革。這個(gè)版本不僅加強(qiáng)了對(duì)開(kāi)發(fā)者體驗(yàn)的關(guān)注,還通過(guò)諸如路由分組、動(dòng)態(tài)元數(shù)據(jù)、私有路由、可選的捕獲所有段以及活動(dòng)鏈接等功能,大幅提升了應(yīng)用的性能和可用性。這些創(chuàng)新特性不僅簡(jiǎn)化了復(fù)雜應(yīng)用的開(kāi)發(fā)和維護(hù),也為最終用戶帶來(lái)了更加流暢和直觀的瀏覽體驗(yàn)。NextJS 14的這些優(yōu)化措施,無(wú)疑將助力開(kāi)發(fā)者構(gòu)建更加高效、更加用戶友好的現(xiàn)代Web應(yīng)用。作為React開(kāi)發(fā)者,掌握并應(yīng)用這些新特性,將是我們適應(yīng)和引領(lǐng)前端技術(shù)潮流的關(guān)鍵。讓我們擁抱NextJS 14,共同開(kāi)啟前端開(kāi)發(fā)的新篇章!

責(zé)任編輯:姜華 來(lái)源: 今日頭條
相關(guān)推薦

2017-11-07 21:58:25

前端JavaScript調(diào)試技巧

2024-02-05 11:55:41

Next.js開(kāi)發(fā)URL

2023-11-06 11:32:46

CSS選擇器作用域

2015-08-13 09:03:14

調(diào)試技巧

2020-01-29 19:40:36

Python美好,一直在身邊Line

2021-01-05 11:22:58

Python字符串代碼

2024-03-04 00:00:00

Kubernetes技巧API

2017-02-23 19:42:55

AS Android代碼

2020-11-03 09:51:04

JavaScript開(kāi)發(fā) 技巧

2021-02-16 09:02:59

Python代碼技巧

2020-12-14 07:51:16

JS 技巧虛值

2012-11-23 10:57:44

Shell

2022-09-20 11:58:27

NpmNode.js

2021-11-01 12:10:56

Python技巧代碼

2023-04-09 23:37:31

JavaScript開(kāi)發(fā)

2014-04-10 13:15:54

PythonPython技巧

2022-12-21 08:05:04

字符串分割技巧

2022-12-09 15:06:26

字符串Intl字符串分割

2021-02-28 08:34:14

CSS outline-off負(fù)值技巧

2019-11-20 10:25:06

sudoLinux
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)