基于create-react-app构建静态博客
前言: 用过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构建静态博客的更多相关文章
- 通过hexo+NexT构建静态博客
一般的教程网上有很多,主要讲下我遇到的问题以及解决方法: 一.hexo建立的文档无法上传github deploy: type: git repository: https://github.com/ ...
- vuepress-theme-reco + Github Actions 构建静态博客,部署到第三方服务器
最新博客链接 Github链接 查看此文档前应先了解,vuepress基本操作 参考官方文档进行配置: vuepress-theme-reco VuePress SamKirkland / FTP-D ...
- 基于mkdocs-material搭建个人静态博客
基于mkdocs-material搭建个人纯静态博客,没有php,没有mysql 如果你只是想安安静静的放一些技术文章,发布到个人站点或github-pages,mkdocs-material很适合你 ...
- 在 .NET Core 5 中集成 Create React app
翻译自 Camilo Reyes 2021年2月22日的文章 <Integrate Create React app with .NET Core 5> [1] Camilo Reyes ...
- 【docker构建】基于docker构建wordpress博客网站平台
WordPress是使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站.也可以把 WordPress当作一个内容管理系统(CMS)来使用. WordPre ...
- React初步学习-利用React构建个人博客
React初步学习-利用React构建个人博客 用React和Webpack写了一个很简单的个人博客,主要是想要熟悉一下react中各种基本基本属性及方法的使用.在构建过程中碰到不少问题,通过阅读官方 ...
- 在windows下创建基于github的hexo静态博客
最近边上的人都突然买起了域名搭起了个人网站,渣渣的我介于期末没事干也跟风搭了个静态博客.虽说博客基本不更新T T,嘛嘛回归正题. 首先准备工作: 1)安装nodejs 2)安装msysgit(虽然现在 ...
- 基于Hexo搭建静态博客
关于静态博客 通常来讲,建立个人博客有2种方式: 第一,直接在第三方博客平台注册博客空间,如:博客园,简书,CSDN等,这种方式建立的博客,所有数据都存放在博客平台. 第二,自建博客系统,这种方式就是 ...
- 深入 Create React App 核心概念
本文差点难产而死.因为总结的过程中,多次怀疑本文是对官方文档的直接翻译和简单诺列:同时官方文档很全面,全范围的介绍无疑加深了写作的心智负担.但在最终的梳理中,发现走出了一条与众不同的路,于是坚持分享出 ...
- 使用react全家桶制作博客后台管理系统 网站PWA升级 移动端常见问题处理 循序渐进学.Net Core Web Api开发系列【4】:前端访问WebApi [Abp 源码分析]四、模块配置 [Abp 源码分析]三、依赖注入
使用react全家桶制作博客后台管理系统 前面的话 笔者在做一个完整的博客上线项目,包括前台.后台.后端接口和服务器配置.本文将详细介绍使用react全家桶制作的博客后台管理系统 概述 该项目是基 ...
随机推荐
- How to Change Reset Retrieve the WebLogic Server Administrator Password on WLS 10.3.6 or earlier
To change the Administrator password on WLS 10.3.6 or earlier, perform the following steps depending ...
- Unity递归查找子物体
- 观察APP运行日志
一.Android采用log工具打印日志,他将各类日志分为五个等级 1.log.e:表示错误信息,比如可能导致程序崩溃的异常 2.log.w:表示警告信息 3.log.i:表示一般信息 4.log.d ...
- struts 1.x框架记录
strus-config.xml 项目目录最顶层建立配置文件strus-config.xml action 通过type绑定java类,可通过attribute被引用 MyLoginForm.java ...
- Matlab - 在Figure界面去掉图像的坐标刻度
Matlab版本:2018b 经过一番尝试,发现有两种方法 第一种:修改坐标轴的Visible属性,去掉坐标轴数字和坐标轴标签 第二种:删除Tick,只去掉坐标轴数字 第一种 ①原图 ②如果有多个子图 ...
- 如何建设私有云原生 Serverless 平台
随着云计算的普及,越来越多的企业开始将业务应用迁移到云上.然而,如何构建一套完整的云原生 Serverless 平台,依然是一个需要考虑的问题. Serverless的发展趋势 云计算行业从 IaaS ...
- 利用SpringBoot实现数据库的增删改查(具体实现)
前言 本次主要是想利用SpringBoot的框架实现一下数据库的增删改查,所以只有一个较为简单的表作为案例 具体实现 1.在配置文件中配置一下相关内容 2.在pom.xml文件中导入相关坐标 3.编写 ...
- Android笔记--数据存储之SharedPreferences
SharedPreferences--轻量级存储工具(共享参数) 其采用的存储结构是Key-Value的键值对方式 SharedPreferences用法以及相关的简单案例 记住密码的实现 实现啦! ...
- 在一张 24 GB 的消费级显卡上用 RLHF 微调 20B LLMs
我们很高兴正式发布 trl 与 peft 的集成,使任何人都可以更轻松地使用强化学习进行大型语言模型 (LLM) 微调!在这篇文章中,我们解释了为什么这是现有微调方法的有竞争力的替代方案. 请注意, ...
- Linux报错:audit: backlog limit exceeded(审计:超出积压限制)
Linux报错:audit: backlog limit exceeded(审计:超出积压限制) 系统版本:CentOS Linux release 7.6.1810 (Core) 问题现象:一次巡检 ...