Next.js是一个基于React实现的服务端渲染框架,github地址为next.js。javascript
使用Next.js实现服务端渲染是一件很是简单的事,在这里,你彻底能够不用本身去写webpack等配置,Next.js全都帮你作了。本文先从简单地基础概念开始,一步一步带你们认识Next.js。css
先初始化咱们的项目目录结构:java
mkdir learn-next cd learn-next npm init -y npm install react react-dom next -S mkdir pages
能够看到,咱们最后一步的时候建立了一个命名为pages的文件夹,这是由于Next.js采用的是文件系统做为API,每个放在pages中的文件都会映射为一个路由,路由名称与文件名相同。node
打开package.json文件,配置咱们的项目启动命令react
{ "scripts": { "dev": "next" } }
而后在命令行中启动咱们的项目:webpack
npm run dev
打开http://localhost:3000,能够看到Next.js给咱们报了404,这是由于咱们还没写任何内容。git
在pages目录下新建index.js,输入如下内容:github
export default () => ( <h1>Hello Next.js</h1> )
这时候,咱们能够看到Next.js已经把咱们的内容渲染出来了,以下所示:web
页面间跳转是很正常的事,所以,Next.js为咱们准备了Link这个高阶组件,用于页面导航。咱们先新建一个about.js文件express
export default () => ( <h1>This is about page</h1> )
而后将咱们的index.js更改成:
import Link from 'next/link' export default () => ( <div> <Link href="/about" > <a>About Page</a> </Link> <h1>Hello Next.js</h1> </div> )
咱们的组件不可能都是孤立的,组件间复用是很常见的事,例如页面的头部,底部,导航条等等,所以咱们能够在根目录下新建一个components目录用于存放共用的组件。
新建一个Header.js文件
import Link from 'next/link' const linkStyle = { marginRight: 15 } export default () => ( <div> <Link href="/"> <a style={linkStyle}>Home</a> </Link> <Link href="/about"> <a style={linkStyle}>About</a> </Link> </div> )
新建一个Layout.js文件
import Header from './Header' const layoutStyle = { margin: 20, padding: 20, border: '1px solid #DDD' } export default (props) => ( <div style={layoutStyle}> <Header /> {props.children} </div> )
更改咱们的pages/index.js文件
import Layout from '../components/Layout.js' export default () => ( <Layout> <h1>Hello Next.js</h1> </Layout> )
打开http://localhost:3000,能够看到咱们的共用组件生效了:
假设有一个post页面,该页面接收一个id,并将该id展现出来,那么怎么作呢。
在pages下新建post.js文件,内容以下:
import Layout from '../components/Layout.js' export default (props) => ( <Layout> <h1>{props.url.query.id}</h1> <p>This is the post page.</p> </Layout> )
如上所示:咱们从url.query.id
中拿到页面传过来的id
那么怎么把id从index页面传过去呢,回到pages/index.js页面,代码更改以下:
import Layout from '../components/Layout.js' import Link from 'next/link' const PostLink = (props) => ( <li> <Link as={`/p/${props.id}`} href={`/post?id=${props.id}`}> <a>{props.id}</a> </Link> </li> ) export default () => ( <Layout> <h1>My Blog</h1> <ul> <PostLink id="hello-nextjs" /> <PostLink id="learn-nextjs" /> <PostLink id="deploy-nextjs" /> </ul> </Layout> )
在上面的代码中,咱们在Link标签中使用了as属性,它的做用是更改路由的名称,当咱们点击"learn-nextjs"时,咱们能够看到,地址栏的地址显示为http://localhost:3000/p/learn-nextjs
上面的代码实际上是有问题的,这只适合在浏览器端进行导航,可是当咱们在http://localhost:3000/p/learn-nextjs下刷新页面时,会看到服务器给咱们报了404,所以咱们须要同步适配一下服务端的路由。
咱们选用express来做为服务端框架,固然你也可使用koa。
npm install express -S
在根目录下新建server.js文件,代码以下:
const express = require('express') const next = require('next') const dev = process.env.NODE_ENV !== 'production' const app = next({ dev }) const handle = app.getRequestHandler() app.prepare() .then(() => { const server = express() server.get('/p/:id', (req, res) => { const actualPage = '/post' const queryParams = { id: req.params.id } app.render(req, res, actualPage, queryParams) }) server.get('*', (req, res) => { return handle(req, res) }) server.listen(3000, (err) => { if (err) throw err console.log('Ready on http://localhost:3000') }) }) .catch((ex) => { console.error(ex.stack) process.exit(1) })
更改package.json中咱们的项目启动方式:
{ "scripts": { "dev": "node server.js" } }
这时候刷新页面,能够看到咱们的页面也被正确渲染了。
本篇教程到此结束,后面会跟你们介绍Next.js的服务端渲染(ssr)及css in js以及部署相关的一下概念及示例代码。