- 1. Next 中常见文件的作用
- 2. Next 路由传递参数
- 3. 自定义APP作用
- 4. 自定义 Document
- 5. 异步组件的加载, 等到了调到它的地方再加载
- 6. Next 集成 redux 需要考虑
- 7. Next 流程
- 8. Next 集成redux
- 9.
withRouter
- 10.
next_data
属性 - 11. 关于
getInitialProps
方法 - 12. getInitialProps入参对象的属性如下:
- 13. SSR项目引入组件,提示
window
未定义
# 1. Next 中常见文件的作用
next.config.js
:next.js
的配置文件_app.js
:覆盖next
的app.js
@zeit/next-css
:next
中加载css
# 2. Next 路由传递参数
Next路由传递参数,只能通过query
(b?id=1
),不能params
(/b/id/1
),但是可以通过路由映射,as='/b/1'
,使URL好看
# 3. 自定义APP作用
- 固定
layout
- 保持一些公用的状态
- 给页面传入一些自定义数据
- 自定义错误处理
注意:自定义App
,必须重写APP的getIntialProps
方法
# 4. 自定义 Document
只有在服务端渲染的时候才会执行
用来修改服务端渲染的文档内容
一般用来配合第三方
css-in-js
方案使用要么不覆盖
Document
的getInitialProps
,要么至少将Document
的getInitialProps
结果返回出去,不要忘了传参ctx
。对于
render
函数也一样,要么不覆盖,要么就要写出Html
、Head
、body
、Main
、NextScript
结构,否则缺失。
不推荐在_document.js
中定义title
,应该在pages
每个页面引入Head
,然后定义title
babel-plugin-styled-components,ssr:true
:客户端和服务端生成的css
名字一样
# 5. 异步组件的加载, 等到了调到它的地方再加载
import dynamic from 'next/dynamic'
const Comp = dynamic(import('components/test'))
异步模块加载的意思是,等到进入某个页面再加载js,而不是一上来全都加载了。
比如在getInitialProps
方法中,const moment = await import('moment')
,然后moment.default...
# 6. Next 集成 redux 需要考虑
- 服务端如何写入数据到
store
- 如何同步服务端的数据到客户端
# 7. Next 流程
# 8. Next 集成redux
- 主要在于
lib/with-redux-store.js
和_app.js
withRedux
包裹 App,其本身也有getInitialProps
法,在此方法中getOrCreateStore
,注意server
端和client
端不一样的逻辑,服务端每次都initializeStore
,防止不同用户共用数据,客户端需要看之前有没有
# 9. withRouter
- 用
withRouter
包裹,就可以在组件中获得router
对象,其上有pathnane
、query
等属性 withRouter
包裹在connect
外面,否则与withRouter
的shouldComponentUpdate
冲突,引起错误。
# 10. next_data
属性
next
服务端渲染的时候,getInitialProps
把数据放在html
的next_data
属性中,在客户端第一次渲染的时候不会重新请求,从而保证数据同步
# 11. 关于getInitialProps
方法
Next.js 在做服务器端渲染的时候,页面对应的 React 组件的 getInitialProps
函数被调用,异步结果就是“脱水”数据的重要部分,除了传给页面 React 组件完成渲染,还放在内嵌 script
的 __NEXT_DATA__
中。
在浏览器端渲染的时候,不会去调用 getInitialProps
,直接通过 __NEXT_DATA__
中的“脱水”数据来启动页面 React 组件的渲染。这样一来,如果 getInitialProps
中有调用 API 的异步操作,只在服务器端做一次,浏览器端就不用做了。
# 11.1. 那么,getInitialProps
什么时候会在浏览器端调用呢?
当在单页应用中做页面切换的时候,比如从 Home
页切换到 Product
页,这时候完全和服务器端没关系,只能靠浏览器端自己了,Product
页面的 getInitialProps
函数就会在浏览器端被调用,得到的数据用来开启页面的 React 原生生命周期过程。
# 12. getInitialProps入参对象的属性如下:
pathname // URL 的 path 部分
query // URL 的 query 部分,并被解析成对象
asPath // 显示在浏览器中的实际路径(包含查询部分),为String类型
req // HTTP 请求对象 (只有服务器端有)
res // HTTP 返回对象 (只有服务器端有)
jsonPageRes // 获取数据响应对象 (只有客户端有)
err // 渲染过程中的任何错误
# 13. SSR项目引入组件,提示window
未定义
- 用动态导入,
nextjs
的dynaimic
- 先定义变量,判断
window
存在的时候才引入。实践证明,这种方法好用,比如braft-editor
← Mocha preset-env →