Meteor用fs.writeFileSync存HTML文件报Can't set DOCTYPE错误如何解决
错误原因
- 服务端编译报错:Meteor默认会扫描项目目录下所有
.html文件,识别为应用模板交给templating-compiler编译,而你通过puppeteer生成的是带完整DOCTYPE声明的独立HTML文件,不符合Meteor模板的语法规范,因此触发编译报错。 - 浏览器JSON解析报错:你存储HTML文件的路径刚好和某个前端请求的API路径重合,前端预期该接口返回JSON格式数据,实际拿到的是HTML文件内容,因此解析到首字符
<时触发语法错误。
修复方案
- 方案1:修改存储路径到Meteor构建扫描范围之外
不要把生成的HTML文件存放在项目业务代码目录下,可选择以下两种路径:- 存放到项目根目录之外的系统路径,比如
/opt/screenshot_files/page.html,完全避开Meteor的构建扫描 - 存放到Meteor默认忽略的特殊目录,比如项目根目录下的
.local/目录(Meteor默认不会扫描以.开头的隐藏目录),代码修改为:
// 提前手动创建./.local/screen_shots目录即可使用 fs.writeFileSync("./.local/screen_shots/page.html", html, 'utf8') - 存放到项目根目录之外的系统路径,比如
- 方案2:配置Meteor忽略指定目录
如果你确实需要把文件存在项目内的screen_shots目录下,可在项目根目录的package.json中添加构建忽略规则,让Meteor不处理该目录下的文件:{ "name": "你的项目名", // 保留原有的其他配置项 "meteor": { "build": { "ignore": ["screen_shots/**/*"] } } } - 方案3:修正路径冲突问题
排查前端请求的API路径,确保没有和HTML文件的静态访问路径重合。如果不需要对外提供这些生成HTML的访问能力,不要把文件存放在public目录下,避免Meteor把它当成静态资源对外暴露。
内容的提问来源于stack exchange,提问作者Fred J.
相关产品推荐
相关产品推荐

