前言: 用过hexo后,我被其强大的功能惊艳到了,于是便想自己也写一个静态博客生成器,并且可以发布到GitHub托管。

首先我们来看下效果图:

具体是怎么实现的呢?

我们通过create-react-app构建react单页应用后,删除了默认创建的js和jsx,自己建立了布局页(Layout.jsx),其中包含了页头导航(NavBar.jsx)和页尾(Footer.jsx)

export default function Layout(props){
return (
<>
<div className="card bg-base-100 shadow-xl h-container">
<NavBar />
{props.children}
</div>
<Footer />
</>
)
}

这样我们中间内容每次就可以用布局页包裹,例如:

<Layout>
<div style={{
padding: "30px"
}}>
<div dangerouslySetInnerHTML={createMarkup(html)}></div>
</div>
</Layout>

然后我们创建了文章页,分组页,分组下文章,首页

值得关注的是,我通过了axios请求静态markdown文件,再通过Remarkable组件解析成Html,使用react自带属性dangerouslySetInnerHTML显示出来,例如:Article.jsx

import React, {useState, useEffect} from "react"
import Layout from "../widget/Layout"
import axios from "axios"
import {getQueryVariable} from "../utils/commonUtil"
import "../css/typo.css"
import 'highlight.js/styles/atom-one-dark.css';
import "../css/code.css" const {Remarkable} = require("remarkable");
const hljs = require('highlight.js');
hljs.initHighlighting(); function createMarkup(content) {
return {__html: content};
} export default function Article() {
const [html, setHtml] = useState(<h5>空空如也</h5>);
useEffect(() => {
let _id = getQueryVariable("id");
const fetchData = async () => {
const posts = (await axios.get("/api/post.json")).data;
let post = posts.find(h => h.id === Number(_id));
if (post && post.url) {
const md = (await axios.get(post.url)).data;
const mdTemplate = new Remarkable({
highlight: function(str, lang) {
if (lang && hljs.getLanguage(lang)) {
try {
return hljs.highlight(lang, str).value;
} catch (err) {}
}
try {
return hljs.highlightAuto(str).value;
} catch (err) {}
return "";
}
});
setHtml(mdTemplate.render(md));
}
}
if (_id && _id >= 0) {
fetchData();
}
}, [])
return (<Layout>
<div style={{
padding: "30px"
}}>
<div dangerouslySetInnerHTML={createMarkup(html)}></div>
</div>
</Layout>)
}

还需要注意的是,react公共静态文件需要放到public目录下,如图:

项目至此,大体就是这样,再通过npm run build就发布了,我们只需要更改api目录下的json文件和md目录下的markdown文件即可自动检索文章和相关配置,项目我推送github了,详情点击https://github.com/cracker-cn/react-static-blog

基于create-react-app构建静态博客的更多相关文章

  1. 通过hexo+NexT构建静态博客

    一般的教程网上有很多,主要讲下我遇到的问题以及解决方法: 一.hexo建立的文档无法上传github deploy: type: git repository: https://github.com/ ...

  2. vuepress-theme-reco + Github Actions 构建静态博客,部署到第三方服务器

    最新博客链接 Github链接 查看此文档前应先了解,vuepress基本操作 参考官方文档进行配置: vuepress-theme-reco VuePress SamKirkland / FTP-D ...

  3. 基于mkdocs-material搭建个人静态博客

    基于mkdocs-material搭建个人纯静态博客,没有php,没有mysql 如果你只是想安安静静的放一些技术文章,发布到个人站点或github-pages,mkdocs-material很适合你 ...

  4. 在 .NET Core 5 中集成 Create React app

    翻译自 Camilo Reyes 2021年2月22日的文章 <Integrate Create React app with .NET Core 5> [1] Camilo Reyes ...

  5. 【docker构建】基于docker构建wordpress博客网站平台

    WordPress是使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站.也可以把 WordPress当作一个内容管理系统(CMS)来使用. WordPre ...

  6. React初步学习-利用React构建个人博客

    React初步学习-利用React构建个人博客 用React和Webpack写了一个很简单的个人博客,主要是想要熟悉一下react中各种基本基本属性及方法的使用.在构建过程中碰到不少问题,通过阅读官方 ...

  7. 在windows下创建基于github的hexo静态博客

    最近边上的人都突然买起了域名搭起了个人网站,渣渣的我介于期末没事干也跟风搭了个静态博客.虽说博客基本不更新T T,嘛嘛回归正题. 首先准备工作: 1)安装nodejs 2)安装msysgit(虽然现在 ...

  8. 基于Hexo搭建静态博客

    关于静态博客 通常来讲,建立个人博客有2种方式: 第一,直接在第三方博客平台注册博客空间,如:博客园,简书,CSDN等,这种方式建立的博客,所有数据都存放在博客平台. 第二,自建博客系统,这种方式就是 ...

  9. 深入 Create React App 核心概念

    本文差点难产而死.因为总结的过程中,多次怀疑本文是对官方文档的直接翻译和简单诺列:同时官方文档很全面,全范围的介绍无疑加深了写作的心智负担.但在最终的梳理中,发现走出了一条与众不同的路,于是坚持分享出 ...

  10. 使用react全家桶制作博客后台管理系统 网站PWA升级 移动端常见问题处理 循序渐进学.Net Core Web Api开发系列【4】:前端访问WebApi [Abp 源码分析]四、模块配置 [Abp 源码分析]三、依赖注入

    使用react全家桶制作博客后台管理系统   前面的话 笔者在做一个完整的博客上线项目,包括前台.后台.后端接口和服务器配置.本文将详细介绍使用react全家桶制作的博客后台管理系统 概述 该项目是基 ...

随机推荐

  1. C# winform DataGridView 一列显示星号

    private void myDataGrid_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventA ...

  2. The difference of src and href

    href是Hypertext Reference的缩写,表示超文本引用.用来建立当前元素和文档之间的链接.常用的有:link.a.例如: <link href="reset.css&q ...

  3. 如何像Facebook一样构建数据中心 – BGP在大规模数据中心中的应用(3)

    如何像Facebook一样构建数据中心 – BGP在大规模数据中心中的应用(3) superrace• 18-06-12 作者简介:史梦晨,曾就职于国内金牌集成商, 现就职于EANTC( 欧洲高级网络 ...

  4. Linux完全卸载mysql的方式

    //rpm包安装方式卸载查包名:rpm -qa|grep -i mysql删除命令:rpm -e –nodeps 包名 //yum安装方式下载1.查看已安装的mysql命令:rpm -qa | gre ...

  5. RecyclerView显示列表

    本次要讲的内容是利用RecyclerView显示Users列表的信息,如下图所示. 首先我们来创建模型User.java package com.example.mytest.User; import ...

  6. SimpleITK和nibable读取nii文件

    import SimpleITK as sitk path = 'nii全路径' nii_obj = sitk.GetArrayFromImage(sitk.ReadImage(path)) #sha ...

  7. mxnet的broadcast_power() 注释错误

    用relationnet时,发现broadcast_power()的源码中的注释如下: 官方文档中的注释如下: 怎么算都算不出它这个结果... 自己用mxnet实验了一把,发现是注释错了,代码如下:

  8. SpringBoot笔记--事件监听+启动流程+监控+项目部署

    事件监听 ApplicationContextInitializer SpringApplicationRunListener ApplicationRunner CommandLineRunner ...

  9. 【备忘录】 主定理 Master Theorem (转载)

    备忘录 https://zhuanlan.zhihu.com/p/113406812

  10. jquery二级菜单。显示了jquery的方便

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...