egg.js 必须要用模板引擎 才能渲染在view下的html文件吗?
本人刚学习接触egg.js 现在尝试自己写 暂时没找到怎么配置下能够直接访问view下的html文件。配了官方例子中的模板应该可以 但是我现在就是想知道不安装任何模板引擎是否也能访问到view下的html文件@atian25
9 回复
自己写个 egg-view-simple,或者在 app/extend/context.js
直接覆盖掉 context.render
@atian25 好滴 谢谢 还以为有现成的 我尝试下 实在实现不了我再来取经
我想你应该是想提供静态文件吧。。 egg-static
正常读取文件返回字符流就行了呀,设置好 Content-Type
就不会触发下载了。
class HomeController extends Controller {
async index() {
const file = path.resolve(this.app.config.static.dir, 'index.html');
this.ctx.set('Content-Type', 'text/html');
this.ctx.body = await fs.readFileSync(file);
}
}
@tczhangzhi 不要 sync… 而且还需要 cache
@atian25 这样(逃
const file = path.resolve(__dirname, '../public/index.html');
let index;
fs.readFile(file, (err, data) => {
index = data;
});
class HomeController extends Controller {
async index() {
this.ctx.set('Content-Type', 'text/html');
this.ctx.body = index;
}
}
@tczhangzhi 重启那一刻,文件还没读完,用户就有一定概率进来了。
其实就算是单页应用,把 index.html 放到 view 下用模板渲染出来就好了啊,又没啥损耗
@atian25 ( ̄(エ) ̄) 是吼~ 但是感觉 html 被其他模板过一遍有些不和谐呀~ 再改改,233
// app/lib/plugin/egg-view-html/lib/view.js
'use strict';
const fs = require('fs');
const cache = {};
module.exports = class HtmlView {
async render(filename) {
if (!cache[filename]) {
cache[filename] = await fs.readFileSync(filename);
};
return cache[filename];
}
async renderString(tpl) {
return tpl;
}
};
尽可能的不用 Sync
const fs = require('mz/fs');
// ...
cache[filename] = await fs.readFile(filename);