fix(andreknie.de): close accessibility and performance review gaps
This commit is contained in:
@@ -7,8 +7,11 @@ import * as yaml from 'js-yaml'
|
||||
const CONTENT_DIR = resolve(process.cwd(), 'content')
|
||||
const VIRTUAL_MODULE_ID = 'virtual:content'
|
||||
const RESOLVED_VIRTUAL_MODULE_ID = '\0' + VIRTUAL_MODULE_ID
|
||||
const DETAILS_VIRTUAL_MODULE_ID = 'virtual:content-details'
|
||||
const RESOLVED_DETAILS_VIRTUAL_MODULE_ID = '\0' + DETAILS_VIRTUAL_MODULE_ID
|
||||
const DETAIL_LOADERS_MODULE_ID = 'virtual:content-detail-loaders'
|
||||
const RESOLVED_DETAIL_LOADERS_MODULE_ID = '\0' + DETAIL_LOADERS_MODULE_ID
|
||||
const DETAIL_MODULE_PREFIX = 'virtual:content-detail/'
|
||||
const RESOLVED_DETAIL_MODULE_PREFIX = '\0' + DETAIL_MODULE_PREFIX
|
||||
const DETAIL_TYPES = ['posts', 'kniepunkt']
|
||||
|
||||
function readContentDir(subdir, includeBodies = false) {
|
||||
const dir = join(CONTENT_DIR, subdir)
|
||||
@@ -25,7 +28,7 @@ function readContentDir(subdir, includeBodies = false) {
|
||||
const raw = readFileSync(filepath, 'utf-8')
|
||||
const { data, content } = matter(raw)
|
||||
const body = renderMarkdownContent(content)
|
||||
const searchText = body.replace(/<[^>]+>/g, ' ').replace(/\s+/g, ' ').trim()
|
||||
const searchText = body.replace(/<[^>]+>/g, ' ').replace(/\s+/g, ' ').trim().slice(0, 320)
|
||||
return {
|
||||
...data,
|
||||
slug,
|
||||
@@ -86,30 +89,57 @@ function loadAllContent(includeBodies = false) {
|
||||
}
|
||||
}
|
||||
|
||||
function createDetailLoadersModule() {
|
||||
const typeEntries = DETAIL_TYPES.map(type => {
|
||||
const loaders = readContentDir(type)
|
||||
.map(item => `${JSON.stringify(item.slug)}: () => import(${JSON.stringify(`${DETAIL_MODULE_PREFIX}${type}/${item.slug}`)})`)
|
||||
.join(',\n')
|
||||
return `${JSON.stringify(type)}: {\n${loaders}\n}`
|
||||
})
|
||||
|
||||
return `export default {\n${typeEntries.join(',\n')}\n}`
|
||||
}
|
||||
|
||||
function loadDetailModule(id) {
|
||||
const relativeId = id.slice(RESOLVED_DETAIL_MODULE_PREFIX.length)
|
||||
const separator = relativeId.indexOf('/')
|
||||
if (separator < 1) return null
|
||||
|
||||
const type = relativeId.slice(0, separator)
|
||||
const slug = relativeId.slice(separator + 1)
|
||||
if (!DETAIL_TYPES.includes(type)) return null
|
||||
|
||||
const item = readContentDir(type, true).find(candidate => candidate.slug === slug)
|
||||
return item ? `export default ${JSON.stringify(item)}` : null
|
||||
}
|
||||
|
||||
export default function contentPlugin() {
|
||||
return {
|
||||
name: 'vite-plugin-content',
|
||||
resolveId(id) {
|
||||
if (id === VIRTUAL_MODULE_ID) return RESOLVED_VIRTUAL_MODULE_ID
|
||||
if (id === DETAILS_VIRTUAL_MODULE_ID) return RESOLVED_DETAILS_VIRTUAL_MODULE_ID
|
||||
if (id === DETAIL_LOADERS_MODULE_ID) return RESOLVED_DETAIL_LOADERS_MODULE_ID
|
||||
if (id.startsWith(DETAIL_MODULE_PREFIX)) return `\0${id}`
|
||||
},
|
||||
load(id) {
|
||||
if (id === RESOLVED_VIRTUAL_MODULE_ID) {
|
||||
const content = loadAllContent()
|
||||
return `export default ${JSON.stringify(content)}`
|
||||
}
|
||||
if (id === RESOLVED_DETAILS_VIRTUAL_MODULE_ID) {
|
||||
const content = loadAllContent(true)
|
||||
return `export default ${JSON.stringify(content)}`
|
||||
}
|
||||
if (id === RESOLVED_DETAIL_LOADERS_MODULE_ID) return createDetailLoadersModule()
|
||||
if (id.startsWith(RESOLVED_DETAIL_MODULE_PREFIX)) return loadDetailModule(id)
|
||||
},
|
||||
handleHotUpdate({ file, server }) {
|
||||
if (file.includes('content')) {
|
||||
const mod = server.moduleGraph.getModuleById(RESOLVED_VIRTUAL_MODULE_ID)
|
||||
if (mod) {
|
||||
server.moduleGraph.invalidateModule(mod)
|
||||
return [mod]
|
||||
}
|
||||
const modules = [
|
||||
server.moduleGraph.getModuleById(RESOLVED_VIRTUAL_MODULE_ID),
|
||||
server.moduleGraph.getModuleById(RESOLVED_DETAIL_LOADERS_MODULE_ID),
|
||||
...Array.from(server.moduleGraph.idToModuleMap.entries())
|
||||
.filter(([id]) => id.startsWith(RESOLVED_DETAIL_MODULE_PREFIX))
|
||||
.map(([, module]) => module),
|
||||
].filter(Boolean)
|
||||
modules.forEach(module => server.moduleGraph.invalidateModule(module))
|
||||
return modules
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user