Next.js入门
Next 特点
next 适合用于公司官网、文章类、电商类等对于 SEO 需求高的网站。 中后台管理系统无需 SEO 所以也不一定需要使用 Next
创建 Next.js 应用
npx create-next-app nextjs-blog --use-npm --example "https://github.com/vercel/next-learn/tree/master/basics/learn-starter"
cd nextjs-blog
npm run dev
路由
Next 中路由就是对应的文件路径
例如,在开发中:
pages/index.js与/路线相关联。 pages/posts/first-post.js与/posts/first-post路线相关联。
Link
<Link> 用于在页面中导航
import Link from 'next/link';
<h1 className="title">
Read <Link href="/posts/first-post">this page!</Link>
</h1>
在 Next.js 的生产版本中,每当Link组件出现在浏览器的视口中时,Next.js 都会在后台自动预取链接页面的代码。当您单击链接时,目标页面的代码已经在后台加载,页面转换几乎是即时的!
资源 css 等
静态文件服务
Next 可以以 public 为基础,在根目录中的一个文件夹下提供静态文件服务,从基本 baseURL/ 开始引用 public 其中的文件
例如:public/me.png 对应 http://localhost:3000/me.png
这点跟 vue-cli 和 rca 类似
css
Next 支持 CSS Modules
重要提示:要使用CSS 模块,CSS 文件名必须以.module.css
使用 Sass
npm install -D sass
图片
import Image from 'next/image';
const YourComponent = () => (
<Image
src="/images/profile.jpg" // Route of the image file
height={144} // Desired size with correct aspect ratio
width={144} // Desired size with correct aspect ratio
alt="Your Name"
/>
);
head
import Head from 'next/head';
// 直接会渲染到 head 标签中
<Head>
<title>Create Next App</title>
<link rel="icon" href="/favicon.ico" />
</Head>
全局样式
要加载全局 CSS文件,请创建一个名为的文件pages/_app.js,其内容如下
// `pages/_app.js`
import '../styles/global.css';
export default function App({ Component, pageProps }) {
return <Component {...pageProps} />;
}
该App组件是所有不同页面通用的顶级组件。例如,您可以使用此App组件在页面之间导航时保持状态
添加 layout 组件
。
预渲染
两种形式的预渲染
Next.js 有两种预渲染形式:静态生成和服务器端渲染。不同之处在于它何时为页面生成 HTML
- 静态生成是在构建时生成 HTML 的预渲染方法。然后在每个请求上重用预呈现的 HTML
- 服务器端渲染是在每个请求上生成 HTML 的预渲染方法。
静态生成
getStaticProps
getStaticProps 仅在服务器端运行
开发与生产
- 在开发(npm run dev或yarn dev)中,getStaticProps在每个请求上运行。
- 在生产中,getStaticProps 在构建时运行。但是,可以使用返回的fallback键来增强此行为 getStaticPaths
我 们建议尽可能使用静态生成(有数据和无数据),因为您的页面可以构建一次并由 CDN 提供服务,这比让服务器在每次请求时呈现页面要快得多。
您可以将静态生成用于多种类型的页面,包括:
- 营销页面
- 博客文章
- 电子商务产品列表
- 帮助和文档
// 服务端
export async function getStaticProps() {
const allPostsData = getSortedPostsData();
return {
props: {
allPostsData,
},
};
}
// 客户端
export default function Home({ allPostsData }) {
const [state, setState] = useState(false);
return (
<Layout home>
<section className={`${utilStyles.headingMd} ${utilStyles.padding1px}`}>
<h2 className={utilStyles.headingLg}>Blog</h2>
<ul className={utilStyles.list}>
{allPostsData.map(({ id, date, title }) => (
<li className={utilStyles.listItem} key={id}>
{title}
<br />
{id}
<br />
{date}
</li>
))}
</ul>
</section>
</Layout>
);
}
注意事项
- 因为它仅在构建时运行,所以您将无法使用仅在请求期间可用的数据,例如查询参数或 HTTP 标头。
- 仅允许在页面中, getStaticProps只能从页面导出。您不能从非页面文件中导出它。这种限制的原因之一是 React 需要在呈现页面之前拥有所有必需的数据
- 因为它仅在构建时运行 所以无法获取实时数据(仅适用于类似 静态博客 这种案例)