Next
Next是react服务端渲染框架。
特点
- 默认服务端渲染
- 自动切分代码
- 基于webpack开发,支持HMR
- 可以集成Express或其他Node server
- 可以自定义Babel和Webpack配置
快速入门
初始化项目
1 | mkdir hello-next |
npm script 添加如下代码
1 | { |
目前没有路由,访问会出现404页面,接下来添加路由。
添加路由
在pages目录下添加index.js(pages/index.js),内容如下:
1 | const Index = () => ( |
React组件要 默认 导出;默认情况下
pages
为路由目录,static
为静态文件目录。
页面导航
添加about页面
1 | export default () => ( |
通过 a
标签可以很容易做到页面跳转,但那是通过服务端导航,不是我们想要的,我们可以通过 next/link
支持客户端导航。
1 | import Link from 'next/link' |
或者
1 | // 包裹按钮 |
Link组件包裹a标签,处理页面跳转,无论是a,button还是其他组件(比如div),只要Link子组件接收onClick属性,都可以跳转。
链接添加样式
1 | // 生效 |
Link是高阶组件,直接收 href等一些其他属性,不支持style。
共享组件
多个页面经常会有公用部分(比如Head),我们可以新建components/Header.js
1 | import Link from 'next/link' |
在首页中导入Head
组件
1 | import Header from '../components/Header' |
组件可以放在任何目录中,除了 pages 目录,pages下的文件跟服务端路由相关。
Layout组件
可以将整个页面框架做成layout组件(components/MyLayout.js),各个页面复用
Layout组件
1 | import Header from './Header' |
index页面
1 | // pages/index.js |
about页面
1 | pages/about.js |
layout除了使用{props.children}
还可以使用属性传值,高级组件的方式。
1 | import withLayout from '../lib/layout' |
1 | // pages/index.js |
动态页面
前边我们实现了静态页面,现在我们通过 query string 实现动态页面。
1 | // pages/index.js |
处理查询参数
1 | import Layout from '../components/MyLayout.js' |
只有default导出的组件才有url
属性
1 | import Layout from '../components/MyLayout.js' |
每个页面都会获取
url
属性,可以props.url.query.title
拿到相关的数据。
自定义路由
Link组件有个as
属性,我们可以通过它自定义路由格式,它会显示在浏览器的地址栏中,但实际下个页面接收的数据还是href属性上的参数。
1 | const PostLink = (props) => ( |
虽然可以自定义客户端路由显示,但是刷新页面可能会404,服务端没有对应的路由。
自定义服务器
安装Express
1 | npm install --save express |
根目录下创建server.js
1 | const express = require('express') |
更新下npm脚本
1 | { |
远程获取数据
可以通过一个异步方法getInitialProps
(同时支持客户端和服务端)来获取远程数据。
安装 isomorphic-unfetch
请求模块
1 | npm install --save isomorphic-unfetch |
修改首页内容
1 | import Layout from '../components/MyLayout.js' |
getInitialProps receives a context object with the following properties:
1 | pathname - path section of URL |
组件样式
给组件添加样式有如下两种方法:
- 外部引入css文件
- css in js (next推荐)
next.js使用 styled-jxs控制局部样式。
1 | import Layout from '../components/MyLayout.js' |
styled-jsx 样式默认不作用于子组件,如果要子组件生效,可以单独定义子组件样式,或者使用全局样式。
styled-jsx
全局样式
1 | <style jsx global>{` |
应用部署
####部署步骤
- build代码
- 启动服务
修改下npm脚本
1 | "scripts": { |
启动多个服务
为了水平扩展,通常会使用多个app实例
1 | //$PORT 为环境变量 |
调用1
2PORT=8000 npm start
PORT=9000 npm start
可以通过 cross-env 设置环境变量。
高阶使用
导出静态网站
在根目录下创建文件next.config.js
1 | module.exports = { |
修改npm脚本
1 | { |
执行导出命令
1 | npm run export |
导入内容会放在out
目录中,可放在任何静态服务器上使用。
☞官网