当前位置: 首页 > Web前端 > JavaScript

手拉手基于vuepress2搭建专属自己的博客,并集成评论、打赏、搜索等常用功能

时间:2023-03-26 20:38:09 JavaScript

手牵手基于vuepress2搭建自己的博客,并集成了评论、打赏、搜索等常用功能。目前独家静态博客系统。并且一直更新维护至今。博客不断定制了自己的个性化首页和列表页,扩展了评论、页脚、复制、图片预览等博客常用功能,效果和UI实现还是比较满意的。但是自从vuepress升级到2.X后,一直急于升级现有的博客,但平时比较忙(懒癌晚期),所以一直没有付诸行动。最近有空,打算搬家。这次虽然是从头开始重建,但其实很多逻辑都和1.0差不多,所以我的博客1.0还是可以借鉴的。如果你也是vuepress1.X版本,也可以参考官方迁移文档VuePress2亮点介绍至尊支持vue3.0,简单易用。支持打字稿,学习和发展必要的技能。Vite包很快。多语言支持VuePress等博客系统可以对比官方介绍ProjectConstructionProjectCreation&Initialization#创建并进入博客文件mkdirvuepress-blogcdvuepress-blog#初始化gitarninit#安装vuepress本地依赖yarnadd-Dvuepress@next#添加忽略内容echo'node_modules'>>.gitignoreecho'.temp'>>.gitignoreecho'.cache'>>.gitignore#添加第一个md文档mkdirdocsecho'#HelloVuePress'>docs/index.md添加package.json中的一些脚本{"scripts":{"docs:dev":"vuepressdevdocs","docs:build":"vuepressbuilddocs"}}在命令行运行如下代码,即可顺利启动一个热重载的博客项目yarndocs:dev搭建首页vuepress允许我们依赖Frontmatter->layout来自定义页面布局;再来说说首页docs/.vuepress/Layouts文件中新增的Home.vue文件,因为自定义页面说白了也是一个组件,所以我们可以按照平时写vue3组件的方式来写首页内容在docs/.vuepress/client.ts文件中注册Home组件import{defineClientConfig}from'@vuepress/client'importHomefrom'./Layouts/Home.vue'exportdefaultdefineClientConfig({layouts:{Home,}})在一开始创建的docs/index.md文件中,来自定义布局组件介绍---title:首页布局:首页---至此,我们的首页就生成了,比较简单吧,不用着急,下面的列表页是最复杂的列表页列表页面最重要的是如何获取所有文章的数据内容。这里依赖官方的插件API来实现,因为我们需要创建很多md文件,但是并不是所有的文件都需要在列表页显示出来,所以我们首先要约定好文件是什么格式的我们需要的博客文件:我们可以设置一个黑名单排除,当然我这里使用的正则匹配方式是https://slbyml.github.io/**/**就是我们需要的博客文件,否则就是是其他文件,没有统计,比如:https://slbyml.github.io/,https://slbyml.github.io/*.html第一步:创建插件文件。vuepress/plugins/page.js:exportdefault{name:'vuepress-plugin-page',onInitialized(app){constlists=[]app.pages.forEach((item:Page)=>{//排除不必要的pageif(/^\/[\s\S]*\/[\s\S]*/.test(item.path)){//为了减少传输大量不需要的数据lists.push({path:item.data.path,title:item.data.title,frontmatter:item.data.frontmatter,git:item.data.git})}//将组装我们的列表传递给列表页面if(item.path==='/list.html'){item.data={...item.data,lists}}});//这里需要简单的排序lists.sort((s1,s2)=>{return+newDate(s2.git.lastUpdated)-+newDate(s1.git.lastUpdated)})}}当然,要将数据传输到列表页,你也可以参考官方的解决方案:传递数据给客户端代码步骤二:创建自定义列表layout.vuepress/Layouts/List.vue第三步:注册列表Layout.vuepress/client.tsimport{defineClientConfig}from'@vuepress/client'importHomefrom'./Layouts/Home.vue'importListfrom'./Layouts/List.vue'exportdefaultdefineClientConfig({layouts:{Home,List}})第四步:创建列表文件docs/list.md,将我们自定义的布局导入其中---title:articlelistlayout:List--至此我们最重要的首页和列表页就完成了文章标签的收集,我们来看看我文章中最重要的两个frontmatter---tags:-vuepress-front-enddescription:文章的描述信息,---description:文章的自定义描述信息,列表页中的item.frontmatter.description方法可以获取tags,就是我们文章的自定义标签,可以通过frontmatter.tags获取,我用的列表页上的constallTags=allList.value.reduce((previous,current)=>{returnprevious.concat(current.frontmatter.tags)},[])分页既然我们可以得到所有文章列表的数组,那么我们就可以使用allList来定义我们的分页逻辑就比较简单了吧!文章页面使用扩展的默认布局。如果只需要具体文章页面的官方默认布局,可以忽略这部分内容。我做的主要是继承官方默认的布局。排版,并扩展了阅读进度、评论、打赏、页脚等功能;create.vuepress/layouts/Layout.vuefooterAdddefaultlayoutcomponents.vuepress/client.tsimport{defineClientConfig}from'@vuepress/client'importLayoutfrom'./Layouts/Layout.vue'exportdefaultdefineClientConfig({layouts:{Layout}})好了,这一步完成后,我们所有的文章页面都会使用这个布局方式来渲染和观察组件。可以发现我们都是通过slots实现的扩展,更多的Multi-layoutslots可以参考官方的继承。相信聪明的博主应该可以通过它来获得更多有趣的东西。添加Giscus评论评论是博客的灵魂,它为博客提供了互动的能力。之前版本的博客我用的是GITALK实现的,是基于issues实现的,所以有一些我不是很满意的缺点,比如:评论不能堆叠,博主需要登录文章页面初始化评论功能,所以这次我决定改用基于GithubDiscussions的Giscus;当然,如果你对GITALK还是情有独钟,可以参考这篇文章。通过上一步的布局展开,我们发现可以将评论组件放置在#page-content-bottom槽中。Giscus好心要求我们提供各种常用的参考方法:Vue组件、React组件、web组件等;我们可以使用我们喜欢的方式来安装引用。下面主要说说如何获取repo、repoId、category、categoryId:首先进入Giscus官网,按照流程填写必要的信息,注意没有https的仓库地址。填写完成后,下方会生成必要的信息。我们可以直接替换组件中的相应参数,添加自定义函数。一个完整的、个性化的、有趣的博客肯定会有很多自定义的JS内容需要实现,比如复制自动添加版权、控制台默认输出自定义日志、动态页面标题等;其中大部分都有第三方组件来协助我们完成这些事情,但是如果找不到,就需要我们自己写,我们用copy自动添加版权例如(这个也有三方插件-ins,可以自己搜索):新建一个file.plugins/plugins/copy.jsexportdefault()=>{functionaddCopy(e){letcopyTxt=""e.preventDefault();//取消默认复制事件copyTxt=window.getSelection(0).toString()copyTxt=`${copyTxt}\n作者:静水深流\n原文:${window.location.href}\n版权归属给作者。商业转载请联系作者授权,非商业转载请注明出处。`//将信息写入剪贴板constclipboardData=e.clipboardData||window.clipboardDataclipboardData.setData('text',copyTxt);}document.addEventListener("cut",e=>{addCopy(e)});document.addEventListener("copy",e=>{addCopy(e)});}修改.vuepress/client.ts文件:import{defineClientConfig}from'@vuepress/client'importcopyfrom'./plugins/copy'exportdefaultdefineClientConfig({asyncsetup(){if(!__VUEPRESS_SSR__){//runontheclientcopy()}}})__VUEPRESS_SSR__表示该函数不运行在服务端(SSR)下;这个常量是Vuepress为我们提供的,更多的变量参考常量草稿功能。很多时候我们可能会同时写多篇笔记和文章,或者写完不想发出去。这时候我们需要一个草稿箱来临时存放我们的文章,以防影响其他文章的发表,我们有两种方式来实现第一种是修改.vuepress/plugins/page.js文件,通过过滤掉代码中指定格式的文件,避免将文件链接暴露给外界,这种方式间接实现了草稿箱功能,但是如果知道链接或者通过搜索功能搜索到这个页面,还是可以输入的。第二种方法也是我现在使用的方法:通过官方的pagePatterns函数,可以防止一个文件被VuePress处理阻塞,所以我们可以使用这个函数来达到想要的效果。我正在修改所有以下划线开头的文件作为草稿文件。vuepress/config.tsimport{defineUserConfig}from'vuepress'exportdefaultdefineUserConfig({pagePatterns:['**/*.md','!**/_*.md','!node_modules']})生成sitemap博客只有别人能搜索到才更有创意,所以我们需要生成站点地图:sitemap,是seo必备文件,先安装这个插件yarnaddvuepress-plugin-sitemap2-D;然后修改.vuepress/config.tsimport{defineUserConfig}from'vuepress'import{sitemapPlugin}from"vuepress-plugin-sitemap2"import{googleAnalyticsPlugin}from'@vuepress/plugin-google-analytics'//做googlecollection&report分析使用exportdefaultdefineUserConfig({plugins:[googleAnalyticsPlugin({id:'google-analyticsgenerated'}),sitemapPlugin({hostname:'https://slbyml.github.io'})]})然后我们可以包含生成的百度的文件https://slbyml.github.io/sitemap.xml,谷歌的合集,360,搜狗,必应等都可以提交打包部署。我的源码文件和打包文件分开存放,一私一公主要是源码里有一些remark文件,不方便透露,所以为了方便,我写了一个自动打包上传的方法,#!/usr/bin/envsh#确保脚本抛出错误遇到set-e#GeneratestaticFileyarnbuild#进入生成的文件夹cddocs/.vuepress/distgitinitgitadd-Agitcommit-m'blog'gitpush-fgit@github.com:slbyml/slbyml.github.io.gitmastercd-Package.json添加一个脚本:"deploy":"bashdeploy.sh",这样就可以一键使用yarndeploy了,还是不错的后期规划[]添加docsearch[]自动上传CDN友情提示自行搜索插件时,请看清楚是支持vuepress1.x还是vuepress2.x。现在很多插件只支持1.x,而一些号称支持2.x的插件在开发环境中好用。打包的时候报错。犯了很多坑,以至于好几次想放弃,坚持到最后才勉强搭建完成,所以有什么问题欢迎在评论区点赞+讨论,一起开始搭建博客吧一起