egg.js 必须要用模板引擎 才能渲染在view下的html文件吗?
发布于 10 个月前 作者 shenjianzch 4789 次浏览 来自 问答

本人刚学习接触egg.js 现在尝试自己写 暂时没找到怎么配置下能够直接访问view下的html文件。配了官方例子中的模板应该可以 但是我现在就是想知道不安装任何模板引擎是否也能访问到view下的html文件@atian25

9 回复

自己写个 egg-view-simple,或者在 app/extend/context.js 直接覆盖掉 context.render

@atian25 好滴 谢谢 还以为有现成的 我尝试下 实在实现不了我再来取经

我想你应该是想提供静态文件吧。。 egg-static

https://eggjs.org/zh-cn/plugins/static.html

正常读取文件返回字符流就行了呀,设置好 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;
  }
};

@tczhangzhi

尽可能的不用 Sync

const fs = require('mz/fs');
// ...
cache[filename] = await fs.readFile(filename);
回到顶部