前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Next.js 入门

Next.js 入门

作者头像
Dickensl
发布于 2022-06-14 05:41:26
发布于 2022-06-14 05:41:26
6.6K00
代码可运行
举报
文章被收录于专栏:睿Talks睿Talks
运行总次数:0
代码可运行

一、前言

当使用 React 开发系统的时候,常常需要配置很多繁琐的参数,如 Webpack 配置、Router 配置和服务器配置等。如果需要做 SEO,要考虑的事情就更多了,怎么让服务端渲染和客户端渲染保持一致是一件很麻烦的事情,需要引入很多第三方库。针对这些问题,Next.js提供了一个很好的解决方案,使开发人员可以将精力放在业务上,从繁琐的配置中解放出来。下面我们一起来看看它的一些特性。

二、特性介绍

Next.js 具有以下几点特性:

  • 默认支持服务端渲染
  • 自动根据页面进行代码分割
  • 简洁的客户端路由方案(基于页面)
  • 基于 Webpack 的开发环境,支持热模块替换
  • 可以跟 Express 或者其它 Node.js 服务器完美集成
  • 支持 Babel 和 Webpack 的配置项定制

三、Hello World

执行以下命令,开始 Next.js 之旅:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mkdir hello-next
cd hello-next
npm init -y
npm install --save react react-dom next
mkdir pages

package.json中输入以下内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "scripts": {
    "dev": "next",
    "build": "next build",
    "start": "next start"
  }
}

在 pages 文件夹下,新建一个文件 index.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const Index = () => (
  <div>
    <p>Hello Next.js</p>
  </div>
)

export default Index

在控制台输入npm run dev,这时候在浏览器输入http://localhost:3000,就能看到效果了。

四、路由

Next.js 没有路由配置文件,路由的规则跟 PHP 有点像。只要在 pages 文件夹下创建的文件,都会默认生成以文件名命名的路由。我们新增一个文件看效果pages/about.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
export default function About() {
  return (
    <div>
      <p>This is the about page</p>
    </div>
  )
}

在浏览器输入http://localhost:3000/about,就能看到相应页面了。

如果需要进行页面导航,就要借助next/link组件,将 index.js 改写:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import Link from 'next/link'

const Index = () => (
  <div>
    <Link href="/about">
      <a>About Page</a>
    </Link>
    <p>Hello Next.js</p>
  </div>
)

export default Index

这时候就能通过点击链接进行导航了。

如果需要给路由传参数,则使用query string的形式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 <Link href="/post?title=hello">
   <a>About Page</a>
 </Link>

取参数的时候,需要借助框架提供的withRouter方法,参数封装在 query 对象中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { withRouter } from 'next/router'

const Page = withRouter(props => (
  <h1>{props.router.query.title}</h1>
))

export default Page

如果希望浏览器地址栏不显示query string,可以使用as属性:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<Link as={`/p/${props.id}`} href={`/post?id=${props.id}`}
  <a>{props.title}</a>
</Link>

这时候浏览器会显示这样的url:localhost:3000/p/12345

五、SSR

Next.js 对服务端渲染做了封装,只要遵守一些简单的约定,就能实现 SSR 功能,减少了大量配置服务器的时间。以上面这个 url 为例子,直接在浏览器输入localhost:3000/p/12345是会返回404的,我们需要自己实现服务端路由处理的逻辑。下面以express为例子进行讲解。新建一个 server.js 文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const express = require('express')
const next = require('next')

const dev = process.env.NODE_ENV !== 'production'
const app = next({ dev })
const handle = app.getRequestHandler()

app
  .prepare()
  .then(() => {
    const server = express()

    // 处理localhost:3000/p/12345路由的代码
    server.get('/p/:id', (req, res) => {
      const actualPage = '/post'
      const queryParams = { title: req.params.id }
      app.render(req, res, actualPage, queryParams)
    })

    server.get('*', (req, res) => {
      return handle(req, res)
    })

    server.listen(3000, err => {
      if (err) throw err
      console.log('> Ready on http://localhost:3000')
    })
  })
  .catch(ex => {
    console.error(ex.stack)
    process.exit(1)
  })

当遇到/p/:id这种路由的时候,会调用app.render方法渲染页面,其它的路由则调用app.getRequestHandler方法。

无论是服务端渲染还是客户端渲染,往往都需要发起网络请求获取展示数据。如果要同时考虑 2 种渲染场景,可以用getInitialProps这个方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import Layout from '../components/MyLayout.js'
import fetch from 'isomorphic-unfetch'

const Post = props => (
  <Layout>
    <h1>{props.show.name}</h1>
    <p>{props.show.summary.replace(/<[/]?p>/g, '')}</p>
    <img src={props.show.image.medium} />
  </Layout>
)

Post.getInitialProps = async function(context) {
  const { id } = context.query
  const res = await fetch(`https://api.tvmaze.com/shows/${id}`)
  const show = await res.json()

  console.log(`Fetched show: ${show.name}`)

  return { show }
}

export default Post

获取数据后,组件的props就能获取到getInitialProps return 的对象,render 的时候就能直接使用了。getInitialProps是组件的静态方法,无论服务端渲染还是客户端渲染都会调用。如果需要获取 url 带过来的参数,可以从context.query里面取。

六、CSS in JS

对于页面样式,Next.js 官方推荐使用 CSS in JS 的方式,并且内置了styled-jsx。用法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import Layout from '../components/MyLayout.js'
import Link from 'next/link'

function getPosts() {
  return [
    { id: 'hello-nextjs', title: 'Hello Next.js' },
    { id: 'learn-nextjs', title: 'Learn Next.js is awesome' },
    { id: 'deploy-nextjs', title: 'Deploy apps with ZEIT' }
  ]
}

export default function Blog() {
  return (
    <Layout>
      <h1>My Blog</h1>
      <ul>
        {getPosts().map(post => (
          <li key={post.id}>
            <Link as={`/p/${post.id}`} href={`/post?title=${post.title}`}>
              <a>{post.title}</a>
            </Link>
          </li>
        ))}
      </ul>
      <style jsx>{`
        h1,
        a {
          font-family: 'Arial';
        }

        ul {
          padding: 0;
        }

        li {
          list-style: none;
          margin: 5px 0;
        }

        a {
          text-decoration: none;
          color: blue;
        }

        a:hover {
          opacity: 0.6;
        }
      `}</style>
    </Layout>
  )
}

注意<style jsx>后面跟的是模板字符串,而不是直接写样式。

七、导出为静态页面

如果网站都是简单的静态页面,不需要进行网络请求,Next.js 可以将整个网站导出为多个静态页面,不需要进行服务端或客户端动态渲染了。为了实现这个功能,需要在根目录新建一个next.config.js配置文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
module.exports = {
  exportPathMap: function() {
    return {
      '/': { page: '/' },
      '/about': { page: '/about' },
      '/p/hello-nextjs': { page: '/post', query: { title: 'Hello Next.js' } },
      '/p/learn-nextjs': { page: '/post', query: { title: 'Learn Next.js is awesome' } },
      '/p/deploy-nextjs': { page: '/post', query: { title: 'Deploy apps with Zeit' } }
    }
  }
}

这个配置文件定义了 5 个需要导出的页面,以及这些页面对应的组件和需要接收的参数。然后在package.json定义下面 2 个命令,然后跑一下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "scripts": {
    "build": "next build",
    "export": "next export"
  }
}

npm run build
npm run export

跑完后根目录就会多出一个out文件夹,所有静态页面都在里面。

八、组件懒加载

Next.js 默认按照页面路由来分包加载。如果希望对一些特别大的组件做按需加载时,可以使用框架提供的next/dynamic工具函数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import dynamic from 'next/dynamic'

const Highlight = dynamic(import('react-highlight'))

export default class PostPage extends React.Component {
    renderMarkdown() {
      if (this.props.content) {
        return (
          <div>
            <Highlight innerHTML>{this.props.content}</Highlight>
          </div>
        )
      }

      return (<div> no content </div>);
    }

    render() {
      return (
        <MyLayout>
          <h1>{this.props.title}</h1>
          {this.renderMarkdown()}
        </MyLayout>
      )
    }
  }
}

当 this.props.content 为空的时候,Highlight 组件不会被加载,加速了页面的展现,从而实现按需加载的效果。

九、总结

本文介绍了 Next.js 的一些特性和使用方法。它最大的特点是践行约定大于配置思想,简化了前端开发中一些常用功能的配置工作,包括页面路由、SSR 和组件懒加载等,大大提升了开发效率。

更详细的使用介绍请看官方文档

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-06-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
[Next] 初见next.js
  Next.js 可与 Windows,Mac 和 Linux 一起使用.您只需要在系统上安装 Node.js 即可开始构建 Next.js 应用程序.如果有个编辑器就更好了
不会飞的小鸟
2019/10/01
5.1K0
[Next] 初见next.js
Next.js入门教程 原
参考代码:https://github.com/chkui/nextjs-getting-started 。
随风溜达的向日葵
2018/12/07
5.9K0
SSR服务器端渲染(Next.js总结和豆瓣电影项目)「建议收藏」
先解释一下Nuxt.js和Next.js虽然只有一个字母之差,但它们是不同的两个服务端渲染框架.
全栈程序员站长
2022/11/15
2.2K0
React SSR 简介与 Next.js 使用入门
React SSR 是什么?React SSR 是 React 服务器端渲染 (SSR: server side render) 技术。传统的服务端渲染方式是使用 HTML 模板的方式渲染出来的。访问数据库,拿到数据然后将数据填充到 HTML 模板上,比如 Node.js 中的 pug 模板引擎、ejs 模板引擎等都是服务端渲染的模板。传统的服务端渲染通常用在文档型页面上,而现在网页被称为 web app,页面更像 app 应用,现在做服务器渲染主要是为了 SEO 和首屏。React 与模板渲染很相似,都是通过数据驱动,将页面渲染出来。
多云转晴
2020/03/12
9.8K0
基于 Next.js 的 SSR/SSG 方案了解一下?
本文主要是讲讲如何使用 Next.js 框架实现服务端渲染,将有效提升网页的 SEO 和首屏渲染速度,说不定哪天就用上了,是吧!
小东同学
2022/07/29
5.6K0
基于 Next.js 的 SSR/SSG 方案了解一下?
Next.js + TypeScript 搭建一个简易的博客系统
来记录下学习(踩坑)的过程,这篇文章的代码都在https://github.com/Maricaya/nextjs-blog-1啦。
coder_koala
2020/09/17
3.9K0
Next.js/Nuxt.js/Nest.js/Fastify
安利下:《next.js静态页面渲染技术(静态生成和服务端渲染):BSR/SSG/SSG》
周陆军博客
2023/05/14
3.2K0
React 必学SSR框架——next.js
F首先我们就回顾一下,我们到底是怎么告别了使用 php/jsp 做服务器端渲染,进入前后端分离的客户端渲染时代,又为什么重新回到了服务端渲染。
狂奔滴小马
2021/11/15
7.7K0
React 必学SSR框架——next.js
React 使用Next.js进行服务端渲染
React是一个流行的JavaScript库,用于构建现代Web应用程序。然而,由于React在客户端渲染时需要大量的JavaScript代码,因此会影响应用程序的性能和SEO优化。为了解决这个问题,可以使用服务器渲染(SSR)来提高性能和SEO优化。在本文中,我们将详细介绍如何使用Next.js进行服务器渲染的React应用程序。
世间万物皆对象
2024/03/20
1500
Next.js的创建与使用
NextJs是React的服务器渲染框架,区别于官方SSRNext最大的特点是可以渲染出Ajax异步请求渲染出来的结果,本网站目前使用的前端框架就是NextJs
用户6256742
2022/07/06
4.1K0
Next.js的创建与使用
Next.js 简明教程
最近用Next.js + Editor.js 撸了一个博客系统。开发起来甚是畅滑,如果你喜欢React,又有同构的需求,不妨由此文入手。
小刀c
2022/09/21
3K0
Next.js 简明教程
Next.js学习
举例:在page下创建一个biao.js的文件 访问路径为:localhost:8080/biao
biaoblog.cn 个人博客
2022/08/11
1.7K0
手把手带你用next搭建一个完善的react服务端渲染项目(集成antd、redux、样式解决方案)
本文参考了慕课网jokcy老师的React16.8+Next.js+Koa2开发Github全栈项目,也算是做个笔记吧。
ssh_晨曦时梦见兮
2020/04/10
5.9K0
React服务端渲染-next.js
前台渲染-SPA应用是一个主要阵营,如果说有什么缺点,那就是SEO不好。因为默认的HTML文档只包含一个根节点,实质内容由JS渲染。并且,首屏渲染时间受JS大小和网络延迟的影响较大,因此,某些强SEO的项目,或者首屏渲染要求较高的项目,会采用服务端渲染SSR。
娜姐
2020/09/22
4K0
React服务端渲染-next.js
Next.js新手教程
Next.js 是一个轻量级的 React 服务端渲染应用框架。本教程演示使用Next.js制作一个显示比特币汇率的网站。详细的Next.js信息请访问https://nextjs.org/。
fanzhh
2019/12/12
6.2K0
Next.js静态页面渲染技术(静态生成和服务端渲染):BSR/SSR/SSG
next是一款用JS开发的全栈框架,它是基于express框架基础上开发而成,可以用react写客户端,node.js写服务端。一份代码可在前后端同时运行,这在next中称之为同构!
周陆军博客
2023/05/14
3.9K0
分享 7 个你可能不知道的 Next.js 14 小技巧
今天,我将向大家介绍一些关于NextJS的概念,这些可能是许多开发者所不知道的。你可以利用这些概念来优化你的应用,并改善开发者体验。
前端达人
2024/02/01
8080
分享 7 个你可能不知道的 Next.js 14 小技巧
React.js 结合 Next.js 的入门与 Snapaper 完全重构
背景 申请季开始进入尾声... 前段时间有幸和「哈陆 Halu」一位去年刚入学加拿大滑铁卢大学的 dalao 通过交换友情链接认识了,他的博客链接是 → https://halu.lu ,保存在「伙伴」栏目名为「無位小站」。借着讨论 Nuxt.js 的机会和他聊了一聊,了解了一些他参加的 Co-op 项目和滑大数学系的情况... 他在博文中有提到他收到的另一所学校录取——华盛顿大学(也是 UW 🙂 ) 其世界综合排名会考前很多 (在 2020 US News 世界大学排名中最靠前,第 10 名,实属 da
Tony He
2022/11/17
4.4K0
React.js 结合 Next.js 的入门与 Snapaper 完全重构
CloudBase CMS + Next.js:轻松构建一个内容丰富的站点
试想一下,如果你现在要为你自己或者你所在的组织创建一个强内容的站点,同时要求好的 SEO(搜素引擎优化),比如博客,你会怎么做呢?
腾讯云开发TCB
2021/04/26
2.5K0
CloudBase CMS + Next.js:轻松构建一个内容丰富的站点
Next.js - SSR / SSG / CSR / ISR / Dynamic Routing
Next.js 提供了多种网页渲染方式,这取决于你的服务应用的场景,包括服务端渲染、客户端渲染、静态生成、增量静态生成等。
轻量级云原生架构实验室
2022/12/01
1.2K0
相关推荐
[Next] 初见next.js
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验