next.js
# next.js
webpack默认情况下在next.js中受支持,也就是说有错误,next会跟踪错误在显示器中显示,改变错误以后无需加载就可以在webpack的热门模块替换工具在帮组完成此项工作。
运行以下命令创建项目 创建的项目是hello-next
mkdir hello-next
cd hello-next 切换到这个目录下
npm init -y 初始化
npm install --save react react-dom next 下载包 这个地方因为我的是cnpm
mkair pages 创建一个pages文件夹
打开这个项目,找到package.json并且添加脚本

然后运行npm run dev
# 建立next.js应用程序
- git clone https://github.com/arunoda/learnnextjs-demo.git (opens new window)
- cd learnnextjs-demo
- git checkout navigate-between-pages
- npm install
- npm run dev
# 导航link
里面不能设样式,因为他只是一个接受href和其他路由相关道具的包装组件。
链接适用于任何事物,可以放置任何自定义的react组件,设置可以放置div在连接中
组件放置的话需要在连接中的唯一要求就是应该接受一个onclick道具。

组件,不需要将组件放在一个特殊的目录下,唯一的特殊目录是pages,也可以在这个里面创建组件。
# 创建组件的方法
# 第一种
# 第二种
# 第三种
# 第四种
# url
以下两种方法都是表达一个含义,两种方式
URL道具只公开页面的主组件,如果页面使用了其他组件,需要的话要用一下方式传递

# 用路径屏蔽清除URL

以上代码中,着重注意as,他就是会显示我们在浏览器上看到的URL,
我们美化了浏览器上看到的URL

上面两个链接,第一个是原来的,第二个是用了as工具以后显示出来的浏览器URL
所以路由屏蔽来在浏览器中运行的很好,只需要在连接中添加as
# 服务器支持干净的URL
这样以后,服务器路径并没有这个标题,我们只有文章中的ID,所以,在这种情况下,我们将ID设置为服务器端查询字符串的param

从上面的界面拿到ID,然后将ID设置为服务器端查询字符串param

在以上的界面代码中,我们简单的使用了next.js自定义服务器API创建了一个路由,有了这个,我们为干净的URL添加了服务器端支持。就像这样,我们可以根据自己的需要创建多条路线,不仅限使用express,可以使用任何一个node.js服务器框架,
# 静态异步函数

Index.getInitialProps是一个静态的异步函数,可以将它放在程序的任何页面中,使用它,就可以获取数据并且将他们作为一个道具发送到我们的页面上。以上的代码是我们抓取蝙蝠侠电视节目并将它们作为“节目”传递到我们的页面。
正如上面getInitialProps函数中多看到的那样,它将获取到的数据数量答应到控制台。这种情况下,只在服务器上打印,因为我们的服务器呈现页面,所以已经有了这些数据,并没有理由在客户端再次获取它。
在这里,我们只能在浏览器控制台上看到消息,这是因为我们通过客户端导航到我们帖子页面,然后从客户端获取数据是最好的方法,
但是如果直接访问页面,可以看到服务器上打印的消息,但不在客户端中。
在这个页面的getInitialProps函数,的第一个参数是上下文对象,他有一个我们可以获取信息的字段,我们从查询参数中选择了ID,并且从TVMaze API.中获取数据。
# 造型组件
react样式可以分为两类,一是传统的基于CSS文件的样式(包括sass,postCSS等),而是js风格的CSS组件。因为传统的CSS文件样式需要时间,所以一般不用。
推荐用js中的CSS,可以使用它来设置各个组件的样式,而不是导入CSS文件。
next.js在js框架中预装了一个名为styled-jsx的CSS,它允许我们可以为组件编写熟悉的CSS规则,规则不会影响组件甚至不包括子组件。这就意味着,CSS规则是有作用域的。
样式应该放在模板字符串中{``}
使用styled-jsx所有必要的前缀和CSS验证都是在babel插件中完成的,不会有额外的运行时间开销。
# 踩到的坑
我按着文档的内容引入import withRouterfrom 'next/router'
引入内容,一直报错,改正为import {withRouter} from 'next/router'
是因为要引入的是这个方法里面的内容,而不是这个模块。就相当于
const withRouter = require('next/router').withRouter;
就是具体引入这个模块里面的withRouter这个方法里面的内容。
部署next.js应用程序
next.js可以部署到能运行node.js的任何位置只构建一次程序,但是可以根据需求在尽可能多的端口上启动它
# 在本地构建应用程序
首先需要在npm脚本添加
然后运行
npm run build
npm run start
部署一个应用程序使用自定义代码,首先要做的事情是 迁出分支 git checkout git checkout clean-urls-ssr
# 导出静态网页应用程序
首先要创建一个next.config.js在应用程序根目录中调用的文件,并添加
然后在npm脚本package.json里面添加
然后运行以下命令
npm run build
npm run export
然后你可以在项目中看到一个out文件夹,里面就是到处的HTML内容。
这是一个功能齐全的静态网络应用程序。可以将它部署到任何静态托管服务的地方工作。
为了测试应用程序
npm install -g serve
serve是一个非常简单的静态web服务器
然后切到out文件夹中
cd out serve -p 8080
然后就可以访问静态应用了
因为
我们只要求next.js导出索引(/)页面,现在我们要让他可以导出其他页面

然后运行npm build
npm run export
cd out 一定记得切到导出的文件下
sercve -p 8080 服务端口
然后就可以再8080端口浏览所有页面了
当然还可以继续加例如

运行以后点击http://localhost:8080/p/learn-nextjs/ (opens new window)可以得到想要的内容

没有必要一直构建程序,npm run build
如果页面已经存在就是构建过了就不需要构建。
运行npm run export命令式,next.js不会构建应用程序,如果对应用进行了更改,则需要再次构件应用以获取这些更改。
# 延迟加载模块
首先我们需要认识一个模块firebase,这个模块可以用于所有页面中,这是一个非常大的模块,客户端的时候,我们只需要用户导航到不同的页面,所以,如果我们firebase当时可以加载模块的话,我们就可以改进我们的应用程序的初始加载,
运行命令npm run analyze可以进入到一个页面。页面可以清楚地看出
firebase模块包含在**包内。
firebase只有当用户试图导航到不同的页面时,我们才使用该模块。所以,如果我们可以firebase在那个时候加载模块,可以方便很多。
把代码ioad-db.js页面的代码改成一下样子
在这里我们使用import()函数来加载firebase模块,他返回一个承诺,我们await来等待并解决模块。
然后代码就是

然后如果想使用firebase模块的话,在想要使用的页面使用getInitialProps就可以了,它用于require加载firebase模块。
然后字词解析JavaScript包
npm run analyze
firebase包只在第一次加载
第一时间,getInitialProps对一个页面通过lib/ioad-db.js页面导入了firebase模块,应用程序回家再该包,但是第二次,另一个页面也导入这个模块,但是这个时候他已经被加载了,所以不会再一次加载他。