‘pages/_document.js’ 文件,自定义document
DOC: https://www.nextjs.cn/docs/advanced-features/custom-document
import Link from '/next/link'
Next.js 会自动进行代码拆分,因此每个页面只加载该页面所需的内容。这意味着在呈现主页时,最初不会提供其他页面的代码。
即使您添加数百个页面,这也可以确保主页快速加载。
仅加载您请求的页面的代码也意味着页面变得孤立。如果某个页面抛出错误,应用程序的其余部分仍然可以工作。
此外,在 Next.js 的生产版本中,每当Link组件出现在浏览器的视口中时,Next.js 都会自动在后台预取链接页面的代码。当您单击链接时,目标页面的代码已经在后台加载,页面转换几乎是即时的!
Next.js 通过代码拆分、客户端导航和预取(在生产中)自动优化您的应用程序以获得最佳性能。
Next.js 内置了对 CSS 和 Sass 的支持。支持导入:导入.css和.scss文件。
<style jsx>{`
…
`}style>
上面代码使用一个名为 styled-jsx 的库。意思是“css-in-js” 库 —— 允许你在 React 组件中编写 CSS。这时 CSS 样式被限制只在当前组件有效。Next.js 内置对 styled-jsx 的支持,但也可以使用其他流行的 CSS-In-JS库,如:styled-components或Emotion。
:1. 使用Css Modules, 文件名必须以
.module.css
2. Css Module会自动生成唯一类型, 不用担心 className 冲突。
3. Next.js代码拆分也对 Css Module 适用,为每个页面加载最少的Css。这导致更小的包。
:添加
pages/_app.js
后需要重启开发服务。
创建顶级目录 styles,里面创建一个 global.css 文件。
// 安装
npm install classnames
// or
yarn add classnames
Docs: https://github.com/JedWatson/classnames
自定义 PostCSS 配置
Next.js使用 PostCSS 编译CSS。 可以通过自定义postcss.config.js去配置。
使用Sass
在您可以使用 Next.js 的内置 Sass 支持之前,请务必安装sass:
npm install sass
静态资源放置在 Next.js 项目根目录下的 public 文件夹下。
Docs: 静态文件服务
通过内置 组件修改。
根目录下新建 components 文件夹。在里面,新建一个名为 layout.js 文件。
默认情况下,Next.js 预渲染每个页面。这意味着 Next.js会提前为每个页面生成 HTML,而不是全部由客户端 JavaScript 完成。预渲染可以带来更好的性能和SEO。
“预渲染”与“无预渲染”:
两种预渲染形式的区别:何时为页面生成HTML。
` | 静态生成 | 服务端渲染 |
---|---|---|
何时生成Html | 构建时 | 请求时 |
适用场景 | 内容固定,不会频繁更新的页面 | 页面会显示频繁更新的数据时,或页面内容会随每个请求而改变时。 |
速度 | 更快 (构建一次并存储在CDN服务上,比每次请求时生成 Html 要更快) | 更慢 (但预渲染的页面将始终是最新的) |
注意: 开发模式下,每个页面都是在请求时进行预渲染。即使使用静态生成也是如此!
即 Next.js 允许在一个应用中,不同页面同时使用两种预渲染方式,如下图所示:
我们可以为大多数页面使用静态生成,部分其他页面使用服务端渲染。
静态生成可以在有数据和没有数据的情况下完成。
在 Next.js 组件中,加上名为 getStaticProps 的 async 函数。
export default function Home(props) { ... }
export async function getStaticProps() {
// Get external data from the file system, API, DB, etc.
const data = ...
// The value of the `props` key will be
// passed to the `Home` component
return {
props: ...
}
}
注意:
getStaticProps
会自动改为在页面请求时运行。import useSWR from 'swr'
function Profile() {
const { data, error } = useSWR('/api/user', fetch)
if (error) return <div>failed to load</div>
if (!data) return <div>loading...</div>
return <div>hello {data.name}!</div>
}
Vercel 是什么?
Vercel (之前也叫 Zeit 或 now.sh) 是一家提供静态网站托管的云平台,支持从 Github, GitLab, Bitbucket 等代码仓库中自动拉取代码 然后进行项目打包和部署等功能。
Learn | Next.js
Next.js 可以部署到任何支持 Node.js 的托管服务提供商。