安装

跟着官网的文档安装项目

路由

通过文件夹创建路由
如下面的about页面,nextjs就会自动创建/about的路由,路由对应的组件是/about/index.jsx

/pages/_app.js

项目的主要入口,在这里引入全局的样式,类似于单页面项目的/public/index.html

默认导出一个react组件

这里是demo

import { useRouter } from 'next/router'
import Head from 'next/head'
function MyApp(props) {// 在这里无法拿到路由信息const { Component, pageProps, menuData = [], isMobileByNode } = propsconst location = useRouter()// 第一次加载会在服务端执行拿到正确的isMobileByNode,跳转页面之后就没有了,所以这里在前端在判断一次const [isMobile, setIsMobile] = useState(isMobileByNode)useEffect(() => {setIsMobile(devices())}, [])// returnreturn (<><Head><!-- 页面的head里面的元素放这里 --><metaname='viewport'content='width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0'/></Head>{// 设置不同页面的meta信息--由于我每个页面的keywords和descrition不一样getHead(location.pathname)}<!-- 由于获取屏幕宽度需要在dom onloade之后,在之前页面会出现样式错乱的问题,所以在onload之后再展示主要内容 --><div style={hasClientLoaded ? {} : {opacity: '0'}}><!-- context也可以放这里 --><HomeDataProvider>{isMobile ? (<BasicMobileLayout menuData={menuData}><Component {...pageProps} isMobile={isMobile} /></BasicMobileLayout>) : (<BasicLayout menuData={menuData}><Component {...pageProps} isMobile={isMobile} /></BasicLayout>)}</HomeDataProvider></div></>)
}MyApp.getInitialProps = async context => {const res = await apirequest()const agent = context?.ctx?.req?.headers?.['user-agent']// 通过request请求来判断是否是手机端发来的请求const isMobileByNode = getIsMobileByUserAgent(agent)// api请求放这里--在服务端发起请求,通过把数据返回到MyApp的props中,get页面路由时也会把这些数据渲染到html文件中,也有助于seoreturn { menuData: res }
}export default MyApp

路由信息

用这个对象去跳转和获取url上的信息

import { useRouter } from 'next/router'const NoData = () => {const location = useRouter();// qeury// location.query// 跳转location.push('/about')// 后退location.back()return (<div>// ...</div>)
}

页面级–请求数据–渲染到html字符串中–getServerSideProps

只能在pages文件夹中使用

像在初始渲染时就拿到数据,需要在页面组件处导出名为getServerSideProps的async函数,如果不需要接口数据做seo,也可以在页面加载后使用ajax请求

import { useRouter } from 'next/router'export async function getServerSideProps(context) {// context为路由信息const query = context.queryconst id = query.idconst res = await apirequestxxx(id)return {// 信息可以在组件的props中拿到props: {detailData: res.data}}
}const NoData = ({detailData}) => {return (<div>// ...</div>)
}

一些常见的问题

document/window为undefiend

需要切换思想,在node端是拿不到window对象的,nextjs本质是:

  1. 在服务端执行一次组件
  2. 生成对应的html字符串,这时候如果有window等客户端的对象会报错(可以页面unload中执行就能避免报错,比如react的useeffect中去执行某些操作)
  3. 执行对应的getServerSideProps函数,在服务端请求数据回来,放到组件模板中
  4. 服务端渲染好页面之后响应客户端的请求,返回解析好的html字符串

ssr和ssg

配合cdn的缓存,哇,性能真的很好

build和start

运行next build命令会生成一个.next的文件夹,build之后再next start部署相关的服务,需要注意的是,nextjs部署的默认端口是3000,如果需要修改端口号,看下面!

第一次访问页面会很慢,原因是nextjs还没有生成对应的缓存文件

export命令

nextjs会导出静态的html文件,为了更好的缓存
can not be exported问题:在page中使用到了getServerSideProps时就无法导出(本质是在服务端执行getServerSideProps函数,如果导出为静态资源了,getServerSideProps就无法执行了),推荐纯静态页面再使用export

运行(部署)到对应的端口

修改package.json,在对应命令后面加-p 8010 其中8010是对应的端口号

"build:prod": "cross-env REACT_APP_ENV=prod next build",
"start": "next start -p 8010",

环境变量

比如说我的build命令是下面这样的配置:

"build:prod": "cross-env REACT_APP_ENV=prod next build",

这里我用到了cross-env,但是build的时候REACT_APP_ENV不会被加入到环境变量里面(页面中拿不到REACT_APP_ENV),因为nextjs会自动排除自己不认识的环境变量(为了防止意料之外的bug),那么需要在next.config.js中加配置

const nextConfig = {reactStrictMode: true,swcMinify: true,sassOptions: {},// 环境变量env: {REACT_APP_ENV: process.env.REACT_APP_ENV}
}module.exports = nextConfig

这样就可以在js文件中获取到了:

console.log(process.env.REACT_APP_ENV)

Nextjs 不完全入坑指南相关推荐

  1. 发布开源框架到CocoaPods入坑指南

    个人原文博客地址: 发布开源框架到CocoaPods入坑指南 在开发过程中一定会用到一些第三方框架, 只要安装了CocoaPods, 然后通过pod install命令, 就可以集成框架到项目中了 可 ...

  2. python这个软件学会能做什么工作-学会Python真的有高收入?盯,请查收这份入坑指南...

    学会Python真的有高收入?盯,请查收这份入坑指南 2018-10-10 20:51:00 567点赞 6312收藏 186评论 小编注:想获得更多专属福利吗?金币加成.尊享众测.专属勋章.达人福利 ...

  3. python web-python web入坑指南

    原标题:python web入坑指南 Invest regularly in your knowledge portfolio. Make learning a habit. 自学python web ...

  4. 旧android 4 平板,如今的安卓平板值不值得买:小米平板4入坑指南

    如今的安卓平板值不值得买:小米平板4入坑指南 2018-08-04 07:30:40 29点赞 25收藏 42评论 购买理由 三年前入坑小米平板2,在当年的安卓平板环境里,小米平板还是一款十分值得购买 ...

  5. api 微信内置浏览器js_多端开发框架uni-app入坑指南,一套代码适用微信、头条等小程序...

    前言 hello 小伙伴们,现在我已经正式入坑 uni-app 了.uni-app 已经发布好几个月了,期间也是踩坑无数,但是官方秉承着不抛弃不放弃的精神,积极解决开发者的各种简单的.复杂的问题,在此 ...

  6. 微信小程序继续入坑指南

    微信小程序继续入坑指南 wxml 类似于html 感觉和ejs灰常的相似 数据绑定 js Page({data: {message: "hello world"} }) wxml ...

  7. Rust 入坑指南:鳞次栉比 | CSDN 博文精选

    作者 | Jackyzhe 责编 | 屠敏 出品 | CSDN(ID:CSDNnews) 很久没有挖Rust的坑啦,今天来挖一些排列整齐的坑.没错,就是要介绍一些集合类型的数据类型."鳞次栉 ...

  8. uniapp调用c语言方法,uni-app 入坑指南-web开发

    编辑推荐: 本文重点介绍了 uni-app 入坑指南,方便大家更好的了解 uni-app 本篇只讲述 uni-app,不与其他类似框架进行对比 本文来自于博客园,由火龙果软件Alice编辑推荐. 什么 ...

  9. 小白深度学习入坑指南

    小白深度学习入坑指南 小白深度学习入坑指南 写博客的初衷适合的人群 理论篇 说明 数学 CV ML DL 优化 实践篇 linux python 深度学习框架 框架学习 硬件配置 软件环境配置 常见的 ...

最新文章

  1. Libevent使用例子,从简单到复杂
  2. 在eclipse中启动Tomcat访问localhost:8080失败项目添加进Tomcat在webapp中找不到
  3. python风控工具_python-风控模型分析01
  4. lambda python_Python | Lambda和filter()与示例
  5. 计算机网络之网络层:12、网络层设备
  6. [转]PlantUML画类图、流程图、时序图使用详解
  7. jenkins教程_1 简介
  8. 软件著作权提交源代bai码格式_软件著作权使用说明书字体要求-软件著作权提交源代码格式要求...
  9. VAssistX 常用快捷键 (常用好用)
  10. [转]在WPF中打开网页方法总结
  11. 孟岩:参与设计20多个区块链经济系统后,我总结出4个原则和7个陷阱 |区块链捕手
  12. android 更新相册,Android 图片存入系统相册更新显示实例详解
  13. 怎样检测php语法错误,检查php的语法错误
  14. 计算机键盘音乐 卡农,巴赫键盘音乐
  15. es 多索引联合查询_ES 的跨索引查询详细讲解
  16. 生产系统功能目标和组织结构
  17. ossbrowser
  18. c++ sleep函数 linux,sleep()函数 | C/C++程序员之家
  19. 艾恩技术access sql asp
  20. 教 你 如 何 唱 歌

热门文章

  1. EclipsePHP Studio(EPP4)详细安装图文详解
  2. 发泄键盘?养生鼠标?这届程序员这么过双12!
  3. 数据恢复软件设计与实现(一)
  4. CNC模具加工工艺与编程要点
  5. 软件测试工程师到底要不要刷leetcode
  6. GIS地图瓦片之缩放级别原理
  7. php7.0 freetype_php 添加 freetype支持
  8. oracle ORA-01480
  9. 蛋白激酶/磷酸酶 调控信号通路、细胞机制
  10. 有线电视模拟信号基础知识