还在用Hexo吗?来试试Gatsby搭建一个网站吧!

  • 本文首发于个人博客网站:http://www.blog.lekshome.top/2024/08/20/shi-yong-gatsby-da-jian-ge-ren-wang-zhan/
  • 由于CSDN并不是本人主要的内容输出平台,所以大多数博客直接由md文档导入且缺少审查和维护,如果存在图片或其他格式错误可以前往上述网站进行查看
  • CSDN留言不一定能够及时回复,请前往本人博客中进行留言
  • 您的留言和点赞是对我的最大支持!

Gatsby 是一个基于 React 的、免费开源的、用于搭建静态站点的框架。

官网:https://www.gatsbyjs.com/docs/

前言


最近发现了一个好看的个人主页模板,是用Gatsby搭建的,之前没听说过这个框架,也没有React经验,所以踩了很多坑,为了加一个不蒜子功能整了两天才整明白……但是gatsby的官方文档我觉得写得是很好的,最终结果也是令我比较满意的,所以跟着我的脚步避开这些坑开始愉快的Gatsby体验吧!

最终结果可以去我的个人网站看下:http://www.lekshome.top/

开源地址:https://github.com/LeKZzzz/lekshome
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1. 配置


我的环境如下:

  • Ubuntu 20.04
  • Node.js v20.9.0
  • Gatsby-CLI 5.13.3
  1. 环境配置

    1. Node.js(Gatsby v5需要Node.js v18 或更高版本,但低于 v21)

      sudo apt-get install curl
      curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
      nvm install 20.9.0
      
    2. Git

      这部分网上很多,就不演示了

    3. Gatsby CLI

      npm install -g gatsby-cli
      

      可以运行gatsby --version检查版本是否正确

  2. 网站模板

    这部分我用的是https://github.com/bchiang7/v4的网站模板,接下来也会以此为演示。

    1. clone模板

      可以先创建一个独立文件夹然后再clone

      mkdir website
      cd website
      git clone https://github.com/bchiang7/v4.git
      cd v4
      
    2. 下载必要模块

      请先删除yarn.lock文件

      rm yarn.lock
      npm install gatsby-plugin-robots-txt@1.6.14
      npm install
      
  3. 配置socket.io的端口环境变量

    端口可以自行设定,但是请确保这个端口在防火墙是放开的

    https://www.reddit.com/r/gatsbyjs/comments/krifvb/gatsby_randomize_socketio_port_breaking_vagrant/

    vim ~/.bashrc# 文件末尾添加
    export INTERNAL_STATUS_PORT=1234source ~/.bashrc
    
  4. 验证是否可以正常启动

    gatsby develop --host=0.0.0.0
    

    在这里插入图片描述

    出现这些输出同时可以在浏览器中可以访问则说明环境配置正确

2. DIY网站


基本配置


  1. gatsby-config.js

    这里可以修改你的网站title、网站描述、siteUrl等

  2. src/config.js

    这里可以修改你的邮箱、社交媒体账号、添加nav导航的元素等

  3. static/resume.pdf

    可以将这个文件替换为你的简历

  4. src/images/me.jpg

    可以将这个文件替换为你的个人照片

  5. src/components/sections/about.js

    在这个文件中可以修改个人介绍

  6. src/components/sections/contact.js

    在这个文件中可以修改邮件联系文本

  7. src/components/sections/hero.js

    在这个文件中可以修改开屏介绍文本

logo配置


默认logo是英文字母B,如果我们需要改成我们自己的首字母则需要花费一点功夫。

  1. 首先需要去figma绘制一个首字母的文本,我的设置如下:

    在这里插入图片描述

  2. 然后导出为svg

    在这里插入图片描述

  3. 修改src/components/icons/loader.js

    用刚刚导出的svg的path标签的d属性修改loader.js文件中path标签的d属性,然后修改g标签中的transform属性,transform属性需要根据实际结果手动调整为合适数值

  4. 修改src/components/icons/logo.js

    将修改过后的src/components/icons/loader.js文件中的<g>标签及其子标签复制替换src/components/icons/logo.js中的<path>标签及其子标签

  5. 修改src/images/logo.png

    这个是标签栏上的logo,可以参考他原有的图片,将代码生成的logo截图再裁剪得到

    由于手头没有修图软件,我是用PPT裁剪的huh:)

footer配置(不蒜子)


在这里插入图片描述

  1. footer文本

    这部分可以根据个人喜好进行修改,我的修改如下

    import React, { useState, useEffect } from 'react';
    import PropTypes from 'prop-types';
    import styled from 'styled-components';
    import { Icon } from '@components/icons';
    import { socialMedia } from '@config';const StyledFooter = styled.footer`${({ theme }) => theme.mixins.flexCenter};flex-direction: column;height: auto;min-height: 70px;padding: 15px;text-align: center;
    `;const StyledSocialLinks = styled.div`display: none;@media (max-width: 768px) {display: block;width: 100%;max-width: 270px;margin: 0 auto 10px;color: var(--light-slate);}ul {${({ theme }) => theme.mixins.flexBetween};padding: 0;margin: 0;list-style: none;a {padding: 10px;svg {width: 20px;height: 20px;}}}
    `;const StyledCredit = styled.div`color: var(--light-slate);font-family: var(--font-mono);font-size: var(--fz-xxs);line-height: 1;a {padding: 10px;}.github-stats {margin-top: 10px;& > span {display: inline-flex;align-items: center;margin: 0 7px;}svg {display: inline-block;margin-right: 5px;width: 14px;height: 14px;}}
    `;const StyledSecond = styled.div`color: var(--light-slate);font-family: var(--font-mono);font-size: var(--fz-xxs);line-height: 1;a {padding: 10px;}a:hover{cursor:default;}.github-stats {margin-top: 10px;& > span {display: inline-flex;align-items: center;margin: 0 7px;}svg {display: inline-block;margin-right: 5px;width: 14px;height: 14px;}}
    `;const Footer = () => {const [githubInfo, setGitHubInfo] = useState({stars: null,forks: null,});const [githubInfo2, setGitHubInfo2] = useState({stars: 0,forks: 0,});useEffect(() => {const fetchGitHubData = async () => {try {await Promise.all([fetch('https://api.github.com/repos/bchiang7/v4').then(response => response.json()).then(data => {setGitHubInfo({stars: data.stargazers_count,forks: data.forks_count,});}),fetch('https://api.github.com/repos/LeKZzzz/lekshome').then(response => response.json()).then(data => {setGitHubInfo2({stars: data.stargazers_count,forks: data.forks_count,});})]);} catch (e) {console.error('获取 GitHub 仓库信息时出错:', e);}};fetchGitHubData();// buusanziconst script = document.createElement('script');script.async = true;script.src = "https://busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js";document.head.appendChild(script);}, []);return (<StyledFooter><StyledSocialLinks><ul>{socialMedia &&socialMedia.map(({ name, url }, i) => (<li key={i}><a href={url} aria-label={name}><Icon name={name} /></a></li>))}</ul></StyledSocialLinks><StyledCredit tabindex="-1"><a href="https://github.com/bchiang7/v4"><div>Built by Brittany Chiang |</div>{githubInfo.stars && githubInfo.forks && (<div className="github-stats"><span><Icon name="Star" /><span>{githubInfo.stars.toLocaleString()}</span></span><span><Icon name="Fork" /><span>{githubInfo.forks.toLocaleString()}</span></span></div>)}</a><a href="https://github.com/LeKZzzz/lekshome"><div>| Customized by LeK</div>{githubInfo.stars && githubInfo.forks && (<div className="github-stats"><span><Icon name="Star" /><span>{githubInfo2.stars.toLocaleString()}</span></span><span><Icon name="Fork" /><span>{githubInfo2.forks.toLocaleString()}</span></span></div>)}</a></StyledCredit><StyledSecond tabindex="-1"><a><div>Last update on 2024/08/15 |</div></a><a><div>| Total visits <span id="busuanzi_value_site_pv"></span> times</div></a></StyledSecond><StyledCredit tabindex="-1"><div align="center"><a href="https://beian.miit.gov.cn/" target="_blank">ICP2022018241</a></div></StyledCredit></StyledFooter>);
    };Footer.propTypes = {githubInfo: PropTypes.object,
    };export default Footer;
  2. 不蒜子

    我应该是国内第一个在这个模板里集成不蒜子的,这个功能折磨了我三天,不蒜子的一般使用方法是使用一个<script>标签,但是由于这个模板完全右js构建,所以普通的方法是无法正确访问不蒜子的;而且由于网页元素是js动态写入的,所以不能通过导入的方式导入不蒜子;我发现只能从useEffect入手,然后仔细看了代码发现模板原有的star和fork获取是没有展示出来的,于是又多了个要改的地方……为此我还专门提了个issue,提完的下午发现是NODE_ENV没有正确配置而提前return了,导致后面的代码都没有执行……export NODE_ENV之后再运行,结果gatsby报错无法正常启动……最后还是选择把这个环境判断给注释掉,后面footer就能正常使用了。但是后面还遇到了异步问题,就不多赘述了。唉,花了三天时间来找问题和debug。

工作经历配置


  1. 修改content/jobs中的文件夹

    每个工作经历要新建一个文件夹

  2. 进入文件夹,添加index.md文件

  3. 配置index.md文件,如下例

    ---
    date: '2024-07-10'
    title: 'Software Development Intern'
    company: 'CSAIR'
    location: 'Guangzhou, China'
    range: 'July - August 2024'
    url: 'https://www.csairgroup.cn/cn/'
    ---
    
    • date:决定jobs展示时的先后顺序
    • title:职位
    • company:公司
    • location:工作地点
    • range:工作开始时间和结束时间
    • url:公司官网链接

个人作品配置


  1. 修改content/featured文件夹

    这个文件夹是关于个人作品最上方展示Featured Project的,添加方式为在featured文件夹中新建文件夹再新建一个index.md

    ---
    date: '1'
    title: 'Wholz'
    cover: './wholz.png'
    github: 'https://github.com/LeKZzzz/wholz'
    external: 'https://github.com/LeKZzzz/wholz'
    tech:- Java- Python- HTML- CSS- Vue- Unity3D- MySQL
    ---Using VR virtual reality as a carrier, an immersive learning environment is created. Teaching videos are combined with 3D models to realize the visualization of mind map nodes. Users can interact with the LLM to realize real-time question and answer, making the learning content more vivid and intuitive.
    • date:决定展示顺序,越小优先级越高
    • title:project的名字
    • cover:project图片
    • github:指向github地址
    • external:跳转链接
    • cta:使用cta则使用“learn more”按钮来跳转链接
    • tech:标签
  2. 修改content/projects文件夹

    以原有文章为例

    ---
    date: '2019-11-12'
    title: 'Moms Demand Action Mobile App'
    github: ''
    external: 'https://www.upstatement.com/work/moms-demand-action/'
    ios: 'https://apps.apple.com/us/app/demand-action/id1475502876'
    android: 'https://play.google.com/store/apps/details?id=com.momsdemandaction.app'
    tech:- NativeScript Vue- iOS- Android
    company: 'Upstatement'
    showInProjects: false
    ---简介
    
    • date:时间
    • title:标题
    • github:指向github的链接
    • external:跳转链接
    • ios:appstore链接
    • android:google play链接
    • tech:标签
    • company:公司
    • showInProjects:是否在网站首页展示,否则只有/archive里才能看见

    改成中文后不知道为什么一行只有一个project,所以我的网站删去了这部分内容,只保留了archive的跳转

icon配置


  1. src/components/icons中添加新icon的js文件
  2. 仿照已有icon的js文件,将新icon的svg写入新文件
  3. src/components/icons/icon.js中添加新的Icon组件和映射
  4. 在src/components/icons/index.js中添加新的组件
  5. 在src/config.js中添加新的social图标和链接

写在最后


环境问题真是消耗了我很长时间,因为我本是没有接触过react的,所以很多地方都得现查,写这篇博客也是希望读者能少踩我踩过的坑。

模板作者Brittany Chiang着重提到**“ All I ask of you all is to not claim this effort as your own.”**,所以请不要使用这个模板而声称是自己原创,这种行为只会消耗开源作者的热情,所以请保持在footer链接到Brittany Chiang的开源仓库。

推荐阅读

  • https://www.gatsbyjs.com/docs/tutorial/getting-started/
  • https://juejin.cn/post/6844903999024398343
  • https://juejin.cn/post/7166235513446203422
  • https://www.junhan.xyz/blog/2021/10-02-web-view-counter

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Halcon灰度图像的形态学运算

Halcon灰度图像的形态学运算 本文介绍的算子的输入类型是灰度的Image图像。 1. 灰度图像与区域的区别 基于区域的形态学运算与基于灰度图像的形态学运算的根本区别在于&#xff0c;二者输入的对象不同。前者输入的是一些区域&#xff0c;并且这些区域是经过闽值处理的二值图…

一文搞懂大模型在多GPU环境的分布式训练!

随着大模型时代的到来&#xff0c;模型参数量、训练数据量、计算量等各方面急剧增长。大模型训练面临新的挑战&#xff1a; 显存挑战&#xff1a;例如&#xff0c;175B的GPT-3模型需要175B*4bytes即700GB模型参数空间&#xff0c;而常见的GPU显存如A100是80G显存&#xff0c;这…

visual studio使用技巧:快速生成Json、XML对应类

visual studio快速生成Json、XML对应类 在项目中经常用到json或者xml作为配置文件&#xff0c;进行序列化和反序列化就需要有对应的类&#xff0c;重新写一遍类就比较麻烦&#xff0c;这里就讲一下通过visual studio快速生成json或者xml对应类型的方法。 自动生成Json类 复制…

图像数据处理17

四、形态学图像处理 4.3 开运算与闭运算 4.3.1开运算与闭运算的定义&#xff1a; 开运算&#xff1a;先腐蚀&#xff0c;再膨胀 闭运算&#xff1a;先膨胀&#xff0c;再腐蚀 记忆方法&#xff1a;膨胀&#xff08;胀开&#xff09;所以开运算最后对应的结果是膨胀&#x…

c++进阶——继承的定义,复杂的菱形继承及菱形虚拟继承

目录 前言&#xff1a; 1.继承的概念及定义 1.1继承的概念 1.2 继承定义 1.2.2继承关系和访问限定符 1.2.3继承基类成员访问方式的变化 2.基类和派生类对象赋值转换 3.继承中的作用域 4.派生类的默认成员函数 5.继承与友元 6. 继承与静态成员 7.复杂的菱形继承及菱…

springsecurity 登录认证一(ajax)

一、准备工作 1.1 导入依赖 因springboot 3.0 以上版本只能支持java17 顾使用2.5.0 版本 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.0</version><…

网络工程3(子网通信,为什么要使用mac和ip)

文章目录 一. 子网如何通讯1. 子网内部通信2. 子网外部通信 二. 交换机和路由器的连接三. 为什么不只使用mac地址或ip地址进行网络通信1. 首先要明确的是&#xff0c;不管是只用mac或只用ip通信 四. 子网设备如何获得ip五. 不同网段的主机无法直接通信的原因 一. 子网如何通讯 …

音频矩阵主要功能及常规路数配置有哪些

音频矩阵&#xff0c;又称AUDIO矩阵或音频矩阵切换器&#xff0c;是一种用于管理和控制多个音频信号的设备。它具备多种功能&#xff0c;主要可以概括为以下几个方面&#xff1a; 一、主要功能 信号切换&#xff1a; AUDIO128128音频矩阵能够将多个音频源的信号输入到设备中&…

Python实现水果忍者(开源)

一、整体介绍&#xff1a; 1.1 前言&#xff1a; 游戏代码基于Python制作经典游戏案例-水果忍者做出一些改动&#xff0c;优化并增加了一些功能。作为自己Python阶段学习的结束作品&#xff0c;文章最后有源码链接。 1.2 Python主要知识&#xff1a; &#xff08;1&#xf…

怎么选开放式耳机好?精选五款物超所值机型推荐!

耳机已成为我们日常生活中的常见伙伴&#xff0c;无论是听音乐、玩游戏还是看剧&#xff0c;都离不开它。市场上耳机品牌和款式众多&#xff0c;找到一款真正适合自己的并不容易。尤其是长时间佩戴传统入耳式耳机可能会感到耳朵不舒服或闷热。开放式耳机因其非侵入式设计&#…

运维学习————Linux环境下Tomcat的部署

目录 一、环境准备 二、 启动测试 三、访问端口修改 四、部署web项目 1、材料准备 2、部署 2.1、上传war包到webapps目录下 2.2、修改项目配置 2.3、浏览器访问 引申 一、环境准备 tomcat安装包&#xff1a;apache-tomcat-9.0.52 JDK环境&#xff1a; 我使用的y…

MATLAB口罩检测系统

一、应用背景 作为数字图像处理和计算机视觉领域的一个重要组成部分&#xff0c;利用摄像机对图像进行采集&#xff0c;从图像中检测人脸并进行口罩穿戴的识别的有着非常重要的研究意义和应用价值。面对突如其来的新型肺炎疫情&#xff0c;人们生活秩序被严重打乱。跟普通流感…

LeetCode.80.删除有序数组中的重复项II

题目描述&#xff1a; 给你一个有序数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使得出现次数超过两次的元素只出现两次 &#xff0c;返回删除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须在 原地 修改输入数组 并在使用 O(1) 额外空间…

idea 修改背景图片教程

&#x1f30f;个人博客主页&#xff1a;意疏-CSDN博客 希望文章能够给到初学的你一些启发&#xff5e; 如果觉得文章对你有帮助的话&#xff0c;点赞 关注 收藏支持一下笔者吧&#xff5e; 阅读指南&#xff1a; 开篇说明修改背景图片 开篇说明 给小白看得懂的修改图片教程&…

物流抓取机器人整体设计方案

一、功能简介 1、运行环境&#xff1a;巡线行驶&#xff08;7路数字循迹&#xff0c;麦克纳姆轮车底盘&#xff09; 2、目标识别&#xff1a;颜色识别&#xff08;Maix-II Dock 视觉模块&#xff09; 3、目标定位&#xff1a;视觉测距&#xff08;Maix-II Dock 视觉模块&#x…

【RPA学习天地:财务网银RPA方案】各银行网银(工行、招行、苏州银行等)流水和回单下载

RPA学习天地&#xff08;https://www.rpa-learning.com/&#xff09; 前言&#xff1a; 自 2021 年起&#xff0c;RPA 学习天地已成功为来自各个行业的数千名学员赋予了 RPA 技能。通过对众多学员在自动化需求方面的深入探究&#xff0c;我们发现财务的资金领域中与网银相关的…

【iOS】—— JSONModel

JSONModel源码 1. JSONModel介绍2. JSONModel的其他用法2.1 转换属性名称2.2 自定义错误 3. 源码分析3.1 - (id)initWithDictionary:(NSDictionary*)dict error:(NSError**)err3.2 JSONModel持有的数据3.3 load3.4 JSONModel的init方法3.5 __inspectProperties方法3.6 JSONMode…

8月19日笔记

http隧道搭建(续) ABPTTS安装使用 一款基于 SSL 加密的 HTTP 端口转发工具&#xff0c;全程通信数据加密&#xff0c;比 reGerog 都要稳定。使用 python2 编写&#xff0c;但是该工具只支持 aspx 和 jsp 脚本的网站。 下载地址&#xff1a;https://github.com/nccgroup/ABPTT…

测试报告---自动化测试

一、测试用例 上文铺垫了基础知识。 https://blog.csdn.net/m0_74876421/article/details/141307905https://blog.csdn.net/m0_74876421/article/details/141307905 二、性能测试 1.准备功能&#xff1a; 浏览器驱动以及selenim包 引入依赖&#xff1a;在pom.xml文件中添加…

selenium底层原理详解

目录 1、selenium版本的演变 1.1、Selenium 1.x&#xff08;Selenium RC时代&#xff09; 1.2、Selenium 2.x&#xff08;WebDriver整合时代&#xff09; 1.3、Selenium 3.x 2、selenium原理说明 3、源码说明 3.1、启动webdriver服务建立连接 3.2、发送操作 1、seleni…