resolvePages 解析
主流程中 resolvepages 的解析
// 详见 resolvePages 章节
await this.resolvePages()
pages 文件获取
async resolvePages () {
// resolve pageFiles
// 把所有的md和vue文件提取出来
const patterns = ['**/*.md', '**/*.vue', '!.vuepress', '!node_modules']
if (this.siteConfig.dest) {
// #654 exclude dest folder when dest dir was set in
// sourceDir but not in '.vuepress'
const outDirRelative = path.relative(this.sourceDir, this.outDir)
if (!outDirRelative.includes('..')) {
patterns.push('!' + outDirRelative)
}
}
const pageFiles = sort(await globby(patterns, { cwd: this.sourceDir }))
await Promise.all(
pageFiles.map(async relative => {
const filePath = path.resolve(this.sourceDir, relative)
await this.addPage({ filePath, relative })
})
)
}
先是采用globby
这个工具包获取在['**/*.md', '**/*.vue', '!.vuepress', '!node_modules']
下的文件路径,加入到数组 pageFiles 中
注意: 这里过滤了 node_modules
pages 处理解析
async addPage (options) {
options.permalinkPattern = this.siteConfig.permalink
const page = new Page(options, this)
await page.process({
// 之前createmarkdown返回的markdown-it pares
markdown: this.markdown,
// siteconfig 生成的 全局属性类并在此时创建实例,后面存在page的_computed中
computed: new this.ClientComputedMixinConstructor(),
// 扩展page对象的实例 https://v1.vuepress.vuejs.org/zh/plugin/option-api.html#extendpagedata
enhancers: this.pluginAPI.getOption('extendPageData').items
})
this.pages.push(page)
}
markdown: 是 markdown-chain-it 的配置
computed: ClientComputedMixinConstructor 的意思可以直接得出是客户端的一些 mixin 的处理
enhancers: extendPageData 是$page 对象的扩展,如果不配置就是默认页面的内容。也可能包含一些自己的 computed 等
在 md 文件中是可以做 $page.xxx = 'xxx'
输出的
最终将所有解析完的页面放在 this.pages 下
// 采用gray-matter解析文本
// 对应章节 https://v1.vuepress.vuejs.org/zh/guide/frontmatter.html
const { excerpt, data, content } = parseFrontmatter(this._content);
this._strippedContent = content;
Object.assign(this.frontmatter, data);
// infer title
// 如果有配置就采用配置的,没有就默认用第一个#开头的作为title
const title = inferTitle(this.frontmatter, this._strippedContent);
if (title) {
this.title = title;
}
// headers
// 将h2和h3的段落提取
const headers = extractHeaders(this._strippedContent, ["h2", "h3"], markdown);
if (headers.length) {
this.headers = headers;
}
process 里面分了每章的段落,将 h2 和 h3 的段落做了提取。
总结
resolve 的流程:
- 获取所有 md 文件
- 加入 markdown,minix 和处理所有 pages 里面的公共变量
TODO:
- h2 和 h3 的段落提取还没完全搞懂什么意思
- proess 还需要深入解析一下