UNPKG

vite-pug-static-builder

Version:

Vite + Pugを使用した静的サイトビルダー - 複数のPugファイルを静的HTMLとしてビルドするViteプラグイン

85 lines (84 loc) 3.8 kB
import path from 'node:path'; import { compileFile } from 'pug'; import { outputLog } from './utils.js'; /** * モジュールグラフに祖先モジュールを反映 * @param moduleGraph - モジュールグラフ * @param compiledModule - HTMLにコンパイルされるPugモジュール * @param ancestors - compiledModuleの祖先ファイルパス配列 */ const reflectAncestorsIntoModuleMap = (moduleGraph, compiledModule, ancestors) => { // モジュールマップに祖先を追加 for (const ancestor of ancestors) { try { const ancestorModules = moduleGraph.getModulesByFile(ancestor); let ancestorModule; if (ancestorModules && ancestorModules.size > 0) { ancestorModule = [...ancestorModules][0]; } else { // Vite 7では createFileOnlyEntry の代わりに ensureEntryFromUrl を使用 const ancestorUrl = ancestor.replace(process.cwd(), '').replace(/\\/g, '/'); ancestorModule = moduleGraph.getModuleById(ancestorUrl) || undefined; } if (ancestorModule) { ancestorModule.importers.add(compiledModule); // TODO: 依存関係から削除された場合の処理 compiledModule.importedModules.add(ancestorModule); // オプション } } catch (error) { // 祖先モジュールの処理に失敗した場合はログを出力して続行 outputLog('warn', 'ancestor module processing failed:', ancestor); } } }; /** * Pugファイルをコンパイル * @param moduleGraph - モジュールグラフ * @param url - ルート相対パス * @param pugPath - Pugファイルの絶対パス(POSIX形式) * @param options - Pugコンパイルオプション * @param locals - Pugローカル変数オブジェクト * @returns コンパイル結果(成功時はtrue、エラー時はErrorオブジェクト) */ export const compilePug = async (moduleGraph, url, pugPath, options, locals) => { try { const compiledModule = (await moduleGraph.getModuleByUrl(url)) || (await moduleGraph.ensureEntryFromUrl(url)); // 作成時の初期化 if (compiledModule.file !== pugPath) { // Vite 7では直接fileToModulesMapを操作できないため、 // モジュールの無効化を通じてファイルパスを更新 if (compiledModule.file) { moduleGraph.invalidateModule(compiledModule); } compiledModule.file = pugPath; // Vite 7ではModuleGraphが自動的にfileToModulesMapを管理 } // モジュールが無効化されていない場合はスキップ if (compiledModule.transformResult) { return true; } // コンパイル開始 const map = null; const compiledTemplate = compileFile(pugPath, options); // Pugコンパイラから祖先情報を取得 const ancestors = compiledTemplate.dependencies; if (ancestors.length > 0) { reflectAncestorsIntoModuleMap(moduleGraph, compiledModule, ancestors); } // HTML生成 const code = compiledTemplate(locals); outputLog('info', 'compiled:', path.relative(process.cwd(), pugPath)); compiledModule.transformResult = { code, map }; return true; } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); outputLog('error', 'compilation failed:', pugPath, errorMessage); if (error instanceof Error) { return error; } return new Error(`Pug compilation failed: ${errorMessage}`); } };