diff --git a/packages/@vuepress/markdown-loader/index.js b/packages/@vuepress/markdown-loader/index.js index 5d19d6d1d7..4861d2c55e 100644 --- a/packages/@vuepress/markdown-loader/index.js +++ b/packages/@vuepress/markdown-loader/index.js @@ -6,10 +6,11 @@ const { EventEmitter } = require('events') const { getOptions } = require('loader-utils') -const { fs, path, parseFrontmatter, inferTitle, extractHeaders } = require('@vuepress/shared-utils') +const { fs, path, hash, 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 }) /** @@ -31,18 +32,26 @@ 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 { content, data } = parseFrontmatter(src) + 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 if (!isProd && !isServer) { - const inferredTitle = inferTitle(data, content) + const inferredTitle = inferTitle(frontmatter.data, frontmatter.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(data) + || JSON.stringify(cachedData.frontmatterData) !== JSON.stringify(frontmatter.data) || headersChanged(cachedData.headers, headers) )) { // frontmatter changed... need to do a full reload @@ -51,7 +60,7 @@ module.exports = function (src) { devCache.set(file, { headers, - frontmatterData: data, + frontmatterData: frontmatter.data, inferredTitle }) } @@ -64,7 +73,7 @@ module.exports = function (src) { dataBlockString } = markdown.render(content, { loader, - frontmatter: data, + frontmatter: frontmatter.data, relativePath: path.relative(sourceDir, file).replace(/\\/g, '/') }) @@ -105,6 +114,7 @@ module.exports = function (src) { + (hoistedTags || []).join('\n') + `\n${dataBlockString}\n` ) + cache.set(key, res) return res } diff --git a/packages/@vuepress/markdown/index.js b/packages/@vuepress/markdown/index.js index 5061b6a358..fae5948ab4 100644 --- a/packages/@vuepress/markdown/index.js +++ b/packages/@vuepress/markdown/index.js @@ -5,7 +5,6 @@ */ 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') @@ -21,7 +20,7 @@ const tocPlugin = require('markdown-it-table-of-contents') const { slugify: _slugify, parseHeaders, - logger, chalk, hash, normalizeConfig, + logger, chalk, normalizeConfig, moduleResolver: { getMarkdownItResolver } } = require('@vuepress/shared-utils') @@ -124,21 +123,6 @@ 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.relativePath) - 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 diff --git a/packages/@vuepress/markdown/package.json b/packages/@vuepress/markdown/package.json index d739a72700..53227edc20 100644 --- a/packages/@vuepress/markdown/package.json +++ b/packages/@vuepress/markdown/package.json @@ -20,7 +20,6 @@ ], "dependencies": { "@vuepress/shared-utils": "^1.0.0-alpha.47", - "lru-cache": "^5.1.1", "markdown-it": "^8.4.1", "markdown-it-anchor": "^5.0.2", "markdown-it-chain": "^1.3.0",