求Node.js脚本:将_*.html片段合并到index.html指定位置
实现HTML片段合并的Node.js脚本
下面是满足需求的完整脚本,可直接运行:
安装依赖(可选,用原生fs可跳过)
如果想更便捷地匹配文件,先安装glob包:
npm install glob --save-dev
完整脚本代码
const fs = require('fs').promises; const path = require('path'); const glob = require('glob'); // 配置项:修改为你的实际目录 const targetDir = './'; const indexHtmlPath = path.join(targetDir, 'index.html'); const fragmentFilePattern = path.join(targetDir, '_*.html'); async function mergeHtmlParts() { try { // 1. 查找所有下划线开头的HTML片段文件 const fragmentFiles = await new Promise((resolve, reject) => { glob(fragmentFilePattern, (err, matches) => { err ? reject(err) : resolve(matches); }); }); if (!fragmentFiles.length) { console.log('未找到任何_*.html格式的片段文件'); return; } // 2. 读取所有片段内容并建立标记映射 const fragmentMap = new Map(); for (const file of fragmentFiles) { const baseName = path.basename(file); // 从文件名提取标记:_nav.html → @nav const tag = `@${baseName.slice(1, -5)}`; const content = await fs.readFile(file, 'utf8'); fragmentMap.set(tag, content.trim()); } // 3. 读取原始index.html内容 let indexContent = await fs.readFile(indexHtmlPath, 'utf8'); // 4. 替换所有标记为对应片段内容 fragmentMap.forEach((content, tag) => { // 用字符串拆分拼接替代正则,避免特殊字符问题 indexContent = indexContent.split(tag).join(content); }); // 5. 写入合并后的文件(直接覆盖原index.html,可修改路径保存新文件) await fs.writeFile(indexHtmlPath, indexContent, 'utf8'); console.log('合并完成!index.html已更新'); } catch (error) { console.error('合并过程出错:', error); } } // 执行合并 mergeHtmlParts();
原生fs适配(无需第三方包)
如果不想安装glob,把查找文件的代码替换成以下原生实现:
// 替换原有的fragmentFiles获取逻辑 const allFiles = await fs.readdir(targetDir); const fragmentFiles = allFiles .filter(file => file.startsWith('_') && file.endsWith('.html')) .map(file => path.join(targetDir, file));
使用说明
- 将脚本保存为
merge-html.js - 配置
targetDir为你的HTML文件所在目录 - 确保index.html中的标记与片段文件名对应:比如
_nav.html对应index.html里的@nav行 - 运行脚本:
node merge-html.js
注意事项
- 若片段内容包含特殊字符(如正则元字符),使用字符串拆分拼接的方式替换更安全(脚本中已采用这种方式)
- 若不想覆盖原index.html,可修改
writeFile的路径,比如改为path.join(targetDir, 'index-built.html')
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

