react ssr 框架next.js开发个人网站心得

 舍我其谁2013666 关注

0.1 2018.07.28 13:27* 字数 1231 阅读 395评论 0喜欢 2

next-blog

项目介绍

利用react服务端框架next.js写的博客,喜欢就给个Star支持一下。
https://github.com/Weibozzz/next-blog
线上地址: http://www.liuweibo.cn
本项目使用next.js经验分享:http://www.liuweibo.cn/p/206

软件架构

软件架构说明
react.js next.js antd mysql node koa2 fetch

网站使用技术

  • 前端:React(16.x) Next.js antd-design fetch Less
  • 后端:node框架koa和mysql (目前前后端分离,这里只负责写接口,和平常的ajax获取接口一样,这里就不开放源码了)
  • 网站目的:业余学习,记录技术文章,学以致用
  • 网站功能
    • markdown发布文章
    • 修改文章(增删改查)
    • 用户评论
    • 上传图片到七牛云存储

安装教程

  1. 快速开始
    虽然是服务端渲染,但是也要调用接口,所以需要调用后端的接口

进入config文件夹下的env.js的isShow设置为true,这里只是调用了我自己线上的接口,当然你
只能看不能修改接口哦。如果为false则调不到接口,需要自己去写接口。

  1. 运行
cnpm i
npm run dev
  1. 部署
cnpm i
npm run build
npm start

使用说明

  • 关于演示不能上传图片,不能发表文章或者修改属于正常情况,因为只是为了展示。
  • 关于路看不到发布文章路由和后台管理也属于正常情况,可以修改代码展示路由效果。

网站截图

  1. 详情页

    http://pd96wjt4m.bkt.clouddn.com/image/common/detail_1536836727000_459470_1536836749510.png

  2. 列表页

    http://pd96wjt4m.bkt.clouddn.com/image/common/list_1536836639000_822188_1536836780676.png

  3. 编辑页面和发布文章,上传图片到七牛云

    http://pd96wjt4m.bkt.clouddn.com/image/common/edit_1536836607000_802376_1536836825962.png

网站技术介绍

完全借助于 next.js 开发的个人网站,线上地址 http://www.liuweibo.cn 总结一下开发完成后的心得和使用体会。gtihub源码https://github.com/Weibozzz/next-blog。喜欢就给个Star支持一下。

为什么使用服务器端渲染(SSR)?

  • 网站是要推广的,所以需要更好的 SEO,搜索引擎可以抓取完整页面
  • 访问速度,更快的加载静态页面

网站使用技术

  • 前端:React(16.x) Next.js antd-design fetch Less
  • 后端:node框架koa和mysql (目前前后端分离,这里只负责写接口,和平常的ajax获取接口一样,这里就不开放源码了)
  • 网站目的:业余学习,记录技术文章,学以致用
  • 网站功能
    • 发布文章
    • 修改文章(增删改查)
    • 用户评论

源码剖析

这里就只讲重点了

入口文件server.js

这里用的官方提供的express,同时开启gzip压缩

const express = require('express')
const next = require('next')const compression = require('compression')
const dev = process.env.NODE_ENV !== 'production'
const app = next({ dev })
const handle = app.getRequestHandler()
let port= dev?4322:80app.prepare().then(() => {const server = express()if (!dev) {server.use(compression()) //gzip}//文章二级页面server.get('/p/:id', (req, res) => {const actualPage = '/detail'const queryParams = { id: req.params.id }app.render(req, res, actualPage, queryParams)})server.get('*', (req, res) => {return handle(req, res)})server.listen(port, (err) => {if (err) throw errconsole.log('> Ready on http://localhost ' port)})}).catch((ex) => {process.exit(1)})

page根组件_app.js

用于传递redux数据,store就和普通react用法一样了,还有header和footer可以放在这里,同理还有_err.js用于处理404页面


import App, {Container} from 'next/app'
import React from 'react'
import {withRouter} from 'next/router' // 接入next的router
import withReduxStore from '../lib/with-redux-store' // 接入next的redux
import {Provider} from 'react-redux'class MyApp extends App {render() {const {Component, pageProps, reduxStore, router: {pathname}} = this.props;return (<Container><Provider store={reduxStore}><Component {...myPageProps}  /></Provider></Container>)}
}export default withReduxStore(withRouter(MyApp))

网站的服务端渲染页面Blog页面

  • link用于跳转页面,利用as把原本的http://***.com?id=1变为漂亮的 /id/1
  • head可以嵌套meta标签进行seo
  • 配置不需要seo的组件
import dynamic from 'next/dynamic';//不需要seo
const DynasicTopTipsNoSsr = dynamic(import('../../components/TopTips'),{ssr:false
})import React, {Component} from 'react'
import {connect} from 'react-redux'
import Router from 'next/router'
import 'whatwg-fetch' // 用于fetch请求数据
import Link from 'next/link'; // next的跳转link
import Head from 'next/head'  // next的跳转head可用于seoclass Blog extends Component {render() {return (<div className="Blog"><Head><title>{BLOG_TXT}&raquo;{COMMON_TITLE}</title></Head><MyLayout><Link   as={`/Blog/${current}`} href={`/Blog?id=${current}`}><a onClick={this.onClickPageChange.bind(this)}>{current}</a></Link></MyLayout></div>)}
}
//这里才是重点,getInitialProps方法来请求数据进行渲染,达到服务端渲染的目的
Blog.getInitialProps = async function (context) {const {id = 1} = context.querylet queryStringObj = {type: ALL,num: id,pageNum}let queryTotalString = {type: ALL};const pageBlog = await fetch(getBlogUrl(queryStringObj))const pageBlogData = await pageBlog.json()return {pageBlogData}
}
// 这里根据需要传入redux
const mapStateToProps = state => {const {res, searchData, searchTotalData} = statereturn {res, searchData, searchTotalData};
}
export default connect(mapStateToProps)(Blog)

静态资源

根目录创建static文件夹,这里是强制要求,否则加载不到静态资源

配置antd和主题并且按需加载

主题配置

antd-custom.less

@primary-color: #722ED0;@layout-header-height: 40px;
@border-radius-base: 0px;

styles.less

@import "~antd/dist/antd.less";
@import "./antd-custom.less";

最后统一配置在公共head

<Head><meta charSet="utf-8"/><meta httpEquiv="X-UA-Compatible" content="IE=edge, chrome=1"/><meta name="viewport"content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no"/><meta name="renderer" content="webkit"/><meta httpEquiv="description" content="刘伟波-天天向上"/><meta name="author" content="刘伟波,liuweibo"/><link rel='stylesheet' href='/_next/static/style.css'/><link rel='stylesheet' type='text/css' href='/static/nprogress.css' /><link rel='shortcut icon' type='image/x-icon' href='/static/favicon.ico' /></Head>

按需加载配置

.babelrc文件

{"presets": ["next/babel"],"plugins": ["transform-decorators-legacy",["import",{"libraryName": "antd","style": "less"}]]
}

next.config.js文件配置

const withLess = require('@zeit/next-less')module.exports =   withLess({lessLoaderOptions: {javascriptEnabled: true,cssModules: true,}}
)

页面css

感觉和vuescope一样,stylejsx,加了global为全局,否则只在这里生效

render() {return (<Container><Provider store={reduxStore}><Component {...myPageProps}  /></Provider><style jsx global>{`.fl{float: left;
}
.fr{float: right;
}`}</style></Container>)

页面顶部加载进度条

import Router from 'next/router'
import NProgress from 'nprogress'Router.onRouteChangeStart = (url) => {NProgress.start()
}
Router.onRouteChangeComplete = () => NProgress.done()
Router.onRouteChangeError = () => NProgress.done()

markdown发表文章和代码高亮

使用只需要marked('放入markdown字符串');

import marked from 'marked'
import hljs from 'highlight.js';hljs.configure({tabReplace: '  ',classPrefix: 'hljs-',languages: ['CSS', 'HTML, XML', 'JavaScript', 'PHP', 'Python', 'Stylus', 'TypeScript', 'Markdown']
})
marked.setOptions({highlight: (code) => hljs.highlightAuto(code).value,gfm: true,tables: true,breaks: false,pedantic: false,sanitize: true,smartLists: true,smartypants: false
});

学累了,来个图放松下

[图片上传失败...(image-b0b5dd-1536913267870)]

参与贡献

  1. Fork 本项目
  2. 新建 Feat_xxx 分支
  3. 提交代码
  4. 新建 Pull Request

遗留问题

  1. 访问量大的时候要做数据缓存
  2. cdn node查看图片日期
  3. 配置图片描述和更改
  4. 上传图片高质量暂未支持上传,上传代码改进
  5. 上传为刚好1M bug
  6. 登陆后支持收藏文章和修改评论
  7. 顶部加载滚动条首次没loading
  8. 增加koa子模块
  9. 评论支持markdown,评论内容过多建议去sf平台

react ssr方法相关推荐

  1. 我很懒,什么都没留下系列 之 教你上手React服务端渲染(React SSR) HMR

    技术栈:webpack3.9.1+webpack-dev-server2.9.5+React16.x + express4.x 前言 (好慌!可能是因为我很懒,导致...,然后,好吧,我比较懒,没有然 ...

  2. markdownpad2 html渲染组件出错_「万字长文」一文吃透React SSR服务端同构渲染

    写在前面 前段时间一直在研究 react ssr技术,然后写了一个完整的 ssr开发骨架.今天写文,主要是把我的研究成果的精华内容整理落地,另外通过再次梳理希望发现更多优化的地方,也希望可以让更多的人 ...

  3. react native text换行_基于React+Koa实现React SSR服务端渲染

    React Server-Side Rendering 其实这个概念很早之前就有了解了,出于没有应用场景原因,之前一直都只停留在了解API的层面,未曾去实践.快到周末闲来无事,自己复盘了下之前做的新商 ...

  4. react ssr php,一文吃透 React SSR 服务端渲染和同构原理

    全网最完整的 React SSR 同构技术原理解析与实践,从零开始手把手带你打造自己的同构应用开发骨架,帮助大家彻底深入理解服务端渲染及底层实现原理,学完本课程,你也可以打造自己的同构框架. 写在前面 ...

  5. React SSR: 基于 express 自构建 SSR 服务端渲染

    React SSR: 基于 express 自构建 SSR 服务端渲染 文章目录 React SSR: 基于 express 自构建 SSR 服务端渲染 完整代码示例 前情提要 构建 CSR 项目 项 ...

  6. React SSR 服务器端渲染

    React SSR 介绍 什么是客户端渲染 CSR: Client Side Rendering 服务器端仅返回 JSON 数据,DATA 和 HTML 在客户端进行渲染 什么是服务器端渲染 SSR: ...

  7. React SSR - 01 SSR 介绍 和 快速开始

    React SSR 介绍 什么是客户端渲染 CSR:Client Side Rendering 数据和 HTML 的拼接是在客户端(浏览器)使用 JavaScript 完成的,服务端只需要返回 JSO ...

  8. 大前端时代,如何做好C 端业务下的React SSR?\n

    React在中后台业务里已经很好落地了,但对于C端(给用户使用的端,比如PC/H5)业务有其特殊性,对性能要求比较苛刻,且有SEO需求.另外团队层面也希望能够统一技术栈,小伙伴们希望成长,那么如何能够 ...

  9. Next.js---一个轻量级的 React SSR应用框架

    Next.js---一个轻量级的 React SSR应用框架 为什么要用Next.js Next.js介绍 优点 创建 项目目录结构 Next中的路由 如何实现跳转 带参跳转 路由钩子 使用 数据请求 ...

  10. react ssr原理

    ssr 什么是ssr:server side render,服务端渲染 不同于jsp,php等传统服务端渲染(这种情况下,前后端代码是分开的,写了两份) 目前的ssr是基于react vue等前端框架 ...

最新文章

  1. Linux下如何执行Shell脚本
  2. windows x64 build c++ poco库
  3. 3月29日 如何在winform中加入动态系统时间
  4. 让我们来比较C#,C++和Java之间重写虚函数的区别
  5. 软件测试岗位,BAT大厂面试题集锦
  6. 微软开放技术热烈祝贺开源社成立!
  7. oracle中同义词的用法,Oracle中使用同义词
  8. PyCharm设置Python版本
  9. SEO已死,真的吗,十年SEO从业者的思考
  10. 数字经济发展指标体系和测算(含互联网宽带、电话普及率等多指标 内附原始数据) 2011-2020年
  11. 微信小程序--引用外部字体(云开发实现)
  12. android 检查电话号码是否合理(含大陆和香港格式)
  13. 浏览器出现无法访问此页面的提示的解决办法
  14. 用CCS搭建简单的F28069M工程并控制LED闪烁
  15. Unable to instantiate appComponentFactory
  16. 专家:早着呢!有意识的人工智能兴起还需要几十年 | 观点
  17. 二维码追溯系统有什么特点?
  18. 次世代游戏建模人的红利期真要来了,3D角色建模价格竟高达100万一个,元宇宙高薪抢占人才
  19. 计算机游戏配机方案,小白不会装机怎么办?2021年最佳游戏PC整机配置一览
  20. 博客之星竞选最后几天,放飞自我的博主们

热门文章

  1. mac:装机软件汇总
  2. 火狐firefox扩展插件开发extension代码调试方法
  3. java文件传输加密_java程序对于文件的加密和解密
  4. Java文件上传之断点续传解决方案
  5. 软件架构领域集大成者——《架构之美》读书笔记
  6. 设计配色灵感|热情甜蜜色系配色方案
  7. displaytag用法一
  8. linux下R及Rstudio及Rhadoop安装
  9. ESD二极管,SOT-23封装型号大全
  10. 百度云盘卸载不干净如何处理