今年下半年接了一個公司的對外專案,因此有 SEO 需求,不知道是不是靜茹給我的勇氣,讓我主動提出可以使用 Next.js 的 SSR 來架構新專案,總之就是且戰且走吧,從零開始一邊做一邊學。
useRouter hook
// file: <root>/pages/clients/[id]/[projectId].js
// visit: localhost:3000/clients/sean/project1
import { useRouter } from 'next/router'
function SelectedClientProjectPage() {
const router = useRouter()
console.log(router.pathname) // "clients/[id]/[projectId]"
console.log(router.query) // {projectId: "project1", id: "sean"}
// send a request to some backend server
// to fetch the piece of data with an id of router.query.projectId
return (
<div>
<h1>The Project Page for a Specific Project for a Selected Client</h1>
</div>
)
}
export default SelectedClientProjectPage
Catch-All Routes
e.g. [...xxx].js
// file: <root>/pages/blog/[...slug].js
// visit: localhost:3000/blogs/2023/09
import { useRouter } from 'next/router'
function BlogPostsPage() {
const router = useRouter()
console.log(router.query) // {slug: ["2023", "09"]}
return (
<div>
<h1>The Blog Posts</h1>
</div>
)
}
export default BlogPostsPage
Navigating To Dynamic Routes
import Link from 'next/link'
function ClientsPage() {
const clients = [
{ id: 'sean', name: 'Sean' },
{ id: 'chi', name: 'Chi' },
]
return (
<div>
<h1>The Clients Page</h1>
<ul>
{clients.map(client => (
<li key={client.id}>
<Link href={`/clients/${client.id}`}>{client.name}</Link>
</li>
))}
</ul>
</div>
)
}
export default ClientsPage
A Different Way Of Setting Link Hrefs
<Link
href={{
pathname: '/clients/[id]',
query: { id: client.id },
}}
>
{client.name}
</Link>
Navigating Programmatically
const router = useRouter()
router.push({
pathname: '/clients/[id]/[projectId]',
query: { id: 'sean', projectId: 'project1' },
})
Custom 404 Page
// file: <root>/pages/404.js (Must)
// visit: localhost:3000/something
function NotFoundPage() {
return (
<div>
<h1>Page not found!</h1>
</div>
)
}
export default NotFoundPage
Public folder
Files and folders stored outside of public/
are NOT made accessible by Next.js - visitors can NOT load files from there.