前言在《一篇带你用 VuePress + Github Pages 搭建博客》中,我们使用VuePress搭建了一个博客,但是浏览最终站点:TypeScript4中文文档,我们会发现在每篇文章的底部,并且没有像VuePress官方文档那样的最后更新时间:在这篇文章中,我们来探讨一下如何实现最后更新时间。官方自带了VuePress的官方文档。我们可以知道,VuePress自带了一个显示最后更新时间的插件。默认主题下不需要安装这个插件,因为VuePress的核心已经包含了这个插件。你可以直接在config.js文件中使用它://.vuepress/config.jsmodule.exports={themeConfig:{lastUpdated:'LastUpdated',//string|boolean}}注意themeConfig.lastUpdated默认关闭,当给定一个字符串时,它将显示为前缀(默认:LastUpdated)。在这个示例代码中,我们将lastUpdated的值设置为“LastUpdate”,最终的效果应该和上面的VuePress官网截图一致。这里也提醒一下:由于lastUpdated是基于git的,所以只能在基于git的项目中启用。此外,由于使用的时间戳来自git提交,它只会出现在给定页面的第一次提交之后,并且只会在对该页面的后续提交更改时更新。然后我们按照文档尝试配置一下,发现并没有所谓的最后更新时间,因为没有显示内容,看来这里也有很大的落差:查看插件源码,为什么是这样?回头看我们代码编译提交的过程,实际上我们是在本地编写源代码,然后执行构建命令,gitinit构建后的结果,然后强行提交到远程仓库。从我们的deploy.sh脚本文件可以看出:npmrundocs:buildcddocs/.vuepress/distgitinitgitadd-Agitcommit-m'deploy'gitpush-fgit@github.com:mqyqingfeng/learn-typescript。gitmaster:gh-pages应该没问题,我们只是作为git仓库提交,也提交了一个commit,为什么显示不出来呢?说起来,最后更新的最后更新时间是怎么产生的呢?他是如何根据gitcommit记录自动生成时间的呢?为了解决这个问题,满足我们的好奇心,我们不妨看看@vuepress/plugin-last-updated这个npm包的源码,发现它的源码出奇的简单:constpath=require('path')constspawn=require('cross-spawn')/***@type{import('@vuepress/types').Plugin}*/module.exports=(options={},context)=>({extendPageData($page){const{transformer,dateOptions}=optionsconsttimestamp=getGitLastUpdatedTimeStamp($page._filePath)const$lang=$page._computed.$langif(timestamp){constlastUpdated=typeoftransformer==='函数'?transformer(timestamp,$lang):defaultTransformer(timestamp,$lang,dateOptions)$page.lastUpdated=lastUpdated$page.lastUpdatedTimestamp=timestamp}}})functiondefaultTransformer(timestamp,lang,dateOptions){returnnewDate(timestamp).toLocaleString(lang,dateOptions)}functiongetGitLastUpdatedTimeStamp(filePath){让lastUpdated尝试{lastUpdated=parseInt(spawn.sync('git',['log','-1','--format=%at',path.basename(filePath)],{cwd:path.dirname(filePath)}).stdout.toString('utf-8'))*1000}catch(e){/*暂不处理*/}returnlastUpdated}通过源码我们可以发现,之所以能够产生时间,其实是通过使用gitlog命令,然后在$page全局属性中写Whatis$pageand$page?查看官方文档-GlobalComputedAttributes章节:在VuePress中,内置了一些核心计算属性,供默认使用或自定义主题使用。对于每一个页面,都会有一个$page的计算属性,官方也给出了$page的例子:{"title":"GlobalComputed","frontmatter":{"sidebar":"auto"},"regularPath":"/zh/miscellaneous/global-computed.html","key":"v-bc9a3e3f9692d","path":"/zh/miscellaneous/global-computed.html","headers":[{"level":2,"title":"$site","slug":"site"},{"level":2,"title":"$page","slug":"page"},...]}由此,我们可以认为VuePress其实是为每个页面生成一个$page计算属性,然后在多个地方显示计算属性的值,那么突破口就来了。如果我们像源码那样直接在$page中写入一个lastUpdated属性呢?在Markdown中使用Vue,我们的每一个页面都是根据markdown文件生成的。我们如何在降价文件中将lastUpdated属性写入$page?幸运的是,在VuePress中,markdown可以直接使用Vue语法。这里我们使用vuepress-theme-reco主题的示例代码作为说明://直接在markdown文案中写
