You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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"属于无相对/绝对标识的路径,不符合新规则。

具体修复步骤

  1. 修正布局组件中的glob路径:
    根据文件结构,从layouts/BlogPostLayout.astro到pages/blog/*.md的相对路径为../pages/blog/*.md,替换原错误路径:

    posts = await Astro.glob("../pages/blog/*.md");
    
  2. 验证路径正确性:
    运行项目后,通过console.log(posts)确认是否成功导入Markdown文件,若仍无内容,检查路径是否与实际文件结构匹配。

  3. 统一所有glob路径格式:
    确保项目中所有Astro.glob()的路径都以./或/开头,避免后续出现类似问题。

内容的提问来源于stack exchange,提问作者kinire

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 04:02:27