Astro 搭建博客系列:添加 giscus 评论系统

news2024/11/25 15:40:59

Astro 支持动态插入 script,所以为集成 giscus 提供了便利。我们需要探究两个问题:

  • 选用什么作为 页面 -> discussion 的映射?
  • 如何做到动态切换主题?
    我们的文章详情链接是 http://127.0.0.1:3000/posts/[post-title] 的形式,因此可以只取 post-title 作为 页面 -> discussion 的映射, 这样也保证了一篇文章对应一个评论。

要实现动态切换主题,就需要用到 postMessage 跨页面通信,因为 giscus 是以 iframe 的形式嵌入到页面中的, 我们可以使用 iframe.contentWindow.postMessage 的方法来告诉 giscus 插件动态更换主题。

实现思路有了,接下来一步一步实现。

步骤 1,获取 giscus 配置

登入 giscus 网站,按照说明选择自己的配置,其中,需要注意的是:

  • 页面和 discussion 映射关系:选择 og:title 的形式

在这里插入图片描述

  • Discussion 分类选择 General
    在这里插入图片描述
    填写完成后你会获得如下配置,关注[repo][repo_id][category_id][lang]
<script
  src="https://giscus.app/client.js"
  data-repo="[repo]"
  data-repo-id="[repo_id]"
  data-category="General"
  data-category-id="[category_id]"
  data-mapping="og:title"
  data-strict="0"
  data-reactions-enabled="0"
  data-emit-metadata="0"
  data-input-position="top"
  data-theme="light"
  data-lang="[lang]"
  data-loading="lazy"
  crossorigin="anonymous"
  async
></script>

步骤 2,新建环境变量文件 .env

为了隐私和安全,将步骤 1 中获取的关键参数,用环境变量的形式存储起来

# Giscus Config
GISCUS_REPO=[repo]
GISCUS_REPO_ID=[repo_id]
GISCUS_CATEGORY_ID=[category_id]
GISCUS_lang=[lang]

步骤 3,编写 Comment.astro 组件

新建 src/components/Comment.astro

---
const pathname = decodeURIComponent(Astro.url.pathname || ""); //解码
const postName = pathname?.split("/").pop();
const { GISCUS_REPO, GISCUS_REPO_ID, GISCUS_CATEGORY_ID, GISCUS_lang } =
  import\u002Emeta.env;
---

<meta
  data-giscus_repo={GISCUS_REPO}
  data-giscus_repo_id={GISCUS_REPO_ID}
  data-giscus_category_id={GISCUS_CATEGORY_ID}
  data-giscus_lang={GISCUS_lang}
  id="giscus-meta"
/>
<meta property={`og:${postName}`} />
<script>
  const {
    giscus_repo = "",
    giscus_repo_id = "",
    giscus_category_id = "",
    giscus_lang,
  } = (document.querySelector("#giscus-meta") as HTMLAnchorElement).dataset;

  function sendMessage(message: Object) {
    const iframe = document.querySelector(
      "iframe.giscus-frame"
    ) as HTMLIFrameElement;
    if (!iframe || !iframe.contentWindow) return;
    iframe.contentWindow.postMessage({ giscus: message }, "https://giscus.app");
  }

  function getCurrentTheme() {
    const theme =
      document.firstElementChild &&
      document.firstElementChild.getAttribute("data-theme");
    return theme;
  }

  function createGusicScript() {
    const container = document.querySelector("#main-content");
    const theme = getCurrentTheme() == "light" ? "light" : "dark_dimmed";
    let script = document.createElement("script");
    script.src = "https://giscus.app/client.js";
    script.setAttribute("data-repo", giscus_repo);
    script.setAttribute("data-repo-id", giscus_repo_id);
    script.setAttribute("data-category", "General");
    script.setAttribute("data-category-id", giscus_category_id);
    script.setAttribute("data-mapping", "og:title");
    script.setAttribute("data-strict", "0");
    script.setAttribute("data-reactions-enabled", "0");
    script.setAttribute("data-emit-metadata", "0");
    script.setAttribute("data-input-position", "top");
    script.setAttribute("data-theme", theme);
    script.setAttribute("data-lang", giscus_lang || "en");
    script.setAttribute("data-loading", "lazy");
    script.setAttribute("crossorigin", "anonymous");
    script.async = true;
    container && container.appendChild(script);
  }

  createGusicScript();
  document.querySelector("#theme-btn")?.addEventListener("click", () => {
    const theme = getCurrentTheme();
    sendMessage({
      setConfig: { theme: theme == "light" ? "dark_dimmed" : "light" },
    });
  });
</script>

组件里面实现了几个点:

  • 获取了文章名称,并使用 meta 的形式关联到了 giscus
    <meta property="{`og:${postName}`}" />
    
  • 将环境变量存储在 meta 标签中,让 script 脚本能获取其中的变量
  • 为了实现动态切换主题,调用了 postMessage api

步骤 4,引用 Comment.astro 组件

新建 src/layouts/PostDetails.astro

---
import Comment from "@components/Comment.astro";
// ...
---

<Comment />
<Layout>
  <!-- other code -->
</Layout>

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

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

相关文章

03 - 通过git log可以查看版本演变历史

通过git log可以查看版本演变历史 主要包括&#xff1a; commit 哈希id提交的Author信息提交的日期和时间commit info信息 git log本人常用&#xff0c;显示简洁&#xff1a; git log --oneline当log条数很多的时候&#xff0c;可以如下指定显示的数量&#xff1a; git log…

Mass Adoption调研

MPC钱包 MPC是什么&#xff1f; MPC定义&#xff1a;Multi-Party Computation 多方计算 技术原理&#xff1a;MPC 钱包通过使用阈值签名方案 (TSS) 消除了单点问题 开源项目tss-lib: GitHub - bnb-chain/tss-lib: Threshold Signature Scheme, for ECDSA and EDDSA 和智能合约钱…

一个概率论例题引发的思考

浙江大学版《概率论与梳理统计》一书中的&#xff0c;第13章第1节例2如下&#xff1a; 这个解释和模型比较简单易懂。接下来&#xff0c;第2节的例2是一个关于此模型的题目&#xff1a; 在我自己的理解中&#xff0c;此题的解法跟上一个题目一样&#xff0c;第二级传输后&…

在SpringMVC环境下json字符串与对象转化 配置和对象方法

目录 1..json的使用 字符串与对象转化 2.通过spring配置的形式直接接受json格式字符串转化 1..json的使用 字符串与对象转化 1.导入一个json的jar坐标 <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</…

超分任务中常见的上采样方式

文章目录 1. 线性插值方法1.1 最近邻算法 (Nearest Neighbor Interpolation)1.2 线性插值 (Linear Interpolation)1.3 双线性插值算法 (Bilinear Interpolation)1.4 双三次插值算法(Bicubic Interpolation) 2. 深度学习2.1 反卷积/转置卷积 (Deconvolution/Transposed Convolut…

猿辅导2023学习新主张:原来生活的答案藏在课堂里

妈妈让我贴春联&#xff0c;上下联要怎么看&#xff1f;井盖为什么是圆形的&#xff1f;妈妈让我买三斤土豆&#xff0c;要花多少钱&#xff1f;爬山后的第二天&#xff0c;为什么会腿酸&#xff1f;为什么冬天脱毛衣会“噼里啪啦”直响&#xff1f;……这些问题是不是似曾相识…

【C++初阶】string类的常见基本使用

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习C和算法 ✈️专栏&#xff1a;C航路 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&#x1…

组学知识速递(五)|ChIP-seq知多少?

近段时间来&#xff0c;我们合作的ChIP-Seq技术发表的高分成功案例一篇接一篇&#xff0c;您是否心动了呢&#xff1f;本篇文章&#xff0c;总结了ChIP-Seq实验部分重点知识点&#xff0c;开启ChIP-Seq的你绝不要错过&#xff01; Q1 什么是ChIP-Seq&#xff1f; ChIP-Seq即染…

基础堆排序

目录 基础堆排序 一、概念及其介绍 二、适用说明 三、过程图示 基础堆排序

qiankun-微前端--vue2

项目结构 主应用技术&#xff1a; vue2 子应用技术&#xff1a;vue2 项目目录 这里是特意将主子项目分开来的&#xff0c;方便管理 主应用 安装 qiankun npm install qiankun重新定义一个启动端口&#xff0c;防止和其它子应用共用同一个端口&#xff08;vue.config.js&…

激光与光电子学进展, 2023 | 非视域成像技术研究进展

注1&#xff1a;本文系“计算成像最新论文速览”系列之一&#xff0c;致力于简洁清晰地介绍、解读非视距成像领域最新的顶会/顶刊论文(包括但不限于 Nature/Science及其子刊; CVPR, ICCV, ECCV, SIGGRAPH, TPAMI; Light‑Science & Applications, Optica 等)。 本次介绍的论…

UI美工设计的主要职责(合集)

UI美工设计的主要职责1 职责&#xff1a; 1、执行公司的规章制度及专业管理办法; 2、 负责重点项目的原型设计和产品流程设计、视觉设计&#xff0c;优化网站和移动端的设计流程和规范&#xff0c;制定产品 UI/UE规范及文档编写; 3、负责使用PS、AI、illustrator、MarkMan、…

2005-2020年280个地级市绿色全要素生产率测算原始数据

2005-2020年280个地级市绿色全要素生产率测算原始数据 1、时间&#xff1a;2005-2020年 2、来源&#xff1a;中国城市统计年鉴、中国区域统计年鉴、中国能源年鉴、中国环境年鉴等 3、范围&#xff1a;280个地级市 4、指标&#xff1a;年末单位从业人员数、规模以上工业企业…

Django-配置邮箱功能(一):使用django自带的发送邮件功能

一、获取邮箱授权码 以QQ邮箱为例子&#xff1a; 1、进入到设置&#xff0c;找到账户 2、开启POP3等服务&#xff0c;点击管理服务 3、进入管理服务&#xff0c;生成授权码 4、按照要求发送短信就可以了 5、将授权码复制保存&#xff0c;离开界面就看不到了 二、django项目中…

【小曾同学赠书活动】开始啦—〖测试设计思想〗

文章目录 ❤️ 赠书 —《测试设计思想》&#x1f31f; 书籍介绍&#x1f31f; 作者简介图书链接❤️ 活动介绍 — 赠送 3 本 ❤️ 赠书 —《测试设计思想》 首先提问 你知道测试设计思想有哪几类吗&#xff1f;你想奠定扎实的测试理论基础吗&#xff1f;你想改变关于你当前测试…

音视频 vs2017配置FFmpeg

vs2017 ffmpeg4.2.1 一、首先我把FFmpeg整理了一下&#xff0c;放在C盘 二、新建空项目 三、添加main.cpp&#xff0c;将bin文件夹下dll文件拷贝到cpp目录下 #include<stdio.h> #include<iostream>extern "C" { #include "libavcodec/avcodec.h&…

opencv实战项目 手势识别-手势控制鼠标

手势识别系列文章目录 手势识别是一种人机交互技术&#xff0c;通过识别人的手势动作&#xff0c;从而实现对计算机、智能手机、智能电视等设备的操作和控制。 1. opencv实现手部追踪&#xff08;定位手部关键点&#xff09; 2.opencv实战项目 实现手势跟踪并返回位置信息&…

vivo手机如何设置一周后的闹钟提醒?

在日常生活和工作中&#xff0c;每个人都要面临各种各样的事情需要去处理&#xff0c;有一些事情是需要当天去完成的&#xff0c;还有一些任务是需要提前知晓&#xff0c;做好准确&#xff0c;在未来的指定日期去完成的。例如一周后交付项目资料、10天后提交月度工作总结&#…

高忆管理:股票买了后怎么卖?

股票作为一种出资东西&#xff0c;招引了许多出资者的爱好。然而&#xff0c;关于许多新手出资者来说&#xff0c;他们可能会犯一个常见的过错&#xff0c;就是在购买股票后不知道怎么卖出。本文将从多个视点剖析这个问题&#xff0c;为出资者供给一些有用的建议和指导。 首要&…

机器学习深度学习——注意力提示、注意力池化(核回归)

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——常见循环神经网络结构&#xff08;RNN、LSTM、GRU&#xff09; &#x1f4da;订阅专栏&#xff1a;机器…