Gitalk 是一个基于 GitHub Issue 和 Preact 开发的评论插件。javascript
Gitalk 的特性:css
一、使用 GitHub 登陆
二、支持多语言 [en, zh-CN, zh-TW, es-ES, fr, ru]
三、支持我的或组织
四、无干扰模式(设置 distractionFreeMode 为 true 开启)
五、快捷键提交评论 (cmd|ctrl + enter)
使用Gitalk须要你作一些提早准备:
一、在github上建立一个仓库,Gitalk会把评论放在这个仓库的issues里面。
二、在github上申请一个GitHub OAuth application
,来让Gitalk有权限操做github上的仓库。html
两种方式引入:vue
一、直接在HTML文件中引入java
<link rel="stylesheet" href="//cdn.bootcss.com/gitalk/1.5.0/gitalk.min.css"> <script src="//cdn.bootcss.com/gitalk/1.5.0/gitalk.min.js"></script>
建议直接把文件下载后放在项目目录中,这样就能够再也不依赖第三方网络了。
注意:若是链接失效了,请在https://www.bootcdn.cn/上搜索gitalk
而后找到对应资源连接复制过来。react
二、经过npm安装git
npm i --save gitalk
import 'gitalk/dist/gitalk.css' import Gitalk from 'gitalk'
一、首先须要在html文件中添加一个容器,Gitalk组件会在此处显示github
<div id="gitalk-container"></div>
二、使用下面的JavaScript代码来生成Gitalk评论:npm
var gitalk = new Gitalk({ clientID: '2eb19afceda708b27e64', // GitHub Application Client ID clientSecret: '36aedb5a30321626a8631689fee5fafd5929f612', // GitHub Application Client Secret repo: 'gitalk-comment' // 存放评论的仓库 owner: 'yulilong', // 仓库的建立者, admin: ['yulilong'], // 若是仓库有多我的能够操做,那么在这里以数组形式写出 id: location.pathname, // 用于标记评论是哪一个页面的,确保惟一,而且长度小于50 }) gitalk.render('gitalk-container'); // 渲染Gitalk评论组件
里面参数下面会讲解。
配置好后,页面最终效果(https://gitalk.github.io/):segmentfault
注意:
一、第一次Gitalk须要初始化评论,须要你先点击使用GitHub登录
,而后刷新页面才会初始化,或者本身去仓库里手动建立一个issues,并添加issues的labels
值为Gitalk的labels
参数和id
参数的值。
new Gitalk
的参数中有github的仓库信息和GitHub Application
信息,因此首先咱们建立这两个。
在github上建立一个仓库比较简单这里就不讲解了。
下面讲一下如何申请一个GitHub OAuth application
注意:若是你打算在本身网站使用Gitalk
,而且这个网站的源码在github的仓库上,那么你也能够直接使用这个仓库,Gitalk
只使用仓库的Issues
。
OAuth application
GitHub OAuth application
容许程序来操做你的github帐户,能够对github中仓库读写。
详情介绍:https://developer.github.com/...
申请GitHub OAuth application
流程:
一、打开github网站登录后,点击右上角的用户图标,选择Settings
二、 在 Settings页面选择Developer settings
选项。
三、在 Developer settings选择OAuth Apps
,而后会在页面右边有一个New OAuth App
按钮,点击这个按钮就进入到新建OAuth application
页面
四、也能够直接代开这个连接: https://github.com/settings/a... 进入新建页面
在注册OAuth
应用页面有以下几个参数须要填写:
Application name:必填,OAuth的名字
Homepage URL:必填,你应用的网址,哪一个网站用了Gitalk组件,就填写这个网址
Application description:选填,该OAuth的说明
Authorization callback URL:必填,受权成功后回调网址,跟Homepage URL
参数保持一致就好
这些参数在注册成功后是能够修改。
参数填好后,点Register application
按钮便可完成注册。
注册成功后会自动跳转到这个OAuth
应用的页面,或者在Developer settings选择OAuth Apps
后就能看见你建立的OAuth
应用名字,点击它进入这个OAuth
应用的页面:
在新建立的OAuth
应用里面的Client ID
和Client Secret
就是咱们须要的参数。
Gitalk
的参数说明在上面使用Gitalk的JavaScript代码中有一些参数:
var gitalk = new Gitalk({ clientID: '2eb19afceda708b27e64', // GitHub Application Client ID clientSecret: '36aedb5a30321626a8631689fee5fafd5929f612', repo: 'gitalk-comment' // 存放评论的仓库 owner: 'yulilong', // 仓库的建立者, admin: ['yulilong'], // 若是仓库有多我的能够操做,那么在这里以数组形式写出 id: location.pathname, // 用于标记评论是哪一个页面的 })
主要的参数:
OAuth App
的Client ID
OAuth App
的Client Secret
注意:
虽然id
和title
参数是否是必填的选项,可是这个两个参数很重要建议填上:
一、id
参数用于评论记录和页面对应的惟一标记,有的时候发现好几个页面评论是同样的,就是因为配置id
参数的时候,这几个页面的id是同样致使。因为id
参数默认值是location.href
页面URL,而有的时候URL中带着页面标题的连接,致使URL长度超过了50个字符长度,会致使建立评论issues失败(长度超过50个会建立失败),这点要注意。
二、title
用于在github仓库issues的标题,若是你想管理评论能够设置一下这个参数,来区分该评论是来自于那个文章。
其余参数:
number
: 类型:数字,选填,页面的 issue ID 标识,若未定义number属性则会使用id进行定位。默认值:-1
labels
:类型:数组,选填,GitHub issue 的标签,默认值:['Gitalk']
body
:类型:字符串,选填, GitHub issue 的内容,默认值:URL + HTML中meta标签中description的值
language
:类型:字符串,选填,设置语言,支持 [en, zh-CN, zh-TW]。默认值:navigator.language 或者 navigator.userLanguage
perPage
:类型:数字,选填,每次加载的数据大小,最多 100。默认值:10
distractionFreeMode
:类型:布尔值,选填,相似Facebook评论框的全屏遮罩效果。默认值:false
pagerDirection
:类型:字符串,选填,评论排序方式,last
为按评论建立时间倒叙,first
为按建立时间正序。默认值:last
createIssueManually
:类型:布尔值,选填,若是当前页面没有相应的 isssue 且登陆的用户属于 admin,则会自动建立 issue。若是设置为 true,则显示一个初始化页面,建立 issue 须要点击 init 按钮。 默认值:false
proxy
:类型:字符串,选填,GitHub oauth 请求到反向代理,为了支持 CORS。默认值:https://cors-anywhere.herokuapp.com/https://github.com/login/oauth/access_token
flipMoveOptions
:类型:对象,选填,评论列表的动画。 参考
enableHotKey
:类型:布尔值,选填,启用快捷键(cmd/ctrl + enter)
提交评论。默认值:true
docsify
中使用docsify是一个神奇的文档网站生成工具。详情介绍请看官网:https://docsify.js.org/#/zh-cn/
使用docsify教程请查看:https://segmentfault.com/a/11...
docsify支持Gitalk评论插件,须要引入一个JavaScript脚本文件:https://unpkg.com/docsify@4.8.6/lib/plugins/gitalk.min.js
一个实际使用例子:
<link rel="stylesheet" href="//unpkg.com/gitalk/dist/gitalk.css"> <script src="//unpkg.com/gitalk/dist/gitalk.min.js"></script> <script src="//unpkg.com/docsify/lib/plugins/gitalk.min.js"></script> <script> var gitalk = new Gitalk({ clientID: '2eb19afceda708b27e64', clientSecret: '36aedb5a30321626a8631689fee5fafd5929f612', repo: 'gitalk-comment', owner: 'yulilong', admin: ['yulilong'], title: location.hash.match(/#(.*?)([?]|$)/)[1], id: location.hash.match(/#(.*?)([?]|$)/)[1], }) // 监听URL中hash的变化,若是发现换了一个MD文件,那么刷新页面,解决整个网站使用一个gitalk评论issues的问题。 window.onhashchange = function(event){ if(event.newURL.split('?')[0] !== event.oldURL .split('?')[0]) { location.reload() } } // 因为docsify/lib/plugins/gitalk.min.js文件中已经有下面代码了,因此不须要在写一次了 // gitalk.render('gitalk-container') </script>
说明:
一、因为docsify的连接URL使用的是hash的方式,致使切换页面的时候不会刷新页面,致使整个网站的Gitalk评论使用的是一个评论,所以作了监听hash事件,来刷新页面,这样就能每次切换页面刷新,而后加载对应的评论。
二、关于Gitalk参数id
的值,因为点击二级标题后,二级标题会以参数的形式出如今url上,致使长度有事超过了50,因此过滤掉URL中的参数,此外还能解决评论定位不到问题(二级标题会在URL上)。
关于VuePress,请参考:https://vuepress.vuejs.org/zh/
咱们须要建立.vuepress/enhanceApp.js
文件,内容以下:
function integrateGitalk (router) { const linkGitalk = document.createElement('link'); linkGitalk.href = 'https://cdn.jsdelivr.net/npm/gitalk@1/dist/gitalk.css'; linkGitalk.rel = 'stylesheet'; document.body.appendChild(linkGitalk); const scriptGitalk = document.createElement('script'); scriptGitalk.src = 'https://cdn.jsdelivr.net/npm/gitalk@1/dist/gitalk.min.js'; document.body.appendChild(scriptGitalk); var path = ''; router.afterEach((to) => { if (scriptGitalk.onload) { setTimeout(loadGitalk, 5, to) } else { scriptGitalk.onload = () => { loadGitalk(to.fullPath); } } }); function loadGitalk (to) { if (to.path !== path) { path = to.path; let commentsContainer = document.getElementById('gitalk-container'); const $page = document.querySelector('.page'); if (commentsContainer && $page) { $page.removeChild(commentsContainer) } commentsContainer = document.createElement('div'); commentsContainer.id = 'gitalk-container'; commentsContainer.classList.add('content'); if ($page) { $page.appendChild(commentsContainer); if (typeof Gitalk !== 'undefined' && Gitalk instanceof Function) { renderGitalk(); } } } } function renderGitalk () { const gitalk = new Gitalk({ clientID: '2eb19afceda708b27e64', clientSecret: '36aedb5a30321626a8631689fee5fafd5929f612', repo: 'gitalk-comment', owner: 'yulilong', admin: ['yulilong'], title: location.pathname, id: location.pathname, // Ensure uniqueness and length less than 50 language: 'zh-CN', }); gitalk.render('gitalk-container'); } window.loadGitalk = loadGitalk; } export default ({ Vue, options, router }) => { try { document && integrateGitalk(router) } catch (e) { console.error(e.message) } }
保存文件后,重启vuePress服务便可。
效果以下图: