使用 React 和 Firebase 创建 Github 博客
把博客托管在 Github 的一般做法是使用 Github Page 自带的 jekyllrb 来生成页面,比如你现在看的这个网站。现在我要介绍另一种方法,使用 React 和 Firebase。
关于 React 就不多介绍了,已经有三年历史了,面子书出品,目前人气依旧旺盛。而 Firebase 是一个储存数据和管理 API 的工具网站(简单理解是这样),现在归于孤狗旗下了。看到这,应该明白这种博客形式的实现原理了吧…..
废话不多说,Let’s Rock N’ Roll…
第一步:从 Firebase 开始
使用 Google 账号登录 Firebase,然后创建项目。
然后从设置(齿轮图标)进入 数据库 选项获取 API key,它是一个字符串,差不多长这样,qozLgjZZjyQYuidozsJ7T7BBgZUxoaNnddhaEz0z
。
接着设置 Firebase 数据库的授权规则,从左侧的 Database 选项进入 规则 选项。这个项目孤狗有点翻译不到位,时而中文时而英文,将就一下。
添加的规则如下:
这段 JSON 的意思是,该数据库可读不可写,并且会添加 id
和 slug
两个字段作为 posts
“表”的索引。下一步开始添加内容,先创建一个文本,比如 posts.json
, 然后导入到数据库。下面是一段模拟样本:
到此,在Firebase 的操作部分,暂告一段落,接着我们得整点前端的事儿。
第二步:从 React 开始
上个月,面子书推出了一个 React 项目基础设施速成工具,Create React App 。 这个工具可以让你快速创建一个 React 项目,而无需担心要如何去设置 webpack,loaders,babel…..要如何配置,当然如何你对这几项工具十分熟悉,完全可以自己 DIY,毕竟这才最合你意。下面介绍的使用速成工具。
1,安装 create-react-app
,全局安装
2,然后终端进入某个目录,运行
可以看到该目录多了一个 blog
的文件夹,文件结构如下
blog
├── package.json
├── node_modules
| └── ...
├── favicon.ico
├── index.html
├── README.md
└── src
└── ...
这个过程可能花费时间会长一点,因为依赖也安装好了。接着开始终端运行:
此时整个项目已经可以运行了,地址为: http://localhost:3000
第三步:设计
这一步我们要做的事情,是改变 blog
目录里的 index.html
和 index.css
。
把 index.html
改成:
把 /src/index.css
改成:
好,设计完成!
第四步:添加配置
现在虽然 React 可以运行了,但还是一个静态页面,于是,我们必须创建组件(component)和添加配置文件,为了和 Firebase 连接,我们先在 src
目录创建一个 config.js
文件,如下:
注意替换成你刚创建的 Firebase 项目里的参数。至于 blog
文件夹里的其它没用到的文件,比如 App.css
,logo.svg
… 可以移除掉。
第五步:添加主组件 App.js
安装 firebase 模块
npm i firebase --save-dev
然后在 App.js
文件,把必需的 Firebase 模块和连接配置模块 import 进去。之后开始配置 Firebase,初始化一下。然后把原来的 React 组件移除掉,换上自己的。并且设置 state
的初始化,和 componentDidMount()
函数,完整代码如下:
在 componentDidMount()
这个函数里,我们通过 id
这个参数和 data.val()
这个方法来获取 Firebase 的数据,会返回一个数组,数据获取成功之后,更新 React 的 state , 然后使用数组的 .reverse()
方法颠倒数组,以致让最后发表的文章(在数组最后),可以显示在最前面。
第六步:文章列表组件 Posts.js
从上面的 App.js
可以看出,render()
部分只有一个空的 div
,这显然不够。于是我们还要创建其它组件,先在 src
目录创建一个名为 Components
的文件夹,然后进入并添加文件 Posts.js
,这个 Posts
组件会从上面的 App
组件的 state 获取值,然后把这个值变成自己的属性(props),最后渲染出来。完整代码如下:
第七步:连接主组件和文章列表组件
上面说了 Posts
组件要从 App
组件获取值,就必需要把这两个组件连接起来。
在 App.js 加入一行
接着在 class 内添加一个方法,循环文章数组,把 Author
,title,
summary ,
slug ,
img 这几个字段 push 到一个新的数组里,在
App.js` class 内添加如下代码:
然后把渲染函数 render()
改成如下:
这时候,在终端运行 npm start
,项目是跑不起来的,甚至报错,还没完成嘛!
第八步:添加文章详情组件 Post.js
在 Components
文件夹,添加文件 Post.js
,先在该文件添加一下依赖,代码如下:
接着开始创建 React 组件,并设置初始状态和渲染方法,续写如下代码:
接着就要开始获取数据了,根据 slug
这个字段来获取,同时 slug
也会用到 URL 路由上,等一下会讲到。我们先添加 ComponentDidMount()
函数,代码如下:
第九步:添加路由
在这我们使用 react-routes
,先用 npm 安装:
npm i react-router --save-dev
是时候开始来编辑一下 /src/index.js
这个文件了,先把组件 import 进去,再把路由相关也 import 进去。
然后在 ReactDOM.render()
添加路由设置,在 index.js
添加下列代码:
貌似完成得差不多了,但还差一点点,需要再调整一下。
第十步:链接调整
使用 react-router
路由,要在常规的 HTML a
标签做个小调整。进入文件夹 src/Components/ 打开 Posts.js
文件,先把 react-router
的 Link
import 进去。
mport { Link } from "react-router";
接着把这一行:
<a href={'/post/${this.props.slug}'}>{this.props.title}</a>
改成
<Link to={'/post/${this.props.slug}'}>{this.props.title}</Link>
差别只有两个,a
标签变成了 Link
,属性 href
变成了 to
。注意这个 render
里有两个 a
链接。
最后,运行 npm start
,哈利路亚!!!
完整代码 –> https://github.com/cattla/react-firebase-blog