如何使用Jekyll在GitHub Pages上搭建网站(个人博客)

news2025/1/16 5:13:22

本文很长,建议使用侧边栏进行跳转。

前言

Jekyll 是一个基于 Ruby 语言的,用于搭建静态网站的生成器,主要用于搭建博客网站(官方自己的介绍为:Jekyll is a blog-aware, static site generator in Ruby)。但是虽然是静态网站,但是可以实现一些使用数据库的动态网站的效果和功能,是很不错的一个框架。官网为:https://jekyllrb.com。

虽然 Jekyll 官网提供了教学 《step-by-step》,GitHub 也提供了教学《About Github Pages and Jekyll》,但是二者需要交叉起来看,所以这个框架还是有点简单并且复杂的。并且有一些细节没有提到。
因此,写此文来记录一下。

本文将利用 GitHub Pages 和 Jekyll 搭建一个博客网站,这也是 GitHub 推荐的搭配。但是本文不阐述 Jekyll 的原理,只讲步骤。 因为这样看上去简洁一点,如果你对其他相关内容可以阅读下面列出的我的其他博客:

  • 如果想查看 Jekyll 的原理、机制和结构等内容,等还请移步另外一篇博客:《Jekyll 的机制、转换步骤和结构介绍》
  • 如果想快速查看一些常用的 Jekyll 命令还请移步:《Jekyll 选项(options)和子命令(subcommand)小手册》
  • 如果想快速查看一些常用的 Jekyll 语句和结构还请移步:《Jekyll 语句语法、功能的实现方法和结构介绍小手册》

准备工作

⚠️注意:本文使用一个基础 CSS https://stackedit.io/style.css,用来比较漂亮地展示博客。

安装Jekyll

Jekyll 安装方式非常简单,只要在终端/命令行输入以下命令即可:

gem install jekyll bundler

安装完毕之后,可以使用下面这条命令来查看安装的版本:

$ jekyll -v
jekyll 4.3.1

创建并设置GitHub pages

创建GitHub pages

安装完之后,就要创建并且设置一下 GitHub Pages 了。

创建 GitHub Pages 的方法很简单:

  1. 首先,创建一个名为用户名.github.io的 GitHub 仓库(用户名不区分大小写);
  2. 然后将这个空仓库克隆到本地。

这个时候就已经创建完毕了,可以通过https://用户名.github.io来访问了,并且可以像普通的 Git 项目一样进行处理和推送了(不过由于是空项目,所以不会显示什么,感兴趣可以自己推送一个网页看看)。

不过需要注意的是,如果后面使用/docs目录显示内容的时候,或者使用 Jekyll 操作,上传站点之后可能需要一段时间才能显示更新(官方说这个时间最长不超过一个小时)。

设置GitHub pages

接下来还要调整一下该仓库的一些设置,来方便后续的工作流程。

在该仓库的设置界面,点开“Settings”->“Pages”界面,然后在“Branch”部分选择自己想要的分支(这里是默认的main分支),然后选择/docs文件夹。这样https://用户名.github.io就会只显示/docs文件夹下的内容,而不是根文件。如下:
请添加图片描述

创建配置Jekyll的_config.yml文件

如果你是一个细心的人,会发现默认的空白仓库中是没有docs这个文件夹的。所以是需要我们手动创建的,但是 Jekyll 生成的文件夹在默认情况下是叫_site,这该怎么办呢?
如果你经常使用终端/命令行,那一定很熟悉 UNIX 命令格式命令 -选项 参数,如果你使用这种常规格式就会发现没有效果。这是因为 Jekyll 的命令并不是 UNIX 命令格式,它的参数需要去访问特定文件获得,而这个文件便是_config.yml

所以,我们在克隆到本地的空白仓库中创建一个名为_config.yml的文件(也就是仓库的根目录下),然后输入以下内容:

destination: docs

destination参数表示生成的目的文件夹名称。

更多的参数可以查看官方文档:https://jekyllrb.com/docs/configuration/options/

到这里,准备工作基本上已经完成,可以开始了。

一个简单的开始(了解工作流程)

首先来进行一个简单的开始,了解体会一下 Jekyll 的工作流程。

创建/修改文件

第一步,和所有网站一样,创建一个index.html文件(可以理解成开发的过程),内容如下:

<!DOCTYPE html>
<html>
	<head>
	    <meta charset="utf-8">
	    <title>Home</title>
  	</head>
  	<body>
    	<h1>Hello World!</h1>
  	</body>
</html>

这是一个很简单的纯 HTML 文件,没有使用到 Jekyll 语句,但是作为理解工作流程非常有效。

生成静态网站

在开发完成之后,使用终端,在仓库目录下,输入以下命令来生成我们所需的静态网站:

jekyll build

这时候就可以发现,原本只有index.html_config.yml2个文件的文件夹中,多了一个名为docs的文件夹。点开可以发现,内容就是生成的静态网站。
如果之前没有在_config.yml文件中进行设置,那么这里生成的文件夹应该名为_site

在本地进行开发和演示

但是此时你可能会想:“我每次开发完都得重新生成一次静态网站,这样如果检查细节上的修改,不得烦死人啊!而且检查网站还得搭建一个本地服务器”

Jekyll 也考虑到这点,所以需要使用下面这条简单的命令,即可满足需求:

jekyll serve

这个命令将会在http://localhost:4000运行一个本地网络服务器,并且实时进行重新生成,而不用自己去搭建服务器和手动重新生成。

完成开发之后进行推送

在完成开发之后,就可以进行常规的提交推送了。这里专门写一节是因为这里有几个问题要说一下。

第一,如果你使用的是终端,那么有时候会有一些大范围的修改,导致commit的时候需要手动删掉很多#,很麻烦,所以建议使用git commit -am来跳过文本编辑器。

第二,每次提交推送还是有点麻烦,建议写个脚本,这样就只用输入一个单词,再输入一次密码即可。脚本内容如下:

#!/bin/bash

jekyll build
git add .
git commit -am
git push myblog main

myblog部分记得改成你的仓库的地址,分支如果不是main也要记得更改。

确定网站设计

在会基础的 Jekyll 工作流程之后,就需要确定博客网站需要哪些部分和内容,例如主页上显示什么,需不需要各种专栏等等内容。然后我们就针对每个功能和内容进行开发即可。

首先确定一下博客网站需要哪几种页面。思考一下发现就需要三种:主页、博客专栏页面、博客内容页面。

然后就是思考设计。作为非 UI 专业人士,这里使用 Procreate 绘制一个大概的图,明白什么意思即可。
主页设计如下:
请添加图片描述

专栏页面的设计如下:请添加图片描述

博客页面的设计如下:
请添加图片描述

接下来依次实现即可。

实现设计

在这个时候,你的项目中应该有的文件是:文件index.html_config.yml和目录docs

本章直接列出步骤,不做过多解释。如果想了解一些步骤的含义,还请移步我的另外一篇博客《Jekyll 语句语法、功能的实现方法和结构介绍小手册》。

生成导航栏

首先是导航栏部分,因为每个页面都有这个部分。

项目根目录下,新建_data目录,在里面新建一个navigation.yml文件,然后输入以下内容:

- name: 主页
  link: /index.html
- name: SwiftUI
  link: /swiftui.html
- name: UNIX
  link: /unix.html

这里表示在导航栏中创建了三个元素:主页和两个专栏 SwiftUI、UNIX,但是这三个元素连接的页面只有“主页”目前是存在的,其他两个我们后面再创建。

然后再在根目录下,新建一个_includes目录,在里面新建一个navigation.html文件,用于生产导航栏。内容如下:

<div class="header">
    {% for item in site.data.navigation %}
        <a href="{{ item.link }}" class="headerItem">
            {{ item.name }}
        </a>
    {% endfor %}
</div>

创建页面模板

根据之前的设计,需要设计3个页面模板:默认模板、列表页面模板和博客页面模板。

通用模板default.html是所有页面的基础,因为是所有的网页都包含的代码。内容如下:

<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <title>{{ page.title }}</title>
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <link rel="stylesheet" type="text/css" href="assets/css/headerstyle.css" />
        <link rel="stylesheet" type="text/css" href="assets/css/blogstyle.css" />
    </head>
    <body>
        {% include navigation.html %}
        <div class="stackedit__html">
            {{ content }}
        </div>
    </body>
</html>

博客列表界面用于显示主页和专栏,因为结构是非常相似的。内容如下:

博客页面模板article.html的内容如下:

<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <title>{{ page.title }}</title>
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <link rel="stylesheet" type="text/css" href="/assets/css/blogslist.css" />
        <link rel="stylesheet" type="text/css" href="/assets/css/headerstyle.css" />
        <link rel="stylesheet" type="text/css" href="/assets/css/blogstyle.css" />
        <style type="text/css">

        </style>
    </head>
    <body>
        <div class="stackedit__html">
            {% include navigation.html %}
            <h1>{{ page.title }}</h1>
            <div class="bloginfo">
                <p class="info">{{ page.date | date: "%Y-%m-%d" }} <a href="">{{page.column}}</a></p>
                
            </div>
            
            {{ content }}
        </div>
    </body>
</html>

实现博客分栏

如果需要详细的介绍,或者遇到下面解释不了的问题,还请移步《Jekyll 语句语法、功能的实现方法和结构介绍小手册》的相关部分。

首先需要在每篇博客的前事项(front matter)中加上category属性,如下:

---
layout: article
category: SwiftUI
---

然后,在根目录创建swiftui.html文件,用于显示 SwiftUI 相关的博客。其内容如下:

---
layout: default
title: SwiftUI
---
<h1>{{ page.title }}</h1>

<ul>
    {% for post in site.posts %}
    	{% if post.category == "SwiftUI" %}
		    <li>
		        <h2><a href="{{ post.url }}">{{ post.title }}</a></h2>
		        {{ post.excerpt }}
		    </li>
		{% endif %}
    {% endfor %}
</ul>

然后继续在根目录下创建unix.html文件,用于显示 UNIX 相关的博客。内容如下(与上面相似):

---
layout: default
title: UNIX
---
<h1>{{ page.title }}</h1>

<ul>
    {% for post in site.unix %}
    {% if post.category == "UNIX" %}
		    <li>
		        <h2><a href="{{ post.url }}">{{ post.title }}</a></h2>
		        {{ post.excerpt }}
		    </li>
		{% endif %}
    {% endfor %}
</ul>

这时候就实现了分栏。运行一下jekyll server访问http://127.0.0.1:4000看看效果。如下:
请添加图片描述

博客页面

博客页面不用特别操作,只要按照上文设置了博客页面模板,并且放置在指定的位置,那么就会根据模板自动生成页面,如下:
请添加图片描述

好啦,这样自己的博客网站就搭建好啦,也很容易更新。

希望能帮到有需要的人~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/19067.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

html制作网页案例代码----(故宫博物馆9页)特效很多

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 茶文化网站 | 中华传统文化题材 | 京剧文化水墨风书画 | 中国民间年画文化艺术网站 | 等网站的设计与制作 | HTML期末大学生网页设计作业&#xff0c;We…

Tauri+Vite+Vue3创建项目步骤

1、按照官网文档创建tauri项目 npm create tauri-app 然后按顺序填&#xff1a; 1、项目名称&#xff1a; 2、选择你的package manager 3、选择你的前端框架 然后再一步一步执行下面命令 cd 刚才创建的项目名称 npm install npm run tauri dev 然后出现 第一次可能没有反…

基于java+ssm的理论课_考勤,作业,签到管理系统

本理论课管理系统采用目前最流行的ssm框架和eclipse编辑器、mysql数据库设计并实现的 。主要包括登录模块、课程信息管理模块、考勤信息管理模块、成绩管理模块、和退出模块等多个模块 本系统基于SSM(SpringSpringMVCMyBatis)框架,适用于毕业设计&#xff0c;采用javaweb,基于B…

Android 驾车出行路线规划

好久没有写了&#xff0c;今天又是加班的一天&#xff0c;先随便写点东西吧。 最近在搞一款自驾游的项目&#xff0c;需要用到地图&#xff0c;扒了点高德上的数据&#xff0c;便集成了高德地图SDK。之前的项目大部分都只是用了定位&#xff0c;其中有一款也用了地图poi的搜索…

js的promise的究竟是同步还是异步的问题和promise.all可以同时请求多个接口是错误的回答的原因

个人理解 前景-代码输出结果是什么 我们都知道,循环队列的时候,同步任务大于异步任务(异步任务里面的微任务又大于宏任务),那么你猜猜这个代码输出结果是 什么呢 <script>setTimeout(() > {console.log(1); }, 0);new Promise(function(resolve,reject){console.lo…

各省市ZF工作BG环境规制环境词汇词频分析(2009-2019年)

各省市ZF工作报告及环境词汇词频分析 1、时间&#xff1a;2009-2019年 2、说明&#xff1a;环保词频汇总分析&#xff1a;通过手工搜集整理出2009-2019年全国31个省ZF工作报告中环境规制相关的环保词汇及环保词频。 3、词汇包括&#xff1a; 环境保护、环保、污染、能耗、减…

NeurIPS 22|四分钟内就能训练目标检测器!( AGVM)

文章目录引言方法介绍实验过程结果分析引言 来自商汤的基模型团队和香港大学等机构的研究人员提出了一种大批量训练算法 AGVM&#xff0c;该研究已被NeurIPS 2022接收。 本文提出了一种大批量训练算法 AGVM (Adaptive Gradient Variance Modulator)&#xff0c;不仅可以适配于…

Shell脚本

文章目录Shell脚本学习1. Shell概念1.1Shell脚本的好处1.2 Shell脚本的入门1.2.1 Linux环境中默认Shell版本1.2.2 Shell脚本1.2.3 编写简单的hello,world 脚本1.2.4 Shell 脚本的多种执行方法1.2.4.1 第一种 bash 或 sh 加文件的路径1.2.4.2 第二种 文件的路径直接执行1.2.4.2.…

Day07--wxs的概念以及其基本的用法

一.概念 1.啥子是wxs呢&#xff1f; *****************************************************************************************************************************************************************************************************************************…

【附源码】Python计算机毕业设计特大城市地铁站卫生防疫系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

数字电路和模拟电路-10时序逻辑电路的分析和设计

前言&#xff1a;学习同步时序逻辑电路的分析、设计 一、同步时序逻辑电路的分析 1、时序逻辑电路的分析步骤 步骤一 逻辑图 同步or异步 计数器or状态机 一条总线同步&#xff0c;多条总线是异步 计数器无输入&#xff0c;状态机有输入 状态机还分摩尔型和米里型 步骤二 驱动…

力扣(LeetCode)17. 电话号码的字母组合(C++)

回溯 将 222——999 和字母对应起来&#xff0c;用字符串数组保存。 递归遍历 digitsdigitsdigits 每一个数字&#xff0c;每一个数字对应的字母&#xff0c;又可以递归遍历&#xff0c;和下一个数字的字母组成排列。当排列长度等于 digitsdigitsdigits 的长度&#xff0c;就…

详解MySQL非常重要的日志—bin log

前言 bin log想必大家多多少少都有听过&#xff0c;它是MySQL中一个非常重要的日志&#xff0c;所以各位架构师们&#xff0c;如果有不了解的&#xff0c;一定要好好学习了&#xff0c;因为它涉及到数据库层面的主从复制、高可用等设计。 bin log是什么&#xff1f; bin log…

【博客538】BGP优雅重启机制

bgp优雅重启机制 背景 以BGP为代表的路由协议&#xff0c;从设计之初&#xff0c;就关注路由表的正确性&#xff0c;因为这是确保整个网络系统正常工作的最基本要求。因此每个BGP路由器&#xff0c;总是会以最快的速度收敛到整个网络最新的状态上。当一个BGP peer的BGP连接断开…

一种PEG衍生物Azide-PEG-Biotin|N3-PEG-Biotin|叠氮-PEG-生物素|956748-40-6

1、名称 英文&#xff1a;N3-PEG-Biotin&#xff0c;Azide-PEG-Biotin 中文&#xff1a;叠氮-聚乙二醇-生物素 2、CAS编号&#xff1a;956748-40-6 3、所属分类&#xff1a; Azide PEG Biotin PEG 4、分子量&#xff1a;可定制 5、质量控制&#xff1a;95% 6、储存&…

[附源码]java毕业设计食堂线上点餐系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

玩转MySQL:命令大全~忘记了SQL该怎么写就回来看看~

引言 相信大家在编写SQL时一定有一个困扰&#xff0c;就是明明记得数据库中有个命令/函数&#xff0c;可以实现自己需要的功能&#xff0c;但偏偏不记得哪个命令该怎么写了&#xff0c;这时只能靠盲目的去百度&#xff0c;以此来寻找自己需要的命令。 时间是最厉害的武器&…

Anaconda3安装部署(二) 百篇文章学PyQT

本文章是百篇文章学PyQT的第二篇&#xff0c;本文讲述如何安装Anaconda3工具&#xff0c;Anaconda3 在安装过程中会遇到很多问题&#xff0c;博主在本篇文章中将遇到和踩过的坑总结出来&#xff0c;可以供大家参考&#xff0c;希望大家安装顺利。包括 安装、遇到问题的解决方案…

实战十八:通过ItemKNN算法实现基于协同过滤的商品推荐 代码+数据

项目概述: 推荐系统任务描述:通过用户的历史行为(比如浏览记录、购买记录等等)准确的预测出用户未来的行为;好的推荐系统不仅如此,而且能够拓展用户的视野,帮助他们发现可能感兴趣的却不容易发现的item;同时将埋没在长尾中的好商品推荐给可能感兴趣的用户。ItemKNN推荐…

【专栏】基础篇05| Redis 该怎么保证数据不丢失(下)

前言 上一小节我们讲了AOF是什么以及它是如何保证Redis的Crash Safe的&#xff0c;这一节我们再来看一看Redis的RDB和AOF有何不同&#xff0c;两者是怎么样的关系 RDB的工作模式 RDB全称Redis Database&#xff0c;我们也常叫做Redis的内存快照&#xff0c;它与AOF最大的不同在…