这是我参与「第五届青训营」伴学笔记创作活动的第 18 天
1. Algolia 搜索功能
Algolia 是一个数据库实时搜索服务,能够提供毫秒级的数据库搜索服务,并且其服务能以 API 的形式方便地布局到网页、客户端、APP 等多种场景。
像 VuePress 官方文档就是使用的 Algolia 搜索,使用 Algolia 搜索最大的好处就是方便,它会自动爬取网站的页面内容并构建索引,你只用申请一个 Algolia 服务,在网站上添加一些代码,就像添加统计代码一样,然后就可以实现一个全文搜索功能
1)申请服务
搜索服务申请地址:docsearch.algolia.com/apply/
- 项目文档地址
- 邮箱
- 项目仓库地址
申请需要最少两天时间,有两个步骤:
- 等待 Algolia 审查项目,给你发邮件,然后需要你回复这个邮件说,你是这个项目的维护者
- 等待第二天通过审核会给你发来邮件,里面包含了 AppId 等所需要的信息邮件
2)vitepress search 配置
将这些配置添加到 config.ts 文件内
3)参考文献
VuePress 博客优化之开启 Algolia 全文搜索 · Issue #267 · mqyqingfeng/Blog (github.com)
2. Github 自动部署并同步到 Gitee
在本地运行打包文档库项目后,自动在其 dist 位置,初始化 git init,然后将其代码推送到 github 的 pages 分支,在通过 actions 将打包项目同步打 gitee 然后更新项目文档
1)从 Gitee 同步 Github 仓库
打开 gitee 从 Github 导入自己的仓库
2)编写 sh 文件自动化执行代码
项目根目录创建 reploy.sh 文件
#!/usr/bin/env sh
# 确保脚本抛出遇到的错误
set -e
# 生成静态文件
npm run docs:build
# 进入生成的文件夹
cd site/docs/.vitepress/dist
git init
git add -A
git commit -m 'deploy'
# 如果发布到 https://<USERNAME>.github.io/<REPO>
git push -f git@github.com:mqyqingfeng/learn-typescript.git master:gh-pages
cd -
运行这个文件 sh reploy.sh,不过这个文件,windows 没法运行,所以我们编写 gulp 命令来执行
项目根目录创建 script 文件夹,创建一个 utils 目录:
// utils/index.ts
import { spawn } from "child_process";
// 用于执行 cmd 命令
export default async (command: string, path: string) => {
//cmd表示命令,args代表参数,如 rm -rf rm就是命令,-rf就为参数
const [cmd, ...args] = command.split(" ");
return new Promise((resolve, reject) => {
const app = spawn(cmd, args, {
cwd: path, //执行命令的路径
stdio: "inherit", //输出共享给父进程
shell: true, //mac不需要开启,windows下git base需要开启支持
});
//执行完毕关闭并resolve
app.on("close", resolve);
});
};
在新建一个 build 目录,创建 gulpfile.ts 和 index.ts 文件:
// gulpfile.ts
import { series } from "gulp";
import { buildVitepressDist, pushGitHubPages } from "./index";
export default series(
() => buildVitepressDist(),
() => pushGitHubPages(),
);
// index.ts
import run from "../utils/run";
import { root, viteDist } from "../utils/paths";
const project = "hview-ui";
const remote = "https://github.com/ChaiMayor/hview-ui.git";
const branch = "gh-pages";
// 构建文档库 dist
export const buildVitepressDist = async () => {
await run("pnpm run docs:build-other", root);
};
// 推送到 github pages 分支
export const pushGitHubPages = async () => {
await run("git init", viteDist);
await run("git add .", viteDist);
// 发布到 https://<USERNAME>.github.io/<REPO>
await run(`git commit -m "deploy ${project} pages."`, viteDist);
await run(`git remote add origin ${remote}`, viteDist);
await run(`git checkout -b ${branch}`, viteDist);
await run(`git push -u origin ${branch}`, viteDist);
};
在根目录的 package.json 配置脚本命令:
{
"script": {
"docs:build": "gulp -f script/build/gulpfile.ts" // 用来执行脚本文件
}
}
3)同步 pages 代码到 gitee
A. 使用 https 方式添加(不配置公钥)
将刚才的代码稍加修改:
const project = "hview-ui";
const remoteGH = "https://github.com/ChaiMayor/hview-ui.git";
const remoteGT = "https://gitee.com/chai-mayor/hview-ui.git";
const branch = "gh-pages";
// 推送到 github and gitee pages 分支
export const pushGitHubPages = async () => {
await run("git init", viteDist);
await run("git add .", viteDist);
// 发布到 https://<USERNAME>.github.io/<REPO>
await run(`git commit -m "deploy ${project} pages."`, viteDist);
await run(`git checkout -b ${branch}`, viteDist);
await run(`git remote add origin ${remoteGH}`, viteDist);
await run("git push -f origin gh-pages", viteDist);
await run(`git remote add gitee ${remoteGT}`, viteDist);
await run(`git push -f gitee ${branch}`, viteDist);
};
B. 使用 ssh 方式添加(配置公钥)
配置公钥方法:2. Github 和 Gitee 配置公钥
文中教的配置 github 和 gitee 的公钥的文件
- .pub 这个是公钥文件
- 不带后缀的是私钥文件
使用 SSH 推送代码:
const project = "hview-ui";
const sshGH = "git@github.com:ChaiMayor/hview-ui.git";
const sshGT = "git@gitee.com:chai-mayor/hview-ui.git";
const branch = "gh-pages";
// 推送到 github and gitee pages 分支
export const pushGitHubPages = async () => {
await run("git init", viteDist);
await run("git add .", viteDist);
// 发布到 https://<USERNAME>.github.io/<REPO>
await run(`git commit -m "deploy ${project} pages."`, viteDist);
await run(`git push -f ${sshGH} master:${branch}`, viteDist);
await run(`git push -f ${sshGT} master:${branch}`, viteDist);
};
4)配置同步 Actions 代码
# .github\workflows\updatePages.yml
name: Sync
on:
push:
branches: [gh-pages]
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Sync to Gitee
uses: wearerequired/git-mirror-action@master
env:
SSH_PRIVATE_KEY: ${{ secrets.GITEE_PRIVATE_KEY }}
with:
source-repo: git@github.com:ChaiMayor/hview-ui.git
destination-repo: git@gitee.com:chai-mayor/hview-ui.git
- name: Build Gitee Pages
uses: yanglbme/gitee-pages-action@main
with:
gitee-username: chai-mayor
gitee-password: ${{ secrets.GITEE_PASSWORD }}
gitee-repo: chai-mayor/hview-ui
branch: gh-pages
https: true
遇到错误:
-
Error: Need captcha validation, please visit gitee.com/login, login to validate your account.
- 微信关注 gitee 公众号绑定自己的 gitee 账号就行
-
git@github.com: Permission denied (publickey).
- secrets.GITEE_PRIVATE_KEY,这个要配置
id.ed25519不带后缀的私钥才行,github 和 gitee 也都得配置id.ed25519.pub公钥才行
- secrets.GITEE_PRIVATE_KEY,这个要配置
5)参考文献
一篇带你用 VuePress + Github Pages 搭建博客 · Issue #235 · mqyqingfeng/Blog
一篇教你代码同步 Github 和 Gitee · Issue #236 · mqyqingfeng/Blog