mirror of
https://github.com/wahyd4/vuepress.git
synced 2026-08-09 05:16:23 +10:00
feat($markdown): cache parser (#1359)
This commit is contained in:
@@ -6,11 +6,10 @@
|
||||
|
||||
const { EventEmitter } = require('events')
|
||||
const { getOptions } = require('loader-utils')
|
||||
const { fs, path, hash, parseFrontmatter, inferTitle, extractHeaders } = require('@vuepress/shared-utils')
|
||||
const { fs, path, parseFrontmatter, inferTitle, extractHeaders } = require('@vuepress/shared-utils')
|
||||
const LRU = require('lru-cache')
|
||||
const md = require('@vuepress/markdown')
|
||||
|
||||
const cache = new LRU({ max: 1000 })
|
||||
const devCache = new LRU({ max: 1000 })
|
||||
|
||||
/**
|
||||
@@ -32,26 +31,18 @@ module.exports = function (src) {
|
||||
// vue-loader, and will be applied on the same file multiple times when
|
||||
// selecting the individual blocks.
|
||||
const file = this.resourcePath
|
||||
const key = hash(file + src)
|
||||
const cached = cache.get(key)
|
||||
if (cached && (isProd || /\?vue/.test(this.resourceQuery))) {
|
||||
return cached
|
||||
}
|
||||
|
||||
const frontmatter = parseFrontmatter(src)
|
||||
const content = frontmatter.content
|
||||
const { content, data } = parseFrontmatter(src)
|
||||
|
||||
if (!isProd && !isServer) {
|
||||
const inferredTitle = inferTitle(frontmatter.data, frontmatter.content)
|
||||
const inferredTitle = inferTitle(data, content)
|
||||
const headers = extractHeaders(content, ['h2', 'h3'], markdown)
|
||||
delete frontmatter.content
|
||||
|
||||
// diff frontmatter and title, since they are not going to be part of the
|
||||
// returned component, changes in frontmatter do not trigger proper updates
|
||||
const cachedData = devCache.get(file)
|
||||
if (cachedData && (
|
||||
cachedData.inferredTitle !== inferredTitle
|
||||
|| JSON.stringify(cachedData.frontmatterData) !== JSON.stringify(frontmatter.data)
|
||||
|| JSON.stringify(cachedData.frontmatterData) !== JSON.stringify(data)
|
||||
|| headersChanged(cachedData.headers, headers)
|
||||
)) {
|
||||
// frontmatter changed... need to do a full reload
|
||||
@@ -60,7 +51,7 @@ module.exports = function (src) {
|
||||
|
||||
devCache.set(file, {
|
||||
headers,
|
||||
frontmatterData: frontmatter.data,
|
||||
frontmatterData: data,
|
||||
inferredTitle
|
||||
})
|
||||
}
|
||||
@@ -73,7 +64,7 @@ module.exports = function (src) {
|
||||
dataBlockString
|
||||
} = markdown.render(content, {
|
||||
loader,
|
||||
frontmatter: frontmatter.data,
|
||||
frontmatter: data,
|
||||
relPath: path.relative(sourceDir, file)
|
||||
})
|
||||
|
||||
@@ -114,7 +105,6 @@ module.exports = function (src) {
|
||||
+ (hoistedTags || []).join('\n')
|
||||
+ `\n${dataBlockString}\n`
|
||||
)
|
||||
cache.set(key, res)
|
||||
return res
|
||||
}
|
||||
|
||||
|
||||
@@ -19,7 +19,8 @@
|
||||
],
|
||||
"dependencies": {
|
||||
"@vuepress/markdown": "^1.0.0-alpha.39",
|
||||
"loader-utils": "^1.1.0"
|
||||
"loader-utils": "^1.1.0",
|
||||
"lru-cache": "^5.1.1"
|
||||
},
|
||||
"author": "Evan You",
|
||||
"maintainers": [
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
*/
|
||||
|
||||
const Config = require('markdown-it-chain')
|
||||
const LRUCache = require('lru-cache')
|
||||
const highlight = require('./lib/highlight')
|
||||
const { PLUGINS, REQUIRED_PLUGINS } = require('./lib/constant')
|
||||
const highlightLinesPlugin = require('./lib/highlightLines')
|
||||
@@ -19,7 +20,7 @@ const snippetPlugin = require('./lib/snippet')
|
||||
const emojiPlugin = require('markdown-it-emoji')
|
||||
const anchorPlugin = require('markdown-it-anchor')
|
||||
const tocPlugin = require('markdown-it-table-of-contents')
|
||||
const { parseHeaders, slugify: _slugify, logger, chalk } = require('@vuepress/shared-utils')
|
||||
const { parseHeaders, slugify: _slugify, logger, chalk, hash } = require('@vuepress/shared-utils')
|
||||
|
||||
/**
|
||||
* Create markdown by config.
|
||||
@@ -115,6 +116,21 @@ module.exports = (markdown = {}) => {
|
||||
|
||||
afterInstantiate && afterInstantiate(md)
|
||||
|
||||
// override parse to allow cache
|
||||
const parse = md.parse
|
||||
const cache = new LRUCache({ max: 1000 })
|
||||
md.parse = (src, env) => {
|
||||
const key = hash(src + env.relPath)
|
||||
const cached = cache.get(key)
|
||||
if (cached) {
|
||||
return cached
|
||||
} else {
|
||||
const tokens = parse.call(md, src, env)
|
||||
cache.set(key, tokens)
|
||||
return tokens
|
||||
}
|
||||
}
|
||||
|
||||
module.exports.dataReturnable(md)
|
||||
|
||||
// expose slugify
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
],
|
||||
"dependencies": {
|
||||
"@vuepress/shared-utils": "^1.0.0-alpha.39",
|
||||
"lru-cache": "^5.1.1",
|
||||
"markdown-it": "^8.4.1",
|
||||
"markdown-it-anchor": "^5.0.2",
|
||||
"markdown-it-chain": "^1.3.0",
|
||||
|
||||
Reference in New Issue
Block a user