博客建站历程记录

2026-04-01

本文简短记录了从零开始用原生前端+Node.js搭建博客的历程,涵盖HTML/CSS/JS实现、前后端交互、服务器部署。

前言

在我还在上高中的时候,拥有一个网站在我看来是十分难的、酷炫的、极客的。后来发现前端有框架,后端有一站式服务,有静态页面托管。

不过我还是想体验一番从零开始的搭建流程,于是找b站上的前端教程跟着走了一遍,边学边写,在Deepseek老师的帮助下勉强完成了,包含大量屎山。

需要提醒,本文仅展示路线记录和简介(和吐槽),并不提供具体的搭建或编程教程。

想要借鉴这个项目的朋友,该项目已开源,欢迎fork。

HTML

最简单的一集。

众所周知,作为一个标记语言,HTML是网页的骨架,其结构决定了网页的基本框架。

我的网页结构采用最典型的F型布局:上方导航栏下方页脚,中间为内容区。内容区又细分为介绍边栏和文章列表。

CSS

重点其一。

现代页面美化离不开层叠样式表这个大山。想要精通CSS还是很有难度的,不过浅学习一下用来做小项目已经足够了。

前文所描述的布局可以使用CSS里的float实现,为了实现响应式,我在大板块之间使用flex布局,剩下的细枝末节则看情况随机应变。

/* 内容区 */
.main {
    width: 100%;
    margin: 0 auto;
    display: flex;
    flex-direction: row;
    justify-content: center;
}

内容区全部卡片式设计,美观的同时还能提高代码复用率。

响应式布局使用媒体查询实现,这样一个页面同时兼顾PC端和移动端。读者如果使用PC浏览器观看,可以缩小浏览器窗口来测试。

/* 媒体查询其一 */
@media screen and (max-width:1600px) {
    .sidebar {
        display: none;
    }

    #searchInput {
        display: none;
    }

    .list {
        display: inline-block;
    }

    .modal-content {
        height: 50vh;
        width: 60vw;
        margin: -25vh 0 0 -30vw;
    }

    .modalHtml {
        height: 30vh;
    }
}

将主页的主要布局和样式写好之后,直接复制到各个页面里,只进行小修改以适配,避免更多的重复敲键盘。每个页面再单独设计一个CSS文件来实现不同的效果。

文章的美化方面采用github-markdown-css和highlight库。不过好像有点bug

JavaScript

重点其二。

学过其他的语言再来看js会发现js的语法真挺简单,并且如其名,带有很多Java的特色。

实现这个项目并没有使用多么高级的js技巧,主要是BOM和DOM操作。没有接触框架的我感觉DOM操作也没有网上很多人说的那么麻烦。

/* 这里列举了PC端导航栏的自动缩回功能 */
const navColor = document.querySelector('.nav-color')
const navColorCover = document.querySelector('.nav-color-cover')

navColor.classList.add('navShow')

window.addEventListener('scroll', function () {
    if (window.innerWidth > 1300) {
        const y = this.document.documentElement.scrollTop

        if (y <= 800) {
            navColor.classList.add('navShow')
            navColorCover.classList.add('navCoverHidden')
        } else {
            navColorCover.classList.remove('navCoverHidden')
            navColor.classList.remove('navShow')
        }
    }
})

前后端交互和Node.js

仅仅做一个静态页面当然满足不了我的需求。我将主要页面渲染放在前端,后端使用Node.js进行数据返回。

要说网络请求,就绕不开XHR或者Fetch,我这里使用前者的封装库:Axios。

// 基本使用方法
axios({
    url: '/api/abc'
}).then(result => {
    // ···
})

前端获取数据后,处理完毕便直接渲染在页面上。主要请求包括获取文章列表,提交搜索词等。

后端运行一个server.js来处理前端提交的请求。为了区别图像、网页、api等请求,在内部使用字符串处理,并返回对应的数据。

这里可以说是最花时间的部分,也是请教D老师最频繁的部分,也是屎山最多的部分。设计什么样的数据格式,怎么返回数据,如何处理,都是D老师教的,AI还是太便利了.jpg。

文章格式

博客使用Markdown编写文章,并在处理后在前端渲染为HTML。这依靠markdown-it.js和highlight.js两个库。

随笔使用txt格式保存。

每次更新文章后,运行一个update.js来更新一个json文件。这个json文件用于提交给前端渲染文章列表、文章简介和随笔列表。

// 部分JSON
{
  "posts": [
    {
      "type": "article",
      "name": "a1",
      "title": "博客建站历程",
      "date": "2026-04-01 00:00:00",
      "categories": [
        "技术"
      ],
      "tags": [
        "前端",
        "博客",
        "记录"
      ],
      "excerpt": "本文简短记录了我从零开始,使用原生前端开发并建立博客的路程。"
    }
    // ···
  ]
}

本地的代码基本上已经完成了,接下来就是把东西全部搬到服务器上运行。

服务器,域名和nginx配置

一开始我还在为项目即将上线而欣喜,等到我鼓捣服务器整整两天过后,只想对两天前的我说“喂前面可是地狱啊”。

“国内的网站当然要用国内的服务器”怀着守序善良的观点,我购买了境内某地服务器,然后兴冲冲访问IP的时候,“您的域名尚未添加至白名单导致无法访问”直接糊我脸上。

查找半天方法,好吧要我先给网站备案。幸好雨云的服务器可以七天无理由退款,于是我退款买了另一个中国香港的服务器。

把项目全部放在服务器上后,配置nginx才是噩梦。因为我的博客是Node.js全栈,后端在本地测试时跑的是localhost,这直接导致我不管怎么配置,请求就是没法正确转发。

最后搞得我恼火,把宝塔面板给卸载了,使用Ubuntu和远程链接,D老师和豆老师轮番上阵才跑通。

后记

本来只是想有一个可以记录自己学习路程的地方,思来想去还是决定搞一个博客看看,没想到最终还是让我做出来了。这篇文章也是学习路程的一部分,作为博客的第一篇还挺合适。

如读者所见,这个博客还很简陋,不过作为发布文章的地方已经足够了,以后我会慢慢修补。

切换到深色模式