Discuss / JavaScript / 慢着,好像不太对劲

慢着,好像不太对劲

Topic source

//廖大用middleware的形式给ctx添加了一个render方法:

function templating(path, opts) {
// 创建Nunjucks的env对象:
var env = createEnv(path, opts);
return async (ctx, next) => {
    // 给ctx绑定render函数:
    ctx.render = function (view, model) {
        // 把render后的内容赋值给response.body:
        ctx.response.body = env.render(view, Object.assign({}, ctx.state || {}, model || {}));
        // 设置Content-Type:
        ctx.response.type = 'text/html';
    };
    // 继续处理请求:
    await next();
};

}

根据经验middleware会过滤每一个请求。 那么问题来了,是不是每次客户端请求都要给ctx实例增加一次render方法? 像这个本来应该只做一次的操作,假如访问量很大,每天做很多次岂不是白白浪费了计算资源。 不对劲.jpg

本屌摸索了一下午,找到了一个好像还凑合的解决办法。


//先在app.js文件里捅咕一下

const nunjucks_env = require("./templating")("views",{     //实例化一个模板引擎
                           noCache: !isProduction,
                           watch: !isProduction
                           });
//给app.context添加一个魔改render方法,和廖大那版方法签名不一样。 (ctx是app.context一个的实例)
//功能和middleware版function templating()相同,但添加render方法的动作在这里只执行一次。
app.context.render=async (view,model,ctx) => { 
    ctx.response.body= nunjucks_env.render(view,model); 
    ctx.response.type = "text/html";
}

app.use(templateing()) 原来的一些零碎就不要了


下面给templating.js动动手术

const nunjucks = require('nunjucks');
function createEnv(path, opts) {   //createEnv保留
   ......
   return env;
}

//这个function templating()不能要了,已经在app.js用上了魔改的render(v,m,c) function templating(path, opts) { // 创建Nunjucks的env对象: var env = createEnv(path, opts); return async (ctx, next) => { // 给ctx绑定render函数: ctx.render = function (view, model) { // 把render后的内容赋值给response.body: ctx.response.body = env.render(view, Object.assign({}, ctx.state || {}, model || {})); // 设置Content-Type: ctx.response.type = 'text/html'; }; // 继续处理请求: await next(); }; }

//templating.js向外界暴露createEnv

module.exports = createEnv;

//最后来捅咕一下控制器,以controllers / index.js为例

var fn_index = async (ctx, next) => { //廖大写法
    ctx.render('index.html', {
        title: 'Welcome'
    });
}
------------------
var fn_index = async (ctx,next) => {  //本屌写法
    await ctx.render("index.html",{
        title: "Welcome"
    },ctx ); //调用ctx.render()时略有区别,这里需要传入ctx实例。
};

npm start //启动服务器,测试一下,成功啦。

node app.js process controller: hello.js ... register URL mapping: GET --> /hello/:name process controller: index.js ... register URL mapping: GET --> / register URL mapping: POST --> /signin process controller: login.js ... process controller: users.js ... app started at port 3000... Process GET /... Process GET /static/css/bootstrap.css... Process GET /static/js/bootstrap.js... Process GET /static/fonts/glyphicons-halflings-regular.woff...


这么改一下是不是显得有点科学了?

前年我在廖大的网站上学了很久的python。 python实战课程完成后来学过一次javascript,效果不太理想。 可能当时我的脑容量已经饱和,塞不进新知识了。 这次我可能要接一个微信小程序的活,先来学一下javascript防身。 想不到本次的学习效果居然不赖,学得美滋滋,上次闹不懂的知识点这次全get到了。 学习有进步本来是件很开心的事情,但是我隐隐感觉到哪里不太对劲。 不对劲.png

#日哦,我的python全忘光咯.............#

jklklkm

#3 Created at ... [Delete] [Delete and Lock User]

我觉得可以

jklklkm

#4 Created at ... [Delete] [Delete and Lock User]

render函数那里不用显式地传ctx进去, 直接用this就好

this.response.body= nunjucks_env.render(view,model)
....

  • 1

Reply