我正在使用GLOB导入加载目录中的所有标记文件:

const useGetChangelogs = () => {
  const [changelogs, setChangelogs] = useState<string[]>([]);

  useEffect(() => {
    const arr: string[] = [];
    Promise.all(Object.keys(import.meta.glob("~/changelogs/*.md")).sort((a, b) => b.localeCompare(a))
      .map(async (file) => fetch(file)
        .then((res) => res.text())
        .then((str) => arr.push(str))
      )
    ).then(() => setChangelogs(arr)).catch((err) => console.error(err));
  }, []);

  return changelogs;
};

在运行开发构建时,它可以很好地工作,但在生产中,它会显示以下内容:

<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>Error</title> </head> <body> <pre>Cannot GET /changelogs/v0.8.4-alpha.md</pre> </body> </html>

螺丝配置:

import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
import eslint from "vite-plugin-eslint";
import svgr from "vite-plugin-svgr";
import path from "path";
import autoprefixer from "autoprefixer";

const output = {
  manualChunks: (id: string) => {
    if (id.includes("node_modules")) return id.toString().split("node_modules/")[1].split("/")[0].toString();
  }
};

export default defineConfig({
  server: { host: "0.0.0.0", port: 3000 },
  resolve: { alias: { "~": path.resolve(__dirname, "src") } },
  css: { postcss: { plugins: [autoprefixer()] }, modules: { localsConvention: "camelCase" } },
  plugins: [react(), eslint(), svgr()],
  assetsInclude: ["**/*.md"],
  build: { rollupOptions: { output } }
});

我try 按照Vue + Vite + Rollup: Dynamic import not working on production build中的建议将以下选项添加到我的RolupOptions中,但似乎不起作用

export default defineConfig({
    build: {
        rollupOptions: {
            external: [
                "/path/to/external/module.es.js"
            ]
        }
    }
})

任何帮助都将不胜感激.

推荐答案

我最终自己解决了这个问题.在对GLOB导入有了更好的理解之后,我能够抛弃定制钩子,而 Select 一个简单得多的解决方案.

const changelogs = Object.values(import.meta.glob("~/changelogs/*.md", { eager: true, as: "raw" }));

此解决方案还具有不使用FETCH的好处,文件在构建时而不是在运行时导入.

使用这个解决方案,我还可以从我的VITE配置中删除assetsInclude: ["**/*.md"]个.

Typescript相关问答推荐

忽略和K的定义

如何根据另一个属性的布尔值来缩小函数属性的返回类型?

在不更改类型签名的情况下在数组并集上映射文字

扩展参数必须具有元组类型或传递给REST参数

使用数组作为类型中允许的键的列表

如何将定义模型(在Vue 3.4中)用于输入以外的其他用途

声明文件中的类型继承

下载量怎么会超过下载量?

常量类型参数回退类型

APP_INITIALIZER在继续到其他Provider 之前未解析promise

转换器不需要的类型交集

如何静态键入返回数组1到n的函数

仅当类型为联合类型时映射属性类型

Route.ts文件中未导出HTTP方法

仅当定义了值时才按值筛选数组

如何通过nx找到所有受影响的项目?

我应该使用服务方法(依赖于可观察的)在组件中进行计算吗?

元组解释

TS2532:对象可能未定义

显式推断元组类型