关于
阅读量
0
阅读人次
0
年纪大了,看的多了,见的杂了,记忆力也没有年轻的时候那么好了。但是总有些瞬间,有些知识是我们不愿所遗忘的,是值得被回忆想起来的,是能够为我们所用的。 当然咯,有很多方式可以记录。日常生活动态用微信朋友圈记录,工作技能用CSDN等网站记录。但是出于一种怀旧典藏的心理,总觉得数据存在别人那里让我觉得不放心,让我觉得无法掌控,让我觉得不能依自己所想来组织自己的表达。所以觉得还是自己用本地文件记录更好,那么如何让内容展示出去呢,也能够方便自己随时随地查看,毕竟随时随地打开笔记本翻阅查看也不太显示,所以最终决定自己搭建一个博客网站咯,作为一个技术开发从业者,这也是我一直所期望的。
使用Obsidian记录
最开始一直是使用Typora作为编辑器的,后来Typora发布正式版开始收费之后,我也选择成为了正版用户,毫无疑问我认为Typora在单文档编辑方面是其他app无法匹及的。 后来偶然接触到了Obsidian,它提倡的数据本地持有,文档仓库概念,All in One等一些思想与我不谋而合,再花了一两天的时间试用之后,我决定换用Obsidian作为以后的编辑工具了。
安装 File Hider 插件用于隐藏工作区目录,例如 node_modules。 安装 Codeblock Customizer 用于显示代码块行号。
使用Docusaurus作为前端
自定义
npm run swizzle -- --list
npm run swizzle @docusaurus/theme-classic NavbarItem -- --eject # 只要 NavbarItem/ComponentTypes.js
npm run swizzle @docusaurus/theme-classic DocItem/Content -- --eject
npm run swizzle @docusaurus/theme-classic DocItem/Layout -- --eject
npm run swizzle @docusaurus/theme-classic ColorModeToggle -- --wrap
npm run swizzle @docusaurus/theme-classic Navbar/Content -- --eject
npm run swizzle @docusaurus/theme-classic CodeBlock/Content -- --eject
npm run swizzle @docusaurus/theme-classic MDXComponents/Li -- --eject
npm run swizzle @docusaurus/theme-classic Footer/Layout -- --eject
npm run swizzle @docusaurus/theme-classic BlogPostItem/Header/Info -- --eject
npm run swizzle @docusaurus/theme-classic BlogPostPage -- --eject
导航栏
Docusaurus在移动端的响应式布局,不太符合我的要求:
npm run swizzle @docusaurus/theme-classic Navbar/Content -- --eject
import React from 'react';
// ...
import DefaultNavbarItem from '@theme/NavbarItem/DefaultNavbarItem';
import UserLogin from '@site/src/components/UserLogin.jsx';
export default function NavbarContent() {
return (
<NavbarContentLayout
// ...
right={
// ...
<DefaultNavbarItem className={styles.mustDisplay} label="留言板" to="/MessageBoard" />
<UserLogin />
}
/>
);
}
.mustDisplay {
display: inline-block !important;
}
.searchBar {
position: static !important;
}
NotFound 页面
Docusaurus 自带的404页面,我们可以自定义,让其更生动:
npm run swizzle @docusaurus/theme-classic NotFound -- --eject
npm run swizzle @docusaurus/theme-classic MDXComponents -- --eject # 这里我们自定义TaskList
另外,在使用Nginx时,如果遇到错误,也可以指向到这里:
error_page 500 502 503 504 /404.html;
location = /404.html {
root amass_blog;
}
支持Mermaid
npm install @docusaurus/theme-mermaid
Twikoo评论系统
工作微信机器人作为评论即时通知。
Swizzling Docusaurus 内部组件
安装twikoo包,然后定制DocItem/Layout
、BlogPostPage
添加评论组件。
npm install twikoo
npm run swizzle @docusaurus/theme-classic DocItem/Layout -- --eject
npm run swizzle @docusaurus/theme-classic BlogPostPage -- --eject
然后添加如下代码:
import CommentItem from '../../../components/CommentItem';
// ...
function BlogPostPageContent({sidebar, children}) {
// ...
const {
// ...
comments = true,
} = frontMatter;
return (
<BlogLayout>
<!--省略实现-->
{comments && (<CommentItem />)}
</BlogLayout>
);
}
CodeBlock支持c++标识
Docusaurus高亮C++代码,只能使用cpp
才能识别。但是之前一直都是使用typora作为编辑器,习惯输入c++
。这时需要定制一下CodeBlock/Content
这个组件:
npm run swizzle @docusaurus/theme-classic CodeBlock/Content -- --eject
然后在src/theme/CodeBlock/Content/String.js
修改如下两行:
let language = normalizeLanguage(
languageProp ?? parseLanguage(blockClassName) ?? defaultLanguage,
);
if (language === "c++") language = "cpp";
适配React Material主题
npm run swizzle @docusaurus/theme-classic ColorModeToggle -- --wrap
import React, { useEffect } from "react";
import ColorModeToggle from "@theme-original/ColorModeToggle";
import { useColorScheme } from "@mui/material/styles";
export default function ColorModeToggleWrapper(props) {
// MUI color mode setting
const { setMode } = useColorScheme();
// "value" holds the color theme. Either "light" or "dark"
const { value } = props;
// change mode based on "value" prop
// "dark" or "light" are also used for MUI
useEffect(() => {
setMode(value);
}, [value]);
return (
<>
<ColorModeToggle {...props} />
</>
);
}
创建MUI主题配置src/components/MuiTheme.js
文件:
import { experimental_extendTheme as extendTheme } from "@mui/material/styles";
const muiTheme = extendTheme({
colorSchemes: {
light: {
palette: {
primary: {
main: "#205d3b",
},
background: {
paper: "#2e8555",
},
},
},
dark: {
palette: {
primary: {
main: "#29d5b0",
},
background: {
paper: "#25c2a0",
},
},
},
},
});
export default muiTheme;
新建src/theme/Root.jsx
文件:
import React from 'react';
import store from '../business/store';
import { Provider } from 'react-redux'
import { CacheProvider } from '@emotion/react';
import { Experimental_CssVarsProvider as CssVarsProvider } from '@mui/material/styles';
import createEmotionCache from '../business/createEmotionCache';
import theme from "@site/src/components/MuiTheme.js";
const cache = createEmotionCache();
export default function Root({ children }) {
return <CacheProvider value={cache}>
<CssVarsProvider theme={theme}>
<Provider store={store}>
{children}
</Provider>
</CssVarsProvider>
</CacheProvider>
}
杂想
早在2021年06月的时候,想法就萌生了。最开始想用React自己实现一个博客前端应用。先后也边学边用React、React Material、React Markdown实现了一个简陋的应用。大致逻辑就是前端向服务器请求Markdown原始文档,然后依赖React Markdown在前端进行markdown解析渲染及呈现。前后大概花了一个星期左右吧,马马虎虎能看,后面就没再管了,尽管我知道问题很多。特别是兼容这一块,不同的浏览器,不同的终端设备,不同的显示器分辨率以及缩放率,让我这个半吊子叫苦不迭,果然每一件事情较真起来没有一个是容易的。后来入职了一家公司,记得是在当时作自我介绍时,我有写过我有个人网站(啊哈哈,技术菜鸟的虚荣心)。后面HR访问了一下,然后在一边吐槽着这网站居然也能用?(小小的自尊心受到万点暴击)。
再到后来,大约是2022年05月份的时候,终于有时间继续折腾这个网站了。那个时候我把原因归结于我对React等前端知识不足,不是专业的以至于网站不好用,兼容性不好,加载慢,被吐槽(心理过不起的坎......>..<
)。经过网上的一番搜索,我最终又敲定了一版方案。改用C++ Web Toolkit实现网站,说干就干,结果就是一个月后不得不决定直接终止放弃。虽然说用C++来写网页,似乎看起来帮我规避了对前端不熟的短板,但是却把我带进了更深的坑。我花了一定的时间去翻看它的文档,学习示例。其实他的思路很有意思,整个框架像极了Qt,无非是在界面绘制的时候,一个是将内容写入到Windows窗口,而一个是生成即时html文档提供给browser端。那么意味着我不止得熟悉Wt得原理,更需要熟悉html这一层的知识,因为其生成的html更为原始,如果要查细节原因的话,那简直是个无底洞。
最终我又把目光朝向了Qt WebAssembly,这个是基本可以说完全屏蔽了html、css等实现细节,而且我对Qt也比较熟悉。不过在后面熟悉示例的过程中便很快发现了其中几个问题,一个是其打包出来的应用文件非常大,MB级别的。这对于移动端以及我的简陋服务器带宽来说都是不能忍受的。另一个是其大致实现思路是使用了html的canvas元素,然后在其上面绘制UI元素,确实是屏蔽了html、css细节,但是与之带来了N多缺点,一个是做不了延迟加载,必须得所有资源一次性加载完成才能显示,另一个是其不是基于DOM结构,所以对于网页的各种优化都没有,例如无障碍浏览模式以及搜索引擎的SEO等等。
最终我意识到凭借我目前的技术能力以及有限的时间,是无法去从零实现一个自己想要的网页应用的。唯一可行的就是拿来主义,直接用别人弄好的框架。最开始选用的是Material for MkDocs,这个框架最开是使用的还行,界面也受益于Material风格让人感觉比较舒心。可能有不足的就是其采用的Python-Markdown解析库对Markdown格式要求极为严格,在静态构建html文档的时候发现其很多与我之前使用Typora编辑的格式所不兼容。当然与我自己去实现,还是选择了接受妥协。一段时间后,有了想增加博客的想法,及不仅把自己的笔记放上去,也能展示某年某月自己的感想及所见所闻。但是奈何Material for MkDocs这个功能需要成为赞助者才能使用,而这个赞助费对我来说比较高昂,so只能选择放弃。
在2023年春节的时候,闲暇之余我偶发发现了Facebook的Docusaurus框架,顿时让我心中暗呼终于找到了心中所属。它刚好提供了笔记和博客的功能,而且可定制性比较强,虽然要求使用者具备一定的开发能力,不过正好之前的一顿折腾让我稍微了解了一点React的使用。退一步来说,及时开箱式的使用,我也觉得已经达到我目前的要求拉。 至此,前端展示的寻觅之路就到这里啦。再折腾下去,就会犯下为折腾工具为耗费心力却不重视内容的旁路错误了。嗯,可能已经有些过了吧,现在回想起来,一开始就应该用现成的。
使用Git存储笔记
使用Git存储笔记不算一个好办法,但也不算太差。一个是笔记修改后可以通过提交记录查看修改变更内容,另一个是我们可以配和CI实现笔记自动化部署至网站。 大致来说就是我们增删改笔记之后,将其变动推送至Git远程仓库(这里我使用的是Gitee),Git会经由Hook机制通知CI服务器(这里我使用的是Drone CI),通过CI进行自动化部署。
服务器部署
这是个人网站,当然其内容应该也无法吸引浏览者为其捐款,所以开销一贯主张能省则省,能用最低配就用最低配。