может ли webpack сгенерировать один json-файл frontmatter из нескольких точек входа уценки?
У меня есть webpack.config.js
который использует динамическую точку входа для получения файлов разметки в папке:
module.exports = {
async entry() {
// get a list of .mdx files
const mdxFiles = await glob('./content/**/*.md{,x}', { dot: devMode })
// map each file to a "pretty" keyed tuple
.then(list => list.map(filename => [filename.replace(/\.mdx?$/, ''), filename]))
.then(Object.fromEntries) // into an object
return { main: './src/client/index', ...mdxFiles }
// semantically i'd prefer mdxFiles was an array, but this
// is the easiest way to get separate output files for each input
},
// more webpack config...
}
используя собственный загрузчик из документации mdx:
const matter = require('gray-matter')
const stringifyObject = require('stringify-object')
module.exports = function mdxLoader(src) {
const { content, data } = matter(src)
return `export const frontMatter = ${stringifyObject(data)};\n\n${content}`
}
это преобразует уценку в jsx, а затем в вызовы React, используя @mdx-js/loader
а также babel-loader
. Фронтматтер в каждом файле уценки преобразуется в
export const metadata = { title: "hello world", description, ...etc};
// export default MDXComponent...
Я пытаюсь написать собственный плагин для извлечения всех метаданных в один файл, но, насколько я могу судить, весь контекст синтаксического анализа babel потерян, и код представляет собой просто большую строку javascript, готовую к записи на диск.
Вместо взлома парсинга регулярных выражений, как лучше всего извлечь эти метаданные? export
из каждого файла в один объект, который нужно преобразовать в строку и добавить в манифест webpack?