项目作者: ThiagoSun

项目描述 :
nextjs + express + antd 构建的SSR项目
高级语言: HTML
项目地址: git://github.com/ThiagoSun/rt-ssr-boilerplate.git
创建时间: 2019-07-05T09:49:59Z
项目社区:https://github.com/ThiagoSun/rt-ssr-boilerplate

开源协议:

下载


基于 Next.js 的服务端渲染(SSR)项目,由 Create Next App 脚手架生成,并在其基础上增强功能。

使用SSR的主要目的之一就是SEO优化,而目前移动端H5对SEO的需求并不高,SEO需求主要集中在一些PC端的展示类网站,因此本项目里面搭配使用了 Ant Design

目录

学习教程

Next.js中文文档
Next.js英文文档(官方实时更新)

目录结构

  1. .
  2. ├── .next // 构建目录
  3. ├── [...]
  4. ├── assets // 可存放公共css/less资源
  5. ├── [...]
  6. ├── bundles // 打包依赖分析结果
  7. ├── [...]
  8. ├── components // 与路由无关的组件目录
  9. ├── head.js // 自定义<head>标签内容
  10. └── nav.js // 一个公共组件
  11. ├── node_modules
  12. ├── [...]
  13. ├── pages // 定义路由文件
  14. └── buttonDemo // antd button组件demo
  15. └── datePickerDemo // antd datePicker组件demo,重要、配置繁琐
  16. └── fetchDemo // 网络请求demo
  17. └── urlParams // Parameterized式路由
  18. └── redirectDemo // 重定向demo
  19. └── cssModule // cssModule例子
  20. └── _app.js // 引入了一个空less文件
  21. └── index.js // index路由
  22. ├── static // 存放一些静态资源,可在外部直接访问
  23. ├── [...]
  24. ├── utils // 工具包
  25. ├── [...]
  26. ├── .babelrc // babel配置
  27. ├── .editorconfig // 编辑器配置
  28. ├── .gitignore // git配置
  29. ├── ecosystem.config.js // pm2生态系统文件
  30. ├── next.config.js // 自定义 Next.js 的高级配置
  31. ├── next-less.config.js // 修改了官方插件@zeit/next-less的默认行为,适配antd
  32. ├── package.json
  33. ├── package-lock.json
  34. ├── postcss.config.js // postcss配置,autoprefixer
  35. ├── README.md
  36. └── server.js // 重写了next.js的server

Next.js的路由定义取决于代码的文件目录, 所以 ./pages/index.js
解析到 / 路径,./pages/about.js 解析到 /about.

./static 文件夹指向服务器的 /static 路径, 你可以在这里放置一些静态资源
例如:图片或者编译好的CSS文件。

目前为止我们可以了解到:

  • 自动打包编译 (使用 webpack 和 babel)
  • 热加载
  • ./pages 作为服务端的渲染和索引
  • 静态文件服务. ./static/ 映射到 /static/

了解更多关于 Next’s Routing

Scripts

在工程下,你可以执行:

npm run dev

在测试环境下启动项目。

在浏览器中打开 http://localhost:3000

修改代码后页面会自动刷新

并且出现错误时可以在console中看到。

npm run build

为production环境执行build任务,并输出到 .next 文件夹。

将生成mode为production的代码,并且压缩代码为了更好的体验。

npm run start

在production模式下启动服务。需要先执行 npm run build 编译。

关于部署的更多信息: deployment

npm run analyze

生成打包模块依赖分析图

npm run deploy

使用pm2容器启动服务

使用CSS

可以使用 Next.js 脚手架内置的 styled-jsx

  1. export default () => (
  2. <div>
  3. Hello world
  4. <p>scoped!</p>
  5. <style jsx>{`
  6. p {
  7. color: blue;
  8. }
  9. div {
  10. background: red;
  11. }
  12. @media (max-width: 600px) {
  13. div {
  14. background: blue;
  15. }
  16. }
  17. `}</style>
  18. </div>
  19. )

不过我们已经更习惯于使用 less 写样式,less 的配置项已经配好(包括 autoprefixer),关于 css module 请看示例demo。

了解更多关于 Next’s CSS features.

数据请求

你可以在 pages 文件夹下的文件中,调用组件方法 getInitialProps 来请求数据:

./pages/fetch/index.js

  1. import {fetchAPI} from '../../utils/request';
  2. static async getInitialProps({ req }) {
  3. const response = await fetchAPI('/admin/yjofficialwebsite/platformarticles/get', {
  4. method: 'POST',
  5. body: {
  6. "platformType": 4,
  7. "articlesStatus": 1,
  8. "pageNo": "-1"
  9. }
  10. });
  11. return {indexNews: response.vo.records};
  12. }

页面初始化加载时, getInitialProps 只会在server端执行。
只有当路由跳转(Link组件跳转或 API 方法跳转)时,才会在client端执行getInitialProps

Note: getInitialProps 不能 用在子组件中,只能使用在 pages 页面中。

了解更多关于 数据请求和生命周期

数据请求的调试

  • 不同于在浏览器中开发,SSR工程的数据请求是从本地server发往目标server,
    无法通过浏览器调试工具进行监听,Charles也监听不到。
  • 目前只能通过在console打印网络请求信息来查看
  • 关于服务端开发常用的本地断点调试:目前编辑器支持度不高,暂时只有VS Code
    支持,详情请查看此issue:https://github.com/zeit/next.js/pull/3294

自定义Server

默认情况下,是通过 next start 命令来启动服务,现在我们增加一个 server.js 文件,并且引入 express ,方便后期扩展服务器功能,以及自定义路由。

目前路由默认是以 pages 文件夹做区分,但是目前可以在 server.js 中做修改,可以参考 pages/urlParamspages/newsDetailDemo 这两个例子。

了解更多关于 自定义Server和Routing

部署

使用 pm2nginx 组合部署。

pm2 负责进程管理以及负载均衡,配置项参照ecosystem.config.js文件。

nginx 负责做反向代理,参考配置:

  1. server{
  2. listen 8081;
  3. server_name localhost;
  4. location / {
  5. # default port, could be changed if you use next with custom server
  6. proxy_pass http://localhost:3000;
  7. proxy_http_version 1.1;
  8. proxy_set_header Upgrade $http_upgrade;
  9. proxy_set_header Connection 'upgrade';
  10. proxy_set_header Host $host;
  11. proxy_cache_bypass $http_upgrade;
  12. # if you have try_files like this, remove it from our block
  13. # otherwise next app will not work properly
  14. # try_files $uri $uri/ =404;
  15. }
  16. }

部署到Now

nowserverless 的一种实现,提供一个零配置的、单命令的部署,直接部署服务到云端。

  1. 执行 npm install -g now 安装 now

  2. 在你的工程目录下执行 now . 你会在输出里看到一个 now.sh URL:

    1. > Ready! https://your-project-dirname-tpspyhtdtk.now.sh (copied to clipboard)

    发布完成后把这段URL拷贝到浏览器地址栏,你可以看到你的项目

访问更多细节关于 now.

一些问题

  1. 在开发环境下启动服务后,通过client route跳转,会出现样式丢失的问题,但是在构建后的正式环境下不存在该问题。该问题目前可以通过刷新浏览器得以解决,对于开发影响不是很大。目前了解到的原因是,开发环境和生产环境的构建方案大不相同,生产环境是一次性构建出所有页面,并且把css代码抽出来打包到 style.chunk.css 这个文件中;但是处于开发环境时,服务器只会在接收到客户端请求后才开始该页面的第一次构建,此时构建出的 style.chunk.css 文件是不完整的,并且后续访问的页面也不会向该文件中追加样式,造成后续页面的样式缺失。

  2. 待完善…