51 lines
1.4 KiB
TypeScript
51 lines
1.4 KiB
TypeScript
import { defineNuxtModule } from "@nuxt/kit";
|
|
import fs from "fs";
|
|
import path from "path";
|
|
import pkg from "../package.json";
|
|
|
|
export default defineNuxtModule({
|
|
meta: { name: "generate-manifest" },
|
|
async setup(_, nuxt) {
|
|
const generateManifest = () => {
|
|
const manifestDir = path.resolve(nuxt.options.rootDir, "manifest");
|
|
if (!fs.existsSync(manifestDir)) {
|
|
return;
|
|
}
|
|
|
|
// 只读取 ts 文件
|
|
const files = fs
|
|
.readdirSync(manifestDir)
|
|
.filter((f) => f.endsWith(".ts"));
|
|
const components = files.map((f) => {
|
|
const mod = require(path.join(manifestDir, f));
|
|
return mod.default;
|
|
});
|
|
|
|
const remoteEntry = `remoteEntry_${pkg.version}.js`;
|
|
|
|
const outPath = path.join(nuxt.options.rootDir, "public/generated/manifest.js");
|
|
|
|
fs.mkdirSync(path.dirname(outPath), { recursive: true });
|
|
fs.writeFileSync(
|
|
outPath,
|
|
`// ⚠️ 自动生成,请勿修改
|
|
export const manifestInfo = ${JSON.stringify(
|
|
{ version: pkg.version, prefix: "_nuxt", remoteEntry, components },
|
|
null,
|
|
2,
|
|
)};
|
|
`,
|
|
"utf-8",
|
|
);
|
|
|
|
return;
|
|
};
|
|
|
|
// 初始化就生成一次,保证 dev/build 第一阶段文件存在
|
|
generateManifest();
|
|
|
|
// build 前再生成一次
|
|
nuxt.hooks.hook("nitro:build:before", generateManifest);
|
|
},
|
|
});
|