Mu icon indicating copy to clipboard operation
Mu copied to clipboard

Integration with express

Open smebberson opened this issue 12 years ago • 4 comments

I've recently integrated Mu with express as the default templating engine for HTML files. I used the following module to achieve it:

var mu = require('mu2');

exports.__express = function (path, options, callback) {

    var result = '';

    var stream = mu.compileAndRender(path, options)
    .on('data', function (data) {
        result += data.toString();
    })
    .on('end', function () {
        callback(null, result);
    });

}

I wonder if you'd consider integrating something like the above into Mu? It needs a little more work, because you should be able to control caching within the options handle which I haven't wired up. But the above code works along with the following to integrate it into express:

app.set('views', __dirname + '/layouts');   // tell express where my views are
app.engine('html', muexpress.__express);    // register the mu templating engine (using my mu-express gateway)
app.set('view engine', 'html');             // register the default template engine as html

If you integrate it, I'd be keen to add a patch to https://github.com/visionmedia/consolidate.js/ so that you can use Mu with express quite simply.

Let me know your thoughts. I'd be happy to integrate it into Mu myself and send through a pull request.

cheers, Scott.

smebberson avatar Jun 04 '13 00:06 smebberson

I think one of the issues with this is that you're losing the streaming capability that Mu provides.

RangerMauve avatar Jan 12 '14 09:01 RangerMauve

From what I can see, the express rendering interface doesn't accept a stream though, just a string?

smebberson avatar Jan 12 '14 22:01 smebberson

That's exactly the problem. I ended up creating my own implementation of res.render() that has the same API and uses the same express features (app.locals, app.set("views"), etc), but does streaming instead of rendering a single string.

RangerMauve avatar Jan 13 '14 03:01 RangerMauve

I am not sure I want to expose a non-streaming API. I do have an express engine wrapper around Twitter's Mustache (non-streaming) Hogan here: https://github.com/raycmorgan/hogan-engine

I use that one when I am just making simple Express apps and don't care much about streaming/performance. There are a few differences between Hogan/Mu from my experimenting with it, so maybe a mu-engine module that simply wraps Mu into what Express needs would be good.

raycmorgan avatar Jan 13 '14 18:01 raycmorgan