Next.js学习笔记

这是一个用于生产环境的React 框架,Next.js 为您提供生产环境所需的所有功能以及最佳的开发体验:包括静态及服务器端融合渲染、 支持 TypeScript、智能化打包、 路由预取等功能 无需任何配置。

create-next-app

使用 create-next-app创建新的 Next.js 应用程序,它会自动为你设置所有内容。创建项目,请运行:

npx create-next-app@latest
# or
yarn create next-app

如果你希望使用 TypeScript 开发项目,可以通过 --typescript 参数创建 TypeScript 项目:

npx create-next-app@latest --typescript
# or
yarn create next-app --typescript

安装完成后:

注意:直接运行 run start是不能生效的,需要先run build打包才能start。
生产环境下可以运行 npm run dev 或 yarn dev 来启动开发服务器,访问地址为 http://localhost:3000。
通过 http://localhost:3000 地址访问你的应用程序。
编辑 pages/index.js 文件并在浏览器中查看更新。

页面(Pages)

在 Next.js 中,不需要手动设置路由,一个 page(页面) 就是一个从 .js、jsx、.ts 或 .tsx 文件导出(export)的 React 组件 ,这些文件存放在 pages 目录下。每个 page(页面)都使用其文件名作为路由(route)。
在这里插入图片描述

具有动态路由的页面

Next.js 支持具有动态路由的 pages(页面)。例如,如果你创建了一个命名为 pages/posts/[id].js 的文件,那么就可以通过 posts/1、posts/2 等类似的路径进行访问。

预渲染

默认情况下,Next.js 将 预渲染 每个 page(页面)。这意味着 Next.js 会预先为每个页面生成 HTML 文件,而不是由客户端 JavaScript 来完成。预渲染可以带来更好的性能和 SEO 效果。

每个生成的 HTML 文件都与该页面所需的最少 JavaScript 代码相关联。当浏览器加载一个 page(页面)时,其 JavaScript 代码将运行并使页面完全具有交互性。
注意:这里面的预渲染其实就是服务端渲染,或者是指非客户端渲染。不是预先生成HTML(SSG)的意思。

两种形式的预渲染

Next.js 具有两种形式的预渲染: 静态生成(Static Generation) 和 服务器端渲染(Server-side Rendering)。这两种方式的不同之处在于为 page(页面)生成 HTML 页面的 时机 。

静态生成 (SSG):HTML 在 构建时 生成,并在每次页面请求(request)时重用。
服务器端渲染(SSR):在 每次页面请求(request)时 重新生成 HTML。
在这里插入图片描述

三个和预渲染有关的重要方法:

getStaticProps (Static Generation): Fetch data at build time.
getStaticPaths (Static Generation): Specify dynamic routes to pre-render pages based on data
getServerSideProps (Server-side Rendering): Fetch data on each request

getStaticProps

只要Pages中的文件有export getStaticProps,就认为是SSG

// getStaticProps
// 静态生成,只在打包构建时运行一次
import { GetStaticProps } from 'next'
export const getStaticProps: GetStaticProps = ({params}) => {
  // params参数是来自于getStaticPaths函数的返回结果
  ...
  return {
    props: {...},  // 只能返回这种格式的数据
    revalidate: sec // 每sec秒生成一次,
    nouFound: false // 为true时404
  }
}
getStaticProps几个细节

编译时运行,在用户请求前。dev模式下,在请求时运行
只在服务端/Node.js运行
数据必须和用户无关,和URL参数无关
页面最终会被编译成静态html

SSG应用场景

尽可能使用 静态生成 (带有或不带数据),因为你的所有 page(页面)都可以只构建一次并托管到 CDN 上,这比让服务器根据每个页面请求来渲染页面快得多。

预渲染(SSG):有什么问题?

编译阶段生成HTML,数据变更了怎么办?
HTML和用户/URL参数有关怎么办?
在这里插入图片描述

动态路由的SSG的问题

Dynamic routes 可以匹配近乎是无上限的 pattern,而每一个 pattern 如果在 next build 都要对应到一个页面,这样会产生无上限的 HTML 页面吗?
解决方案:
使用 getStaticPaths 事先定义哪些页面需要产生 HTML 档案。
语法跟 getStaticProps 很像,定义一个async function getStaticPaths ,回传值包含两个 key,分别是 paths 与 fallback。

getStaticPaths

// getStaticPaths
// 静态生成,只在打包构建时运行一次
// 使用于动态路由组件内,根据返回结果生成x.html,需配合getStaticProps函数使用
import { GetStaticPaths } from 'next'
export const getStaticPaths: GetStaticPaths = () => {
  ...
  return {
    paths: [
      {params: {id: '1'}},
      {params: {id: '2'}},
      ...
    ],
    fallback: true or false or blocking
    //最后的数据结果只能返回这种类型的,返回的params会出现在getStaticProps函数的params参数中,
    /* fallback为true时,对于不在paths中的动态路由也可以渲染,如果为false,对于不在paths中的路由,直接输出404 */
  }
}
getStaticPaths使用要点:

编译时运行,在用户请求前
动态路由场景
理解fallback很重要

SSG不适用的处理方案

不适用,即数据变化很快。或者说不适合提前渲染。

1、将“静态生成”与 客户端渲染(CSR) 一起使用:你可以跳过页面某些部分的预渲染,然后使用客户端 JavaScript 来填充它们。

2、使用 服务器端渲染(SSR): Next.js 针对每个页面的请求(eg:/post/1.html)进行预渲染。即用户每次请求的时候,服务端动态生成HTML。

SSR:getServerSideProps

// getServerSideProps
// 服务端渲染,每次页面运行时都会运行一次
// 性能上低于静态生成,更推荐上面的
import { GetServerSideProps } from 'next'
export const getServerSideProps: GetServerSideProps = () => {
  // 使用与上面一致
  ...
  return {
    props: {...}
  }
}

SSR不会在构建时生成静态HTML页面,但会在请求时渲染好再发给服务端,性能没有SSG好,但应用场景更加灵活。

Nextjs编译

yarn build  
# or
npm run build

SSG/SSR 总结

在这里插入图片描述

API开发

在这里插入图片描述

路由跳转——Link组件跳转

import Link from 'next/link'
export default () => {
  <Link href="/about" > 
    {/* href={pathname:"/about/“, query: {key: value} */}
    <a>点击跳转</a> {/* href会自动添加到a标签上 */}
  </Link>

  <Link href="/about" as="/a" > 
    <a>点击跳转</a> {/* 起了个别名,能跳转,且显示跳转到 /a ,但是刷新会404 */}
  </Link>

  <Link href="/about" passHref>
    <img /> {/* 如果子标签没有href属性,需要在Link中添加强制属性 passHref */}
  </Link>

  {/* 还有其他属性:replace: 替换,无法返回;scroll={true/false} 是否跳转后到页面顶部;prefetch:预加载*/}

  {/* Link标签里面也可以放组件,但是必须是React.forwardRef创建的组件 */}
   const NewLink = React.forwardRef((props, ref) => {
    return <a href={props.href} ref={ref}>新标签</a>
  }) 
}

动态路由 &路由参数

<Link href="/file/[id]" as="/file/123"></Link>
<Link href="/file/[...id]" as="/file/123/456"></Link>

router.push('/file/[id]') // "/file/123"
router.push('/file/[...id]') // "/file/123/456"

/* 接收路由参数 */
// [id].tsx
import { useRouter } from 'next/router'
const A = () => {
  const router =  useRouter()
  console.log(router.query) // {id: ''}
  return <a>链接{router.query.id}</a>
}
export default A

// [...id].tsx
import { useRouter } from 'next/router'
const A = () => {
  const router =  useRouter()
  console.log(router.query) // {id: array[]}
  return <a>链接{router.query.id[0]}</a>
}
export default A

关于404页面与路由重定向

import { GetStaticProps } from 'next'

export const getStaticProps: GetStaticProps = () => {
  // 这里data自己设置一个合适的参数就行,return的是重定向操作
  if(!data){
    return {
      notFound: true, //为404页面,只能用true
      redirect: { // 重定向,分开使用
        destination: "/",
        permanent: false,
    }
    }
  }
}

读取文件

读取文件与node中操作差不多,但是在目录路径获取上有一点区别
注意!!!nextjs中无法使用 nodejs的__dirname,用以代替的是process.cwd()`,返回的是项目工程的根目录的绝对路径

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 选取视图的列的内容 @Trim @DbColumn 6 2. 隐藏判断常用的命令 6 3. 判断当前用户是否是“某个组”的成员,然后来显示和隐藏 6 4. 在Lotus Domino 中显示图 6 5. 链接JS文件 6 6. 删除文档的方法 7 7. $$return 域的使用 8 8. 将表单设计为视图或导航器模板 9 9. 为 Web 定制“表单已处理”确认信息 10 10. 定制出错信息 11 11. $$HtmlHead几种常用的技巧 11 12. Domino Designer 模板表 12 13. 角色判断 13 14. 判断文档是否正在被修改 13 15. 在只读的方式下返回($$return 13 16. 刷新表单 14 17. 怎样在文档里存照片? 14 18. 后台lotusscript如何取得前台表单中复选框所选择的项目列表(b/s结构) 15 19. 试图的列公式:附件下载 15 20. 有没有好一点的分页处理代码 16 21. 同一用户重复登录 18 22. Return to sender 19 23. Agent to copy values from 1 form to another 在同一个数据库中进行 22 24. 超越OLE – 通过COM结合MS Office与Notes应用 23 25. 读写关系数据库资料 28 26. 视图---excel,表单---word 32 27. 关于Web上的检索问题 35 28. 如何使用Notes与关系数据库进行信息交互? 37 29. 如何在IE里面实现notes中的 对话框列表? 39 30. LotusDomino环境下编写Web浏览器多数据库检索程序 40 31. WINAPI函数 44 32. 用PowerBuilder访问Lotus Notes数据库 55 33. 如何在表单中加入计数器 58 34. 实现两个数据库间的数据追加 C/S 结构 60 35. 如何防止他人使用旧id和旧口令访问Domino服务器? 61 36. 在你的WEB站点上使用DOMINO群集 62 37. 在你的DOMINO WEB站点中插入.SWF文件 73 38. DOMINO R5的域搜索功能在WEB上的实现 77 39. Display Rich Text fields in a view 86 40. Auto-Launch a file attachment 87 41. Showing a response count without showing the responses 89 42. 常用的几个按钮收集 91 43. 在WEB上从视图删除文档技巧 93 44. 在Domino Designer中使用XML数据 96 45. 在Domino Designer上执行XML 100 46. Show single category view, the next stage 107 47. Checkboxes in a list box 108 48. Formatting a Notes view in HTML table for WEB 109 49. Jump to the end of a view (web agent) 111 50. Disabling actions until a page finishes loading 114 51. Web-based, fully customizable search 115 52. 从复选框中删除文档Deleting selected docs on Web 120 53. Debugging LotusScript Agents 121 54. Displays the contents of the Subject field in the first document in theExamples view. 124 55. Example: GetLastDocument method 125 56. Examples: GetNextDocument method 125 57. Example: GetFirstDocument method 126 58. Examples: FTSearch method 127 59. Examples: DeleteDocument method 128 60. Example: Deleting a document 129 61. Example: Creating a document 129 62. Examples: Locating documents within a view or folder 130 63. Example: Adding a document 135 64. Export to Excel 136 65. 连接ODBC 138 66. 特效 140 67. notes和Excel交换数据 141 68. NOTES的ODBC:(LS:DO) 142 69. Managing JavaScript "popup" windows 第一稿 144 70. HEAD元素使用集锦 147 71. 主页javascript特效19则 148 72. 关于创建、删除、编辑、打开和保存文档的 URL 命令 156 73. Domino URL 命令 158 74. 在打开有下面这段代码的页面时将会跳出一个468x60大小的小窗口 160 75. javascript的容错脚本 161 76. Web search with JavaScript 162 77. 如何防止他人使用旧id和旧口令访问Domino服务器 164 78. Fixing the Domino CheckBox Bug 165 79. Managing JavaScript "popup" windows 172 80. Quick, easy, foolproof field level help 175 81. Quick edit document link 176 82. Managing JavaScript "popup" windows 178 83. Svg: Pie-Eyed 181 84. Recebt Entries 182 85. Xin Calendar Mods 183 86. 答复文档 186 87. 公式语言 187 88. Resuable way to get URL parameters into fields 199 89. JSHeader 使用 201 90. JavaScript 帮助 201 91. Examples: Collecting documents by searching 207 92. 关于DOcumentContext 的属性 209 93. About data types 关于lotus Domino 的数据类型 210 94. CLng function 212 95. Using the DOM to replace "No documents found" 213 96. What you need and want to know about errors 217 97. Processing multiple documents from a view 221 98. Forcing attachments to always download 225 99. ODBCExample: GetValue method 247 100. ODBCResultSet class 248 101. Create a "Login" anchor link 251 102. 分类视图的开发技巧 253 103. 公式语言 255 104. Copy documents from one database to another 267 105. 定制搜索表单 268 106. UserName的属性及使用 275 107. Dynamic Content for Popup Windows 277 108. Shortcut when printing from a Java Agent 278 109. Lotus Script: Write # statement 279 110. Lotus Script: Input # statement 280 111. 使用代理生成 XML 284 112. 使用视图生成 XML 286 113. 执行算术运算 288 114. Keep URLs simple by making them relative 292 115. Quick, easy, foolproof field level help 294 116. Hiding attachments (without noscript tag!) 295 117. Listing search results in groups 296 118. 如何在表单中加入计数器? 300 119. 怎样限制一个WEB用户只有登陆才能使用数据库 302 120. Complete control when printing HTML from an agent 304 121. Simple multi-lingual forms using Domino 306 122. Stop double form submissions 308

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值