如何编写异步请求以获取降价文件的内容?苗条
How do I write an async request to get a markdown file's content? Svelte
我正在使用 Svelte 构建我的博客,但我正在将结构切换为通过 JSON API.
访问
现在很容易获得降价元数据和路径,但我也想获得内容。
我如何修改此 posts.json.js 文件以获取内容?
const allPostFiles = import.meta.glob('../blog/posts/*.md')
const iterablePostFiles = Object.entries(allPostFiles)
const allPosts = await Promise.all(
iterablePostFiles.map(async ([path, resolver]) => {
const { metadata } = await resolver()
const postPath = path.slice(2, -3)
return {
meta: metadata,
path: postPath
}
})
)
const sortedPosts = allPosts.sort((a, b) => {
return new Date(b.meta.date) - new Date(a.meta.date)
})
return {
body: sortedPosts
}
安装并启用 vite-plugin-markdown
// svelte.config.js
import { plugin as markdown, Mode } from "vite-plugin-markdown";
/** @type {import('@sveltejs/kit').Config} */
export default {
kit: {
vite: {
plugins: [markdown({ mode: Mode.HTML })],
},
},
};
那么内容将以 html
的形式提供,前文数据将以 attributes
的形式提供
iterablePostFiles.map(async ([path, resolver]) => {
const { attributes, html } = await resolver();
return {
attributes,
html,
path: path.slice(2, -3),
};
})
(我建议通过 frontmatter 将元数据添加到降价文件中)
上面的答案非常有效,但它也可以使用以下代码调整 API:
const allPosts = await Promise.all(
iterablePostFiles.map(async ([path, resolver]) => {
const { metadata } = await resolver()
// because we know every path will start with '..' and end with '.md', we can slice from the beginning and the end
const postPath = path.slice(2, -3)
const post = await resolver()
const content = post.default.render()
return {
meta: metadata,
path: postPath,
text: content
}
})
)
重要的补充是:
const post = await resolver()
const content = post.default.render()
使用这些变量链来避免使用JS保留字default
。
我正在使用 Svelte 构建我的博客,但我正在将结构切换为通过 JSON API.
访问现在很容易获得降价元数据和路径,但我也想获得内容。
我如何修改此 posts.json.js 文件以获取内容?
const allPostFiles = import.meta.glob('../blog/posts/*.md')
const iterablePostFiles = Object.entries(allPostFiles)
const allPosts = await Promise.all(
iterablePostFiles.map(async ([path, resolver]) => {
const { metadata } = await resolver()
const postPath = path.slice(2, -3)
return {
meta: metadata,
path: postPath
}
})
)
const sortedPosts = allPosts.sort((a, b) => {
return new Date(b.meta.date) - new Date(a.meta.date)
})
return {
body: sortedPosts
}
安装并启用 vite-plugin-markdown
// svelte.config.js
import { plugin as markdown, Mode } from "vite-plugin-markdown";
/** @type {import('@sveltejs/kit').Config} */
export default {
kit: {
vite: {
plugins: [markdown({ mode: Mode.HTML })],
},
},
};
那么内容将以 html
的形式提供,前文数据将以 attributes
iterablePostFiles.map(async ([path, resolver]) => {
const { attributes, html } = await resolver();
return {
attributes,
html,
path: path.slice(2, -3),
};
})
(我建议通过 frontmatter 将元数据添加到降价文件中)
上面的答案非常有效,但它也可以使用以下代码调整 API:
const allPosts = await Promise.all(
iterablePostFiles.map(async ([path, resolver]) => {
const { metadata } = await resolver()
// because we know every path will start with '..' and end with '.md', we can slice from the beginning and the end
const postPath = path.slice(2, -3)
const post = await resolver()
const content = post.default.render()
return {
meta: metadata,
path: postPath,
text: content
}
})
)
重要的补充是:
const post = await resolver()
const content = post.default.render()
使用这些变量链来避免使用JS保留字default
。