要从头开始使用 React 构建完整的 Web 应用程序,您需要考虑许多重要的细节:
一个框架可以解决这些问题。但是这样的框架必须具有正确的抽象级别——否则它不会很有用。它还需要具有出色的“开发人员体验”,确保您和您的团队在编写代码时拥有令人惊叹的体验。
输入Next.js,即 React 框架。Next.js 为上述所有问题提供了解决方案。但更重要的是,它会让你和你的团队在构建 React 应用程序时进入成功的陷阱。
Next.js 旨在拥有一流的开发人员体验和许多内置功能,例如:
Next.js 用于数以万计的面向生产的网站和 Web 应用程序,其中包括许多世界上最大的品牌。
首先,让我们确保您的开发环境已准备就绪。
如果您使用的是 Windows,我们建议您下载 Git for Windows并使用它附带的 Git Bash,它支持本教程中特定于 UNIX 的命令。适用于 Linux 的 Windows 子系统 (WSL)是另一种选择。
要创建 Next.js 应用程序,请打开终端,cd
进入要在其中创建应用程序的目录,然后运行以下命令:
npx create-next-app nextjs-blog --use-npm --example "https://github.com/vercel/next-learn/tree/master/basics/learn-starter"
在后台,它使用名为 的工具
create-next-app
,它为您引导 Next.js 应用程序。它通过标志使用这个模板。--example
如果它不起作用,请查看此页面。
您现在有一个名为nextjs-blog
. 让我们cd
进入它:
cd nextjs-blog
然后,运行以下命令:
npm run dev
这会在端口3000上启动 Next.js 应用程序的“开发服务器”。
当我们访问http://localhost:3000
时,会出现下面页面。
让我们尝试编辑起始页。
pages/index.js
使用您的文本编辑器打开。
的文字并将其更改为“Learn”。Next.js 开发服务器启用了快速刷新。当您对文件进行更改时,Next.js 几乎会立即自动在浏览器中应用更改。无需刷新!这将帮助您快速迭代您的应用程序。
pages
在 Next.js 中,页面是从目录中的文件导出的 React 组件。
页面根据其文件名与路由相关联。例如,在开发中:
pages/index.js
与/
路线相关联。pages/posts/first-post.js
与/posts/first-post
路线相关联。我们已经有了这个pages/index.js
文件,所以让我们创建pages/posts/first-post.js
来看看它是如何工作的。
在.posts_pages
first-post.js
在目录中创建一个名为的文件posts
,其内容如下:
export default function FirstPost() {
return <h1>First Post</h1>;
}
组件可以有任何名称,但您必须将其导出为default
导出。
现在,确保开发服务器正在运行并访问http://localhost:3000/posts/first-post
。您应该看到以下页面:
这就是在 Next.js 中创建不同页面的方法。
pages
只需在目录下创建一个JS文件,文件的路径就变成了URL路径。
在某种程度上,这类似于使用 HTML 或 PHP 文件构建网站。您无需编写 HTML,而是编写 JSX 并使用 React 组件。
让我们添加一个指向新添加页面的链接,以便我们可以从主页导航到它。
在 Next.js 中,您使用Link
Component fromnext/link
来包装标签。
允许您进行客户端导航到应用程序中的不同页面。
首先,打开,并通过在顶部添加以下行来pages/index.js
导入Link
组件:next/link
import Link from 'next/link';
然后找到h1看起来像这样的标签:
<h1 className="title">
Learn <a href="https://nextjs.org">Next.js!a>
h1>
并将其更改为:
<h1 className="title">
Read{' '}
<Link href="/posts/first-post">
<a>this page!a>
Link>
h1>
{' '}
添加一个空格,用于将文本分成多行。
接下来,打开pages/posts/first-post.js
并将其内容替换为以下内容:
import Link from 'next/link';
export default function FirstPost() {
return (
<>
<h1>First Post</h1>
<h2>
<Link href="/">
<a>Back to home</a>
</Link>
</h2>
</>
);
}
如您所见,该Link组件类似于使用标签,但您使用并在其中放置标签而不是 。
让我们看看它是否有效。您现在应该在每个页面上都有一个链接,允许您来回切换:
该Link
组件支持在同一个 Next.js 应用程序中的两个页面之间进行客户端导航。
客户端导航意味着使用 JavaScript进行页面转换,这比浏览器完成的默认导航要快。
这里有一个简单的方法可以验证它:
backgroundCSS
属性更改
为yellow
。如果您使用而不是
这样做,则背景颜色将在链接点击时被清除,因为浏览器会进行完全刷新。
Next.js 会自动进行代码拆分,因此每个页面只加载该页面所需的内容。这意味着在呈现主页时,最初不会提供其他页面的代码。
即使您有数百个页面,这也可以确保主页快速加载。
仅加载您请求的页面的代码也意味着页面变得孤立。如果某个页面抛出错误,应用程序的其余部分仍然可以工作。
此外,在 Next.js 的生产版本中,每当Link
组件出现在浏览器的视口中时,Next.js 都会自动在后台预取链接页面的代码。当您单击链接时,目标页面的代码已经在后台加载,页面转换几乎是即时的!
Next.js 通过代码拆分、客户端导航和预取(在生产中)自动优化您的应用程序以获得最佳性能。
您将路由创建为文件pages
并使用内置Link
组件。不需要路由库。
您可以在路由文档中的 API 参考和路由中了解有关Link
组件的更多信息。next/link
如果您需要链接到Next.js 应用程序之外的外部页面,只需使用
不带
Link
.如果您需要添加属性,例如,className
将其添加到a
标签,而不是Link
标签。这是一个例子。
Next.js 可以在顶级目录下提供静态资产,例如图片。可以从应用程序的根目录引用其中的文件,类似于.public
public
pages
该public
目录对于robots.txt
、Google Site Verification 和任何其他静态资产也很有用。查看静态文件服务的文档以了解更多信息。
首先,让我们检索您的个人资料图片。
.jpg
以格式下载您的个人资料图片(或使用此文件)。
images
在目录中创建一个public
目录。
将图片另存为profile.jpg
目录public/images
。
图像大小可以在 400 像素 x 400 像素左右。
您可以直接删除该public
目录下未使用的 SVG 徽标文件。
使用常规 HTML,您将添加您的个人资料图片,如下所示:
<img src="/images/profile.jpg" alt="Your Name" />
但是,这意味着您必须手动处理:
和更多。相反,Next.js 提供了一个Image
开箱即用的组件来为您处理这个问题。
next/image
是 HTML
元素的扩展,是为现代网络发展而来的。
Next.js 默认还支持图像优化。这允许在浏览器支持时以WebP等现代格式调整、优化和提供图像。这避免了将大图像传送到具有较小视口的设备。它还允许 Next.js 自动采用未来的图像格式并将它们提供给支持这些格式的浏览器。
自动图像优化适用于任何图像源。即使图像由外部数据源(如 CMS)托管,它仍然可以进行优化。
Next.js 不是在构建时优化图像,而是在用户请求时按需优化图像。与静态站点生成器和纯静态解决方案不同,您的构建时间不会增加,无论是发送 10 个图像还是 1000 万个图像。
默认情况下,图像是延迟加载的。这意味着您的页面速度不会因视口之外的图像而受到惩罚。图像在滚动到视口时加载。
图像总是以这样的方式呈现,以避免累积布局移位,这是谷歌将在搜索排名中使用的核心网络生命力。
这是一个next/image
用于显示我们的个人资料图片的示例。height
和width
道具应该是所需的渲染大小,具有与源图像相同的纵横比。
**注意:**我们稍后将在“抛光布局”中使用该组件,无需复制它。
import Image from 'next/image';
const YourComponent = () => (
);
如果我们想修改页面的元数据,比如
HTML 标签,该怎么办?
是HTML 标签的一部分,所以让我们深入研究如何
在 Next.js 页面中修改标签。
在编辑器中打开pages/index.js
并找到以下行:
<Head>
<title>Create Next Apptitle>
<link rel="icon" href="/favicon.ico" />
Head>
请注意,使用 代替小写
。
是一个内置在 Next.js 中的 React 组件。它允许您修改
页面的。
Head
您可以从模块中导入组件next/head
。
Head
到first-post.js
我们还没有添加
到我们的/posts/first-post
路线。让我们添加一个。
打开文件并在文件开头添加frompages/posts/first-post.js
的导入:Head
next/head
import Head from 'next/head';
然后,更新导出的FirstPost
组件以包含该Head
组件。现在,我们将只添加title
标签:
export default function FirstPost() {
return (
<>
First Post
First Post
Back to home
>
);
}
第三方 JavaScript是指从第三方来源添加的任何脚本。通常,包含第三方脚本是为了将更新的功能引入不需要从头开始编写的站点,例如分析、广告和客户支持小部件。
让我们深入研究如何将第三方脚本添加到 Next.js 页面。
在编辑器中打开pages/posts/first-post.js
并找到以下行:
First Post
除了元数据,需要尽快加载和执行的脚本通常被添加到页面中。使用常规 HTML
元素,将添加一个外部脚本,如下所示:
First Post
该脚本包含Facebook SDK ,通常用于引入 Facebook 社交插件和其他功能。尽管这种方法有效,但以这种方式包含脚本并不能清楚地知道何时加载相对于在同一页面上获取的其他 JavaScript 代码。如果一个特定的脚本是渲染阻塞的并且会延迟页面内容的加载,这会显着影响性能。
next/script
是 HTML元素的扩展,并在获取和执行其他脚本时进行优化。
在同一个文件中,在文件开头添加一个 import for Script
from next/script
:
import Script from 'next/script';
现在,更新FirstPost
组件以包含该Script
组件:
export default function FirstPost() {
return (
<>
First Post