FanMa 博客 包含了关于前端学习的一系列内容,涵盖了 HTML、CSS、JavaScript、TypeScript、React、Next.js 等全栈方面的学习笔记。博客以技术为核心,深入浅出地讲解了这些技术的基础概念、实际应用以及最佳实践,并且结合了博主的个人经验和实践经历进行分享,有助于读者更好地理解和掌握这些技术。如果你有前端学习的需求或者对这些技术感兴趣,那么 FanMa 博客 将是帮助你实现这些目标的绝佳资源。

使用 Next.js 创建全局布局和样式
- 526

创建全局布局

创建一个名为 components 的文件夹,在这个文件夹里创建一个 layout.js 文件,在里面写入下面的代码:

export default function Layout({ children }) {
    return <div>{children}</div>;
}

接下来,打开 pages/posts/first-post.js 文件,在顶部引入 Layout 组件 ../../components/layout ,并使其成为最外层组件:

import Head from 'next/head';
import Link from 'next/link';
import Layout from '../../components/layout';

export default function FirstPost() {
    return (
        <Layout>
            <Head>
                <title>FanMa's First Post</title>
            </Head>
            <h1>FanMa's First Post</h1>
            <h2>
                <Link href="/">Back to home</Link>
            </h2>
        </Layout>
    );
}

创建全局样式

现在,让我们为Layout组件添加一些样式。为此,我们将使用 CSS Modules ,它允许您在 React 组件中导入 CSS 文件。

创建一个名为 components/layout.module.css 的文件,并在文件时写入以下内​​容:

.container {
  max-width: 36rem;
  padding: 0 1rem;
  margin: 3rem auto 6rem;
}

在要 components/layout.js 文件里使用 .container 这个类,你还需要完成下面这两步:

  • 1、导入 CSS 文件并为其指定一个名称,例如 styles
  • 2、用作styles.container_className 。

打开 components/layout.js 文件,并在里面写入下面的代码内容:

import styles from './layout.module.css';

export default function Layout({ children }) {
    return <div className={styles.container}>{children}</div>;
}

如果您现在访问 http://localhost:3000/posts/first-post 页面,您应该会看到文字在网页中居中的位置。

自动生成唯一的类名

现在,如果您查看浏览器开发工具中的 HTML,您会注意到组件div呈现的Layout类名如下所示layout_container__...:

<div id="__next">
    <div class="layout_container__fbLkO">
        <h1>FanMa's First Post</h1>
        <h2><a href="/">Back to home</a></h2>
    </div>
</div>

这就是 CSS Modules 所做的:它自动生成唯一的类名。只要使用 CSS Modules ,就不必担心类名冲突。

此外,Next.js 的代码拆分功能也适用于CSS 模块。它确保为每个页面加载最少数量的 CSS。这导致更小的包大小。

CSS 模块在构建时从 JavaScript 包中提取,并生成.css由 Next.js 自动加载的文件。