广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Next.js入门使用教程
  • 471
分享到

Next.js入门使用教程

2024-04-02 19:04:59 471人浏览 独家记忆
摘要

目录简介创建Next.js项目 手动创建Next.js项目cReact-next-app快速创建项目 Pages 路由 Link Router 参数传递与接收 动态路由 钩子事件 获

简介

Next.js 是一个轻量级的 React 服务端渲染应用框架

官网链接:www.nextjs.cn/

优点:

零配置
自动编译并打包。从一开始就为生产环境而优化

混合模式: SSG 和 SSR
在一个项目中同时支持构建时预渲染页面(SSG)和请求时渲染页面(SSR)

增量静态生成
在构建之后以增量的方式添加并更新静态预渲染的页面。

支持 typescript
自动配置并编译 TypeScript。

快速刷新
快速、可靠的实时编辑体验,已在 Facebook 级别的应用上规模上得到验证。

基于文件系统的路由
每个 pages 目录下的组件都是一条路由。

api 路由
创建 API 端点(可选)以提供后端功能。

内置支持CSS
使用 CSS 模块创建组件级的样式。内置对 Sass 的支持。

代码拆分和打包
采用由 Google Chrome 小组创建的、并经过优化的打包和拆分算法

创建Next.js项目

手动创建Next.js项目


mkdir nextDemo  //创建项目
npm init            //初始化项目
npm i react react-dom next --save           //添加依赖

在package.JSON中添加快捷键命令


 "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "dev" : "next" ,
    "build" : " next build",
    "start" : "next start"
  },

创建pages文件夹和文件

在项目根目录创建pages文件夹并在pages文件夹中创建index.js文件


function Index(){
    return (
        <div>Hello Next.js</div>
    )
}
export default Index

运行项目


npm run dev

creact-next-app快速创建项目

create-next-app可以快速的创建Next.js项目,它就是一个脚手架。


npm install -g create-next-app  //全局安装脚手架
create-next-app nextDemo  //基于脚手架创建项目
cd nextDemo
npm run dev  //运行项目

目录结构介绍:

  • components文件夹: 这里是专门放置自己写的组件的,这里的组件不包括页面,指公用的或者有专门用途的组件。
  • node_modules文件夹:Next项目的所有依赖包都在这里,一般我们不会修改和编辑这里的内容。
  • pages文件夹:这里是放置页面的,这里边的内容会自动生成路由,并在服务器端渲染,渲染好后进行数据同步。
  • static文件夹: 这个是静态文件夹,比如项目需要的图片、图标和静态资源都可以放到这里。
  • .gitignore文件: 这个主要是控制git提交和上传文件的,简称就是忽略提交。
  • package.json文件:定义了项目所需要的文件和项目的配置信息(名称、版本和许可证),最主要的是使用npm install 就可以下载项目所需要的所有包。

Pages

在 Next.js 中,一个 page(页面) 就是一个从 .js、jsx、.ts 或 .tsx 文件导出(export)的React 组件 ,这些文件存放在 pages 目录下。每个 page(页面)都使用其文件名作为路由(route)。

如果你创建了一个命名为 pages/about.js 的文件并导出(export)一个如下所示的 React 组件,则可以通过 /about 路径进行访问。

路由

页面跳转一般有两种形式,第一种是利用标签<Link>,第二种是用js编程的方式进行跳转,也就是利用Router组件

Link


import React from 'react'
import Link from 'next/link'
const Home = () => (
  <>
    <div>我是首页</div>
    <div><Link href="/pageA" rel="external nofollow"  rel="external nofollow"  rel="external nofollow" ><a>去A页面</a></Link></div>
    <div><Link href="/pageB" rel="external nofollow" ><a>去B页面</a></Link></div>

  </>
)

export default Home

注意:用<Link>标签进行跳转是非常容易的,但是又一个小坑需要你注意一下,就是他不支持兄弟标签并列的情况。


 //错误写法
 <div>
  <Link href="/pageA" rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >
    <span>去A页面</span>
    <span>前端博客</span>
  </Link>
</div>

//正确写法
<Link href="/pageA" rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >
  <a>
    <span>去A页面</span>
    <span>前端博客</span>
  </a>
</Link>

Router


import Router from 'next/router'

<button onClick={()=>{Router.push('/pageA')}}>去A页面</button>

参数传递与接收

在Next.js中只能通过通过query(?id=1)来传递参数,而不能通过(path:id)的形式传递参数。


import Link from 'next/link'

//传递
<Link href="/blogDetail?bid=23" rel="external nofollow" ><a>{blog.title}</a></Link>

    
    
//blog.js
import { withRouter} from 'next/router'
import Link from 'next/link'

const BlogDetail = ({router})=>{
    return (
        <>
            <div>blog id: {router.query.name}</div>
            <Link href="/" rel="external nofollow" ><a>返回首页</a></Link>
        </>
    )
}
//withRouter是Next.js框架的高级组件,用来处理路由用的
export default withRouter(BlogDetail)



import Router from 'next/router'

<button onClick={gotoBlogDetail} >博客详情</button>

function gotoBlogDetail(){
    Router.push('/blogDetail?bid=23')
}

//object 形式
function gotoBlogDetail(){
    Router.push({
        pathname:"/blogDetail",
        query:{
            bid:23
        }
    })
}

<Link href={{pathname:'/blogDetail',query:{bid:23}}><a>博客详情</a></Link>

动态路由


pages/post/[pid].js
route : /post/abc  -->  query : { "pid": "abc" }


pages/post/[pid]/[comment].js
route : /post/abc/a-comment  -->  query : { "pid": "abc", "comment": "a-comment" }

钩子事件

利用钩子事件是可以作很多事情的,比如转换时的加载动画,关掉页面的一些资源计数器.....


//路由发生变化时
Router.events.on('routeChangeStart',(...args)=>{
    console.log('1.routeChangeStart->路由开始变化,参数为:',...args)
})

//路由结束变化时
Router.events.on('routeChangeComplete',(...args)=>{
    console.log('routeChangeComplete->路由结束变化,参数为:',...args)
})

//浏览器 history触发前
Router.events.on('beforeHistoryChange',(...args)=>{
    console.log('3,beforeHistoryChange->在改变浏览器 history之前触发,参数为:',...args)
})

//路由跳转发生错误时
Router.events.on('routeChangeError',(...args)=>{
    console.log('4,routeChangeError->跳转发生错误,参数为:',...args)
})



Router.events.on('hashChangeStart',(...args)=>{
    console.log('5,hashChangeStart->hash跳转开始时执行,参数为:',...args)
})

Router.events.on('hashChangeComplete',(...args)=>{
    console.log('6,hashChangeComplete->hash跳转完成时,参数为:',...args)
})

获取数据

getStaticProps

构建时请求数据

在build阶段将页面构建成静态的html文件,这样线上直接访问HTML文件,性能极高。

使用getStaticProps方法在build阶段返回页面所需的数据。
如果是动态路由的页面,使用getStaticPaths方法来返回所有的路由参数,以及是否需要回落机制。


// posts will be populated at build time by getStaticProps()
function Blog({ posts }) {
  return (
    <ul>
      {posts.map((post) => (
        <li>{post.title}</li>
      ))}
    </ul>
  )
}

// This function gets called at build time on server-side.
// It won't be called on client-side, so you can even do
// direct database queries. See the "Technical details" section.
export async function getStaticProps(context) {
  // Call an external API endpoint to get posts.
  // You can use any data fetching library
  const res = await fetch('https://.../posts')
  const posts = await res.json()

  // By returning { props: { posts } }, the Blog component
  // will receive `posts` as a prop at build time
  return {
    props: {
      posts,
    },
  }
}

export default Blog

getServerSideProps

每次访问时请求数据

页面中export一个async的getServerSideProps方法,next就会在每次请求时候在服务端调用这个方法。

  • 方法只会在服务端运行,每次请求都运行一边getServerSideProps方法
  • 如果页面通过浏览器端Link组件导航而来,Next会向服务端发一个请求,然后在服务端运行getServerSideProps方法,然后返回JSON到浏览器。

function Page({ data }) {
  // Render data...
}

// This gets called on every request
export async function getServerSideProps(context) {
  // Fetch data from external API
  const res = await fetch(`Https://.../data`)
  const data = await res.json()

  // Pass data to the page via props
  return { props: { data } }
}

export default Page

CSS支持

添加全局样式表

要将样式表添加到您的应用程序中,请在 pages/_app.js 文件中导入(import)CSS 文件。
在生产环境中,所有 CSS 文件将自动合并为一个经过精简的 .css 文件。
你应该 只在 pages/_app.js 文件中导入(import)样式表。
从 Next.js 9.5.4 版本开始,你可以在应用程序中的任何位置从 node_modules 目录导入(import) CSS 文件了。
对于导入第三方组件所需的 CSS,可以在组件中进行。

添加组件级CSS


[name].module.css
//login.module.css
.loginDiv{
    color: red;
}

//修改第三方样式
.loginDiv :global(.active){
    color:rgb(30, 144, 255) !important;
}

import styles from './login.module.css'
<div className={styles.loginDiv}/>

Next.js 允许你导入(import)具有 .scss 和 .sass 扩展名的 Sass 文件。 你可以通过 CSS 模块以及 .module.scss 或 .module.sass 扩展名来使用组件及的 Sass


npm i sass --save

如果要配置 Sass 编译器,可以使用 next.config.js 文件中的 sassOptions 参数进行配置。


const path = require('path')

module.exports = {
  sassOptions: {
    includePaths: [path.join(__dirname, 'styles')],
  },
}

CSS-in-JS

可以使用任何现有的 CSS-in-JS 解决方案。 最简单的一种是内联样式:


<p style={{ color: 'red' }}>hi there</p>

使用 styled-jsx 的组件就像这样


function HelloWorld() {
  return (
    <div>
      Hello world
      <p>scoped!</p>
      <style jsx>{`
        p {
          color: blue;
        }
        div {
          background: red;
        }
        @media (max-width: 600px) {
          div {
            background: blue;
          }
        }
      `}</style>
      <style global jsx>{`
        body {
          background: black;
        }
      `}</style>
    </div>
  )
}

export default HelloWorld

自定义Header


<Head>
    <title>技术胖是最胖的!</title>
    <meta charSet='utf-8' />
</Head>

到此这篇关于Next.js入门使用教程的文章就介绍到这了,更多相关Next.js入门内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Next.js入门使用教程

本文链接: https://www.lsjlt.com/news/130490.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Next.js入门使用教程
    目录简介创建Next.js项目 手动创建Next.js项目creact-next-app快速创建项目 Pages 路由 Link Router 参数传递与接收 动态路由 钩子事件 获...
    99+
    2022-11-12
  • Next.js的使用教程
    本篇内容主要讲解“Next.js的使用教程”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Next.js的使用教程”吧!目录简介创建Next.js项目手动创建Next.js项目creact-nex...
    99+
    2023-06-20
  • MQTT.js入门使用教程
    目录简介安装使用 npm 或 yarn 安装使用 CDN 安装全局安装使用简单例子命令行API 介绍mqtt.connect([url], options)Client 事件Clie...
    99+
    2023-05-16
    MQTT.js 入门 MQTT.js 入门教程 MQTT.js使用
  • Android Studio 使用入门教程
    作者:禅与计算机程序设计艺术 1.简介 近年来,移动端应用数量急剧增加,占据了智能手机市场绝大多数份额,应用开发者也需要具备较高的编程能力和素质。相比于传统开发流程,采用Android系统带来的开源...
    99+
    2023-10-21
    大数据 人工智能 语言模型 Java Python 架构设计
  • dedecms 初级入门使用教程
    一:dedecms安装步骤: 1.配置虚拟路径:在httpd.conf中查找DocumentRoot,修改两处: #DocumentRoot "D:/Apache Group/Apache2/htdocs&qu...
    99+
    2022-06-12
    dedecms 入门使用教程
  • SQL 入门教程:使用函数
    目录一、文本处理函数二、日期和时间处理函数三、数值处理函数请参阅 目录汇总:SQL 入门教程:面向萌新小白的零基础入门教程 大多数 SQL 实现支持以下类型的函数。 用于处理文本字符串(如删除或填充值,转换值为大写或小写)的文本函数。 ...
    99+
    2017-06-27
    SQL 入门教程:使用函数
  • ECMAScript6入门教程
    目录你的浏览器支持ES吗?ES 6 新特性汇总(一图全览)1. let、const 和 block 作用域2. 箭头函数(Arrow Functions)3. 函数参数默认值4. S...
    99+
    2022-11-13
  • maven3 入门教程
    Maven库: http://repo2.maven.org/maven2/ Maven依赖查询: http://mvnrepository.com/ Maven常用命令:  1. 创建Maven的普通java项目:  ...
    99+
    2023-01-31
    入门教程
  • Flask 入门教程
    Flask 入门教程 一、Flask简单使用 1、准备环境 硬件:Windows 7+python 3.6+安装软件:pycharm安装(社区版)、python环境安装 2、简单的Flask应用 本地...
    99+
    2023-10-07
    flask python 后端
  • Navicat入门教程
    本篇内容主要讲解“Navicat入门教程”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Navicat入门教程”吧!一、 连接使用 1.1 连接数据库打...
    99+
    2022-10-18
  • node.js入门教程
    Node是个啥?   写个东西还是尽量面面俱到吧,所以有关基本概念的东西我也从网上选择性的拿了些下来,有些地方针对自己的理解有所改动,对这些概念性的东西有过了解的可选择跳过这段。   1.Node 是一个服...
    99+
    2022-06-04
    入门教程 node js
  • Jmeter入门教程
    目录一、下载二、安装三、运行四、一个简单的压测实例五、如何查看系统负载何性能瓶颈jemter简介 jmeter是apache公司基于java开发的一款开源压力测试工具,体积小,功能全...
    99+
    2022-11-12
  • HTML5 入门教程
    本篇内容主要讲解“HTML5 入门教程”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“HTML5 入门教程”吧!JavaScript作为一种弱类型语言,最大的特点就是动态类型。也就是说不用提前声明...
    99+
    2023-06-09
  • ECharts入门教程
    Echart 官网:https://echarts.apache.org/zh/index.html下载页面:https://echarts.apache.org/zh/downlo...
    99+
    2022-11-13
  • IPv6入门教程
    本篇文章主要从基础概念、IPv6的相关网络工具、关于移动应用在IPv6和IPv4网络环境中自动降级机制的研究等三个方面介绍了IPv6的入门教程。前言众所周知,32位的IPv4地址已经基本耗尽(这里的耗尽只是说的分配完了,实际上有相当一部分并...
    99+
    2023-06-03
  • Lighttpd入门教程
    Lighttpd入门教程 概述入门教程安装配置静态文件服务动态文件服务 虚拟主机SSL启动服务器日志模块总结lighthttpd使用场景和原理使用场景原理 概述 Lightt...
    99+
    2023-09-04
    服务器 linux ubuntu
  • Android入门之ScrollView的使用教程
    目录介绍高度需要注意的点例子讲解activity_main.xmlMainActivity.java介绍 ScrollView(滚动条),它有两种“滚动条”:...
    99+
    2022-11-13
    Android ScrollView使用 Android ScrollView
  • Android入门之Fragment的使用教程
    目录简介Fragment是什么课程目标项目结构全局静态常量colors.xmlstrings.xml项目中用到的图片用于定义4个按钮按下去和没有按下去时状态的Selector XML...
    99+
    2022-12-15
    Android Fragment使用 Android Fragment
  • linux中gdb的入门使用教程
    前言 gdb是linux下非常好用的一个调试工具,虽然它是命令行模式的调试工具,但是它的功能强大到你无法想象,这里简单介绍下gdb的使用方法,需要的朋友们下面来一起看看详细的介绍吧。 断点 在代码的指定位置中断,使程序...
    99+
    2022-06-04
    linux系统下gdb使用 linux中gdb命令 linux中gdb
  • Burpsuite入门及使用详细教程
    目录1、简介2、标签3、操作1、简介 Burp Suite是用于攻击web应用程序的集成平台。它包含了许多工具,并为这些工具设计了许多接口,以促进加快攻击应用程序的过程。所有的工具都...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作