• Stars
    star
    591
  • Rank 75,679 (Top 2 %)
  • Language
    TypeScript
  • License
    MIT License
  • Created about 6 years ago
  • Updated almost 2 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

💬 Render Disqus comments in Mainland China using Disqus API

DisqusJS

https://disqusjs.skk.moe

纯前端、超轻量级的「评论基础模式」实现:使用 Disqus API 渲染评论列表

npm version Author npm license jsDelivr Hits

简介

DisqusJS 是一个基于 Disqus API 和 React 开发的 Embed 插件。DisqusJS 通过 Disqus API 渲染只读的评论列表,搭配反向代理可以实现在网络审查地区加载 Disqus 评论列表;支持自动检测访客是否能够访问 Disqus、并自动选择加载原生 Disqus(评论完整模式)或 DisqusJS 提供的评论基础模式。

功能

  • 判断访客能否访问 Disqus、自动选择「评论基础模式」或「Disqus 完整模式」
  • 展示评论列表、支持按照「最新」、「最早」、「最佳」排序
  • 可搭配 React(Gatsby、Next.js)使用

Demo

安装和使用

在 HTML 中直接引入

在你需要安装 DisqusJS 的页面的 </head> 之前引入 DisqusJS 的 CSS:

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/browser/styles/disqusjs.css">

在需要展示评论的地方插入 JS:

<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/browser/disqusjs.es2015.umd.min.js"></script>

<!-- 如果你只兼容现代浏览器,你也可以使用 ES Module -->
<script type="module">
  import DisqusJS from 'https://cdn.jsdelivr.net/npm/[email protected]/dist/browser/disqusjs.es2018.es.min.mjs'
</script>

接着创建一个 DisqusJS 容器:

<div id="disqusjs"></div>

通过 NPM 安装

npm i disqusjs
# Yarn
# yarn add disqusjs
# pnpm
# pnpm add disqusjs

然后在项目中引入 DisqusJS:

// CommonJS
const DisqusJS = require('disqusjs/dist/disqusjs.es2015.umd');
// const DisqusJS = require('disqusjs/dist/disqusjs.es2017.umd');
// const DisqusJS = require('disqusjs/dist/disqusjs.es2022.umd');

// ES Module
import DisqusJS from 'disqusjs/dist/disqusjs.es2015.es.js';
// import DisqusJS from 'disqusjs/dist/disqusjs.es2017.es.js';
// import DisqusJS from 'disqusjs/dist/disqusjs.es2022.es.js';

注意,你仍然需要手动引入 DisqusJS 的 CSS:

import 'disqusjs/dist/styles/disqusjs.css';

使用下述代码初始化一个 DisqusJS 实例。注意初始化需在 DisqusJS 加载完成后进行:

const disqusjs = new DisqusJS({
    shortname: '',
    siteName: '',
    identifier: '',
    url: '',
    title: '',
    api: '',
    apikey: '',
    admin: '',
    adminLabel: ''
});

接下来,我们需要让 DisqusJS 实例将评论组件渲染到页面上:

disqusjs.render(document.getElementById('disqusjs'));
// 你也可以传入一个 CSS 选择器
// disqusjs.render('#disqusjs');

作为 React 组件使用

import 'disqusjs/dist/react/styles/disqusjs.css';
import { DisqusJS } from 'disqusjs/react/dist/disqusjs.es2015.es.js';
// import { DisqusJS } from 'disqusjs/react/dist/disqusjs.es2017.es.js';
// import { DisqusJS } from 'disqusjs/react/dist/disqusjs.es2022.es.js';
// const { DisqusJS } = require('disqusjs/react/dist/disqusjs.es2015.umd');
// const { DisqusJS } = require('disqusjs/react/dist/disqusjs.es2017.umd');
// const { DisqusJS } = require('disqusjs/react/dist/disqusjs.es2022.umd');

<DisqusJS
  shortname=""
  siteName=""
  identifier=""
  url=""
  api=""
  apikey=""
  admin=""
  adminLabel=""
/>

完成上述步骤后,DisqusJS 就已经在您的站点安装好了,但是你现在还不能使用它。要使用 DisqusJS,你还需要进行一些配置。

配置 Disqus Application

Disqus API Application 处注册一个 Application。

点击新创建的 Application,获取你的 API Key(公钥)。

在 Application 的 Settings 页面设置你使用 DisqusJS 时的域名。Disqus API 会检查 API 请求的 Referrer 和 Origin。

配置 DisqusJS 参数

shortname {string}

siteName {string}

identifier {string}

  • 当前页面的 identifier,用来区分不同页面
  • 建议,默认值为 document.location.origin + document.location.pathname + document.location.search

url {string}

  • 当前页面的 URL,Disqus 的爬虫会爬取该 URL 获取页面相关信息
  • 建议,默认值为 document.location.origin + document.location.pathname + document.location.search

title {string}

  • 当前页面的标题,如果没有设置默认为当前页面的标题。当页面标题中有其他信息(比如站点名称)而不想在 Disqus 中展示时,可以设置此项。
  • 非必须,默认值为 document.title

api {string}

  • DisqusJS 请求的 API Endpoint,通常情况下你应该配置一个 Disqus API 的反代并填入反代的地址。你也可以直接使用 DISQUS 官方 API 的 Endpoint https://disqus.com/api/,或是使用我搭建的 Disqus API 反代 Endpoint https://disqus.skk.moe/disqus/。如有必要可以阅读关于搭建反代的 相关内容
  • 建议,默认值为 https://disqus.skk.moe/disqus/

apikey {string | string[]}

  • DisqusJS 向 API 发起请求时使用的 API Key,你应该在配置 Disqus Application 时获取了 API Key
  • DisqusJS 支持填入一个 包含多个 API Key 的数组,每次请求时会随机使用其中一个;如果你只填入一个 API Key,可以填入 string 或 Array。
  • 必填,无默认值

nesting {number}

  • 最大评论嵌套数;超过嵌套层数的评论,会不论从属关系显示在同一层级下
  • 非必须,默认值为 4

nocomment {string}

  • 没有评论时的提示语(对应 Disqus Admin - Settings - Community - Comment Count Link - Zero comments)
  • 非必须,默认值为 这里冷冷清清的,一条评论都没有

以下配置和 Disqus Moderator Badge 相关,缺少一个都不会显示 Badge

admin {string}

adminLabel {string}

SPA 与 PJAX 站点注意事项

如果你在 React SPA、Next.js、Gatsby 中以 React 组件的形式使用 DisqusJS,无需任何额外步骤,只需修改 <DisqusJS /> 组件的 prop,DisqusJS 会自动更新。

如果你在 PJAX 站点中使用,需要在页面 unload 之前手动销毁 DisqusJS 实例,并新页面 load 后重新渲染一个 DisqusJS 实例:

let disqusjs = null;
// 初始化 DisqusJS 实例
disqusjs = new DisqusJS({
  // ...
});
// 将 DisqusJS 渲染到页面上
disqusjs.render(document.getElementById('disqusjs'));

document.addEventListener('pjax:send', () => {
  // 销毁 DisqusJS 实例
  disqusjs.destroy();
});

document.addEventListener('pjax:complete', () => {
  // 使用新的参数(如新的 identifier 和 url)创建全新的 DisqusJS 实例
  disqusjs = new DisqusJS({
    // ...
  });
  // 渲染新的 DisqusJS
  disqusjs.render(document.getElementById('disqusjs'));
});

如何搭建 Disqus API 反代

使用 Caddy 或者 Nginx 都可以搭建一个反代服务器,需要反代的 Endpoint 是 https://disqus.com/api/。这里介绍的是针对不使用服务器和后端程序,使用 Serverless 平台搭建 Disqus API 反代的方法。

Vercel

Vercel 是一个 Serverless 平台。免费的 Hobby Plan 提供每月 100 GiB 流量和无限的请求次数。 sukkaw/disqusjs-proxy-example 提供了一个使用 Now Router 进行反代的样例配置文件。

Cloudflare Workers

Cloudflare Workers 提供了一个在 Cloudflare 上运行 JavaScript 的平台。免费 Plan 可提供每天 100000 次免费请求次数额度。 idawnlight/disqusjs-proxy-cloudflare-workers 提供了一份使用 Cloudflare Workers 进行反代的样例代码。

Heroku

Heroku 是一个支持多种编程语言的 SaaS 平台。不绑定信用卡每月有 550 小时的免费运行时间、绑定信用卡后每月有 1000 小时的免费运行时间。 ysc3839/disqusjs-proxy 提供了一个直接部署至 Heroku 的 Disqus API 反代项目。你可以点击 Deploy 直接部署。

Firebase

Firebase Cloud Functions 提供了执行 Node.js 代码的 Serverless 平台。需绑定银行卡 (Visa 或 MasterCard) 才能启用互联网出站访问功能。 ysc3839/disqusjs-proxy 的 firebase 分支 提供了一个可以部署在 Firebase 上的反代样例。

注意事项

  • Disqus API 不支持通过 AJAX 方式调用创建评论或者初始化页面,所以自动初始化页面和创建匿名评论在不搭配专门的后端程序的话不能实现。
    • Disqus API 会检查请求是否包含 OriginX-Request-With 等响应头、拦截 AJAX 请求。就算 Disqus API 不做检查,把你的私钥和公钥一起明文写在前端也是 十分愚蠢
  • 所以如果 DisqusJS 检测到当前页面没有初始化、会提示是否切换到 Disqus 完整模式进行初始化。
  • DisqusJS 仅在当前域名首次访问时检测 Disqus 可用性并选择模式,并把结果持久化在 localStorage 中,之后访问都会沿用之前的模式。
  • 一个 Disqus Application 的 Rate Limit 是每小时 1000 次;DisqusJS 一次正常加载会产生 2 次请求。DisqusJS 支持将多个 API Key 填入一个 Array 中,并在请求时随机选择(负载均衡)。你可以创建多个 Disqus API Application 并分别获取 API Key。

从 DisqusJS 1.3.0 升级到 DisqusJS 3.0.0

<!-- 替换 DisqusJS 版本 -->
<!--<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/disqusjs.css">-->
<!--<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/disqus.js"></script>-->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/browser/styles/disqusjs.css">
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/browser/disqusjs.es2015.umd.min.js"></script>

<!--
  DisqusJS 1.3.0 容器的 id 属性必须是 `disqus_thread`,
  DisqusJS 3.0.0 容器的 id 属性 **必须不是** `disqus_thread`。
  建议使用 "disqusjs" 作为 DisqusJS 容器的 id 属性。
-->
<!--<div id="disqus_thread"></div>-->
<div id="disqusjs"></div>
<script>
  const disqusjs = new DisqusJS({
    // DisqusJS 1.3.0 和 DisqusJS 3.0.0 配置完全兼容,无需更改
    // ...
  });

  // DisqusJS 1.3.0 在初始化实例后评论列表已经开始渲染到页面上,DisqusJS 3.0.0 还需要额外调用 render() 方法:
  disqusjs.render(document.getElementById('disqusjs')); // render() 方法需要传入 DisqusJS 的容器

  // DisqusJS 3.0.0 新增了销毁实例的 destroy() 方法,你可以在 PJAX 跳转时直接调用它:
  disqusjs.destroy();
  // 关于 PJAX 站点使用,请参考前文「SPA 与 PJAX 站点注意事项」
</script>

谁在使用 DisqusJS?

如果你的站点或者个人博客在使用 DisqusJS,来 把你的网站分享给其他人吧

Author 作者

DisqusJS © Sukka, Released under the MIT License.
Authored and maintained by Sukka with help from contributors (list).

Personal Website · Blog · GitHub @SukkaW · Telegram Channel @SukkaChannel · Mastodon @[email protected] · Twitter @isukkaw · Keybase @sukka

More Repositories

1

Koolshare-Clash

🐱 Run Clash Tunnel on Koolshare OpenWrt
ASP
1,279
star
2

nolyfill

Speed up your package installation process, reduce your disk usage, and extend the lifespan of your precious SSD.
TypeScript
1,097
star
3

Surge

由 Sukka 搜集、整理、维护的、个人自用的、仅适用于 Surge 的 Rule Snippet
JavaScript
583
star
4

hexo-theme-suka

🎨Modern, powerful and simple theme for Hexo.
CSS
580
star
5

nali-cli

⚓ Parse geoinfo of IP Address without leaving your terminal
JavaScript
393
star
6

zsh-proxy

🔩 An oh-my-zsh plugin to configure proxy
Shell
369
star
7

foxact

React Hooks/Utils done right. For Browser, SSR, and React Server Components.
TypeScript
302
star
8

OpenCore-Document-zh_Hans

[非官方/Unofficial] OpenCore Bootloader 参考手册简体中文翻译
JavaScript
238
star
9

cloudflare-workers-async-google-analytics

☁️ The Cloudflare Workers implementation of an async Google Analytics
JavaScript
205
star
10

ClashEditor

📐 An editor for writing Clash config
HTML
192
star
11

cloudflare-block-bad-bot-ruleset

🚦 Block malicious crawlers with Cloudflare Firewall Rules
175
star
12

hexo-theme-doku

📜 Doku, a Hexo theme designed for writing documents.
HTML
145
star
13

rollup-plugin-swc

Use SWC with Rollup to transform / minify ESNext and TypeScript code.
TypeScript
139
star
14

zsh-osx-autoproxy

An oh-my-zsh plugin that configures proxy environment variables based on macOS's system preferences automatically
Shell
87
star
15

dotfiles

🔧 My development environment and config
Shell
82
star
16

Lenovo-Y9000X-Hackintosh

Lenovo LEGION Y9000X 2020 (Lenovo LEGION S740-15IRH) Hackintosh
ASL
71
star
17

ThinkPad-E480-Hackintosh

macOS Catalina & Big Sur on ThinkPad E480 (Hackintosh)
ASL
62
star
18

dashflare

An unofficial Cloudflare dashboard built on top of Cloudflare API.
TypeScript
55
star
19

bring-github-old-feed-back

Throw away the GitHub's useless "For You" feed and replace with the old good "Following" feed
TypeScript
53
star
20

forgetti-loader

A webpack/rspack loader and a Next.js plugin that brings an auto-memoization compiler to solves your hook spaghetti. Powered by forgetti which is inspired by React Forget.
TypeScript
52
star
21

CheckSSL

🔒Check your site's SSL status using curl & bash
Shell
41
star
22

vercel-dns-console

An unofficial implementation of Vercel DNS Dashboard
TypeScript
37
star
23

Friends

♥️ Friends of @SukkaW
JavaScript
33
star
24

react-compiler-webpack

The webpack/rspack loader for React Compiler
TypeScript
22
star
25

style9-webpack

The another Webpack Plugin for Atomic CSS-in-JS implementation style9
TypeScript
19
star
26

eslint-config-sukka

ESLint configuration of Sukka
TypeScript
17
star
27

stylex-webpack

The another webpack/Next.js Plugin for Facebook StyleX
TypeScript
17
star
28

markdown.css

📝 The simple CSS to replicate the GitHub Markdown style (Sukka Ver.)
CSS
14
star
29

disqusjs-proxy-example

Using Now as Disqus API Proxy
13
star
30

theme-doku-docs

📜 The documents & demo of hexo-theme-doku
13
star
31

CheckLatency

🌏 (WIP) A tool that check your latency to cloud provider every regions
JavaScript
13
star
32

memdisk

A library and a CLI to create RAM disk on macOS and Linux.
TypeScript
13
star
33

recipage

📃 Reci(pe)page: Turn a markdown file into one simple page
JavaScript
12
star
34

pure-svg-countdown

HTML
12
star
35

xbits

Convert bytes to a human readable string
TypeScript
12
star
36

SukkaW

My GitHub Profile
11
star
37

Cloudflare-WAF-to-AbuseIPDB

JavaScript
10
star
38

hexo-lute

A markdown renderer for Hexo based on Lute
JavaScript
8
star
39

consolas-powerline

Consolas Nerd Font (Consolas 7.0)
Python
8
star
40

busuanzi

The mirror of busuanzi js
8
star
41

hv-monsterdb-userscript

M-M-M-MONSTER DATABASE!
TypeScript
7
star
42

fast-cidr-tools

cidr-tools but up to 20x faster
TypeScript
7
star
43

eslint-config-sukka-archive

JavaScript
7
star
44

openconnect-snell

Allow Surge to connect to OpenConnect using Docker + Snell Server V4
Shell
6
star
45

suka.css

✨The most useless css framework.
CSS
6
star
46

telegram-reply-image-to-messsage-bot

TypeScript
6
star
47

kv4cf

A Modified version of cloudflare/kv-asset-handler, with Non-ASCII URL supported.
JavaScript
6
star
48

hentaiverse-monster-database

M-M-M-MONSTER DATABASE SERVER!
TypeScript
5
star
49

hentaiverse-util-api-userscript

A userscript provided API for other HentaiVerse userscripts
TypeScript
5
star
50

monsterbation-linter

TypeScript
5
star
51

bundled-open-cli

Open stuff like URLs, files, executables, with installation size reduced by 78%. Cross-platform.
TypeScript
5
star
52

bili-mcdn

HTML
4
star
53

Koolshare-OpenWrt-API-Documents

The API documents (unofficial) for Koolshare OpenWrt httpdb
4
star
54

tor-exit-page

An alternative "This is a Tor Exit Router" page
HTML
4
star
55

rcpy

Lightweight, fast, simple and flexible file copy utility for Node.js
TypeScript
4
star
56

teacup.js

🍵 Cache javascript & css files in localStorage
JavaScript
3
star
57

zsh-gitcd

🔩 An oh-my-zsh plugin for git clone && cd
Shell
3
star
58

nodelistparser

Surge / Mihomo (Clash.Meta) nodelist / proxy provider parser and generator
TypeScript
2
star
59

sponsors

TypeScript
2
star
60

Hackintosh-Kext-Builder

Shell
1
star
61

BadgeKit

🚩 Get every badge you need for your README
JavaScript
1
star
62

hexo-renderer-pejs

EJS(based on PEJS) renderer for Hexo
JavaScript
1
star
63

untyped-javascript-serialization-benchmark

TypeScript
1
star
64

cidr-tools-wasm

TypeScript
1
star