Astro更新后使用Astro.glob()导入MD文件报错求助
Astro.glob()导入Markdown文件失效问题解决
问题概述
此前用Astro.glob()导入Markdown文件搭建动态博客运行正常,近期Astro更新后功能失效,仅.md文件出现问题,.astro文件可正常导入。需求是导入Markdown文件并获取URL数据,传递给组件生成路由。
错误信息
错误: 无效的glob表达式: "*.md" (解析后: "*.md")。它必须以 '/' 或 './' 开头 at toAbsoluteGlob (file:///home/kinire98/Documents/portfolio/node_modules/vite/dist/node/chunks/dep-DyBnyoVI.js:39014:9) at async Promise.all (index 0) at async file:///home/kinire98/Documents/portfolio/node_modules/vite/dist/node/chunks/dep-DyBnyoVI.js:38843:27) at async Promise.all (index 0) at async parseImportGlob (file:///home/kinire98/Documents/portfolio/node_modules/vite/dist/node/chunks/dep-DyBnyoVI.js:38857:11) at async transformGlobImport (file:///home/kinire98/Documents/portfolio/node_modules/vite/dist/node/chunks/dep-DyBnyoVI.js:38888:19) at async TransformPluginContext.transform (file:///home/kinire98/Documents/portfolio/node_modules/vite/dist/node/chunks/dep-DyBnyoVI.js:38662:22) at async PluginContainer.transform (file:///home/kinire98/Documents/portfolio/node_modules/vite/dist/node/chunks/dep-DyBnyoVI.js:49033:18) at async loadAndTransform (file:///home/kinire98/Documents/portfolio/node_modules/vite/dist/node/chunks/dep-DyBnyoVI.js:51866:27)
相关代码与文件结构
文件结构
project_root/ ├── pages/ │ └── blog/ │ └── *.md ├── layouts/ │ └── BlogPostLayout.astro └── helpers/ └── shuffleArray.js
页面导入代码示例
--- let posts: any[]; try { posts = await Astro.glob("./blog/*.md"); console.log(posts.length); posts = shuffleArray(posts); posts = posts.slice(0, 15); } catch (error) { posts = []; console.log(error); } ---
博客文章布局代码(BlogPostLayout.astro)
import shuffleArray from "../helpers/shuffleArray"; import MenuLayout from "./MenuLayout.astro"; const { frontmatter } = Astro.props; let posts; try { posts = await Astro.glob("*.md"); // 此处路径格式不符合新规则 posts = shuffleArray(posts); let i; for(i = 0; i < posts.length - 2; i++) { if (posts[i].url === Astro.url.pathname || posts[i + 1].url === Astro.url.pathname || posts[i + 2].url === Astro.url.pathname) { continue; } break; } posts = posts.slice(i, i + 2); } catch (error) { posts = ""; } <MenuLayout title={frontmatter.title}> <main> <article id="central"> <slot /> </article> </main> </MenuLayout>
Markdown文件头部示例
--- layout: ../../layouts/BlogPostLayout.astro title: Something author: something img_url: /obiwan.gif date: 2024-05-29 ---
解决方案
核心问题是Astro更新后,对Astro.glob()的路径格式做了严格要求,必须使用相对路径(以./开头)或绝对路径(以/开头),此前的"*.md"属于无相对/绝对标识的路径,不符合新规则。
具体修复步骤
修正布局组件中的glob路径:
根据文件结构,从layouts/BlogPostLayout.astro到pages/blog/*.md的相对路径为../pages/blog/*.md,替换原错误路径:posts = await Astro.glob("../pages/blog/*.md");验证路径正确性:
运行项目后,通过console.log(posts)确认是否成功导入Markdown文件,若仍无内容,检查路径是否与实际文件结构匹配。统一所有glob路径格式:
确保项目中所有Astro.glob()的路径都以./或/开头,避免后续出现类似问题。
内容的提问来源于stack exchange,提问作者kinire
相关产品推荐
相关产品推荐

