前往小程序,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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
基于asp.net + easyui框架,一步步学习easyui-datagrid——实现分页和搜索(二)
基于asp.net + easyui框架,一步步学习easyui-datagrid——界面(一)
程序猿小亮
2021/01/29
1.2K0
把DataTable 转换成Json格式,适用于EasyUI 绑定DataGrid
本文转载:http://www.cnblogs.com/liang--liang/archive/2013/02/05/2893030.html
跟着阿笨一起玩NET
2018/09/19
9590
C# 读取多条数据记录导出到 Word 标签模板
将数据库数据表中的数据输出并打印,WORD 是一个良好的载体, 在应用项目里,许多情况下我们会使用数据记录结合 WORD 标签模板进行配合,输出数据进行打印的功能需求。
初九之潜龙勿用
2024/06/20
1460
C# 读取多条数据记录导出到 Word 标签模板
C#操作json的通用帮助类
using System; using System.Data; using System.Text; using System.Collections.Generic; using System.Reflection; using System.Data.Common; using System.Collections; using System.IO; using System.Text.RegularExpressions; using System.Runtime.Serialization.Jso
用户7108768
2021/11/02
1.3K0
[C#] 常用工具类——直接在浏览器输出数据
/// <summary> /// <para> </para> ///  常用工具类——直接在浏览器输出数据 /// <para> -------------------------------------------------------------</para> /// <para> DumpDataTable:接在浏览器输出数据DataTable</para> /// <para> DumpListItemILIST:直接在浏览器输出数据ILIST<List
跟着阿笨一起玩NET
2018/09/19
7010
C#导入导出数据到Excel的通用类代码
Excel文件导入导出,需引用Microsoft Excel 11.0 Object Library
用户8671053
2021/11/03
8680
VB.net datagridview转Excel,datatable转数组
VB.net datagridview转Excel,datatable转数组,简单说就是通过datatable转换成二维数组,然后导出数据到Excel文件,可以瞬间导出N多条数据;
办公魔盒
2019/07/22
2.1K0
VB.net datagridview转Excel,datatable转数组
【Jqurey EasyUI+Asp.net】—DataGrid增加、删、更改、搜
在前面写了两,但不知道如何完成,对比刚刚开始学这个,他们摸着石头过河,一步步。在最后两天DataGridCRUD融合在一起。因此份额。我希望像我这样谁是刚刚开始学习一些帮助。
全栈程序员站长
2022/07/06
1.4K0
jQuery打造智能提示插件
插件根据实际需要在单功能上封装的,实现传入后台数据地址,要保存值的input,前台要传入的参数(过滤条件),来返回下拉提示数据,数据过多可上下滚动选择,选择后显示文本与对应的值,供后台操作,如图: j
欢醉
2018/01/22
5K0
jQuery打造智能提示插件
VB.NET DataTable数据表转CSV文件
CSV文件(Comma-Separated Values),中文叫,逗号分隔值或者字符分割值,其文件以纯文本的形式存储表格数据。该文件是一个字符序列,可以由任意数目的记录组成,记录间以某种换行符分割。每条记录由字段组成,字段间的分隔符是其他字符或者字符串。所有的记录都有完全相同的字段序列,相当于一个结构化表的纯文本形式。
办公魔盒
2021/09/10
2.4K0
silverlight获取外部数据的另一种选择:FluorineFx
Silverlight从其它系统获取外部数据的常规途径无非下面2种: 1、直接远程加载文本或xml文件 (直接请求ashx/aspx,然后在ashx/aspx上输出信息也可以归入这一类) 2、通过wcf/webService取得数据 (当然,sl跟本机的sl之间也能交换数据,但这个用处有限,此外通过socket也能拿到数据,但是socket要玩好并不容易,难度系数有点高,本文不做讨论) 而返回的数据格式,最常用的通常为"xml"、"json字符串"(或普通字符串) 或 "最原始的Stream" 今天在学习F
菩提树下的杨过
2018/01/23
9820
silverlight获取外部数据的另一种选择:FluorineFx
Flex4中使用WCF
虽然flex跟.net交互的首选是FluorineFx,但是如果在某些特定情况下(比如服务端是现成的,不允许修改,或者服务端开发方不懂FluorineFx为何物),这时webService还是挺有用的。 WebService完全可以用"以BasicHttpBinding方式运行的WCF"代替。经过我的实际测试:对于基本类型(比如int,string,datetime以及它们对应的arrry以list),flex调用时能正确识别并“翻译”成as3中对应的int,String,Date以及Array类型,而复杂
菩提树下的杨过
2018/01/22
7950
Flex4中使用WCF
【c#】把Dataset类型转为List<T>
之前分享过将从数据库查出来的datatable数据分页,然后将每一页的数据转成list。前几天搭档觉得这个过程太复杂,建议直接读取数据库返回泛型集合,如题目所说的把dataset类型的数据转为List<T>泛型集合,不过这样做也需要对list进行分页。本着学习的态度,昨天实践了一下这种方法,主要是封装一个dataset to list的工具类。主要代码如下:
全栈程序员站长
2022/08/10
1.4K0
C#的DataTable操作方法
1.将泛型集合类转换成DataTable(表中无数据时使用): public static DataTable NullListToDataTable(IList list) {
彭泽0902
2018/01/04
2K0
DB数据导出工具分享
开启线程执行导出的时候使用的是Task.Run(() =>{});若将框架版本改为4.0则需要将此处修改为new Thread(() =>{}).Start();
易墨
2018/09/14
1.6K0
DB数据导出工具分享
ASP.NET(C#) Json序列化反序列化帮助类Jsonhelper
using System; using System.Collections.Generic; using System.Web; using System.Web.Script.Serialization; using System.Data; namespace Utils { /// <summary> /// JSON帮助类 /// </summary> public class JsonHelper { /// <summary>
KenTalk
2018/09/11
3K0
Net操作Excel(终极方法NPOI)
前言 Asp.net/C#操作Excel已经是老生长谈的事情了,可下面我说的这个NPOI操作Excel,应该是最好的方案了,没有之一,使用NPOI能够帮助开发者在没有安装微软Office的情况下读写Office 97-2003的文件,支持的文件格式包括xls, doc, ppt等。NPOI是构建在POI 3.x版本之上的,它可以在没有安装Office的情况下对Word/Excel文档进行读写操作。 方法 先去官网:http://npoi.codeplex.com/下载需要引入dll(可以选择.net2.0
磊哥
2018/05/08
2.4K0
【c#】DataTable分页处理
最近在做项目的过程中,需要将从数据库查出来的数据传输给另外一个系统进行分析,我是通过http的post请求发送的,但是在传输的过程中,当传输两万多条的数据是,请求很慢,而且每次只能穿五千多条的数据,剩下的就都丢失了,出现这个问题的原因是对方对http请求最大数据量的设置是2M,所以我们协商的结果是在我们上传数据之前对数据进行分片。所以我就对查出来的数据进行分页,然后按页传输。
全栈程序员站长
2022/08/10
1.3K0
我的数据访问类(第二版)—— for .net2.0 (二)
下面写一下相对来说不变的地方 SQL语句部分,改成了静态函数的形式。 using System; using System.Collections.Generic; using System.Text; using System.Data; using System.Data.Common; using System.Data.SqlClient; using JYK; namespace JYK.DataAccessLibrary {     //DataAccessLibrary 数据访问库    
用户1174620
2018/02/07
1K0
常用Excel导出方法
  最近项目中用到导出Excel,项目已有的方法1和2,导出的excel,看似是exce格式,其实只是改了后缀名。
_一级菜鸟
2020/04/08
7370
常用Excel导出方法
相关推荐
基于asp.net + easyui框架,一步步学习easyui-datagrid——实现分页和搜索(二)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文