Next.js 初试


title: next.js入门
tag:next.js, react


序章

服务端渲染

  • 服务端渲染(SSR: Server Side Rendering),html页面由服务器渲染好,客户端请求的是完整的html页面。
  • egg,php,jsp等都是良好的服务端渲染技术。
优点
  • seo优化。
  • 优化首屏加载速度:相比加载单页应用,只需加载当前页面内容,不用加载大量的js。
缺点
  • 线上排查bug不能用浏览器控制台查看数据流动。
  • 不是前后端分离的最佳实践。

SEO

  • 搜索引擎优化(SEO:Search Engine Optimization),利用搜索引擎的规则提高网站在有关搜索引擎内的自然排名。
  • 为网站提供生态式的自我营销解决方案,让其在行业内占据领先地位,获得品牌收益。
  • SEO包含站外SEO和站内SEO两方面。
  • 从网站结构、内容建设方案、用户互动传播、页面等角度进行合理规划,从搜索引擎获得更多的免费流量。

安装

  • 基于react,所以需要同时安装react和react-dom
yarn next react react-dom --save
  • 编写package.json中的script字段
{
  "scripts": {
    "dev": "next",
    "build": "next build",
    "start": "next start"
  }
}

目录结构

默认情况下:

  • 每个.js文件是一个路由。
  • ./page是服务器的渲染索引
  • ./static中的文件映射到/static/路由

编写Hello World页面

  • 编写一个无状态的页面组件
// ./page/index.js

var num = 1
num ++ 
console.log(num)

function click () {
  console.log(num++)
}

export default () => (
  <div onClick={click}>Hello Next.js</div>
)

开发

yarn dev 
yarn dev -p 8080 // 指定端口号
  • 运行以上hello world页面可以看出,num在服务端终端和浏览器控制台都输出一次,单个js文件中的全局代码是服务端和客户端公用的代码,一次在全局中处理纯服务器逻辑可能会出错,反之亦然。

  • 点击div可以打印出num,并且递增,符合react组件逻辑。

获取数据和组件生命周期

  • 服务端渲染一个常见的业务场景:获取数据库(或其他服务器)数据,数据返回后再将其插入页面中,生成完整页面返回给客户端。
  • 前面说过这个逻辑不能写在全局中,因为这里的代码服务器和客户端都会运行,并且这是一个异步过程,肯定要在一个异步函数、或回调函数中运行的逻辑。

getInitialProps

  • 页面加载时,改方法只会在服务端执行一次。
  • 该方法只有在路由切换时,客户端的才会被执行。
  • 改方法的返回值已props注入组件,在客户端运行时可以获取数据
  • getInitialProps方法的参数的属性包含:
    pathname - URL 的 path 部分
    query - URL 的 query 部分,并被解析成对象
    asPath - 显示在浏览器中的实际路径(包含查询部分),为String类型
    req - HTTP 请求对象 (只有服务器端有)
    res - HTTP 返回对象 (只有服务器端有)
    jsonPageRes - 获取数据响应对象 (只有客户端有)
    err - 渲染过程中的任何错误

import {Component} from 'react'

export default class App extends Component {
  static async getInitialProps(obj) {
    console.log(obj)
    console.log('where called')
    var fetch = (url) => {
      return new Promise((res, rej) => {
        res('获取数据然后渲染')
      })
    }

    let response = await fetch('/static/demo.json')
    console.log(response)
    return {response}
  }

  state = {
    num: 1
  }

  add = () => {
    this.setState((state) => {
      return state.num++
    })
  }

  render () {
    return (
      <div>
        <div>{this.props.response}</div>
        <div>{this.state.num}</div>
        <button onClick={this.add}>++</button>
      </div>
    )
  }
}
  • 以上代码运行后,getInitialProps方法在服务器执行了,在服务端模拟了一次fetch请求,数据返回后渲染页面。
  • 可以在浏览器右键选择“查看网页源代码”,查看从服务器传到客户端初始的html页面的内容。
    以下是主要部分,可以看出数据是被预先渲染好的。
<div>获取数据然后渲染</div><div>1</div><button>++</button></div></div>

兼容性

Next.js 支持 IE11 和所有的现代浏览器使用了@babel/preset-env。为了支持 IE11,Next.js 需要全局添加Promise的 polyfill。有时你的代码或引入的其他 NPM 包的部分功能现代浏览器不支持,则需要用 polyfills 去实现。

  • polyfills默认配置加入。
  • 开发环境中使用es6的新api,Set等,这些新的api是造成低版本浏览器无法运行的根本原因。
  • next.js可以作为提高react应用性能,优化react应用首屏加载速度的解决方案,时单页应用做seo优化成为可能。
  • next.js提供的脚手架,开发环境搭建简单,开发有‘热更新’加持,开发极为舒服。
  • react本来就是构建复杂应用的框架,其大量使用es6特性,兼容性本来就差,next.js不是提高react应用兼容性的解决方案。

原文链接

【完】 喜欢的欢迎 star && issue

思考ing

作者简介:叶茂,芦苇科技web前端开发工程师,代表作品:口红挑战网红小游戏、服务端渲染官网、微信小程序粒子系统。擅长网站建设、公众号开发、微信小程序开发、小游戏、公众号开发,专注于前端领域框架、交互设计、图像绘制、数据分析等研究。 一起并肩作战: yemao@talkmoney.cn 访问 www.talkmoney.cn 了解更多

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,125评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,293评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,054评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,077评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,096评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,062评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,988评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,817评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,266评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,486评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,646评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,375评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,974评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,621评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,642评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,538评论 2 352

推荐阅读更多精彩内容

  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,472评论 1 45
  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,748评论 1 92
  • 前端开发面试题 面试题目: 根据你的等级和职位的变化,入门级到专家级,广度和深度都会有所增加。 题目类型: 理论知...
    怡宝丶阅读 2,578评论 0 7
  • 因为工作需要,我被赶鸭子上架,来学习学习流行的服务端渲染。闻名已久,如雷贯耳的,能解决单页应用的缺点,但是又没有其...
    楠楠_c811阅读 972评论 0 0
  • 最简单的服务端渲染框架-Next.js 快速入门 Next.js是一个用于React应用的极简的服务端渲染框架。框...
    cabber阅读 5,904评论 1 6