Use mithril views to render server side
npm install mithril-node-render
// Make Mithril happy
if (!global.window) {
global.window = global.document = global.requestAnimationFrame = undefined
}
var m = require('mithril')
var render = require('mithril-node-render')
render(m('span', 'huhu')).then(function (html) {
// html === '<span>huhu</span>'
})
var html = render.sync(m('span', 'huhu'))
// html === '<span>huhu</span>'
As you see the rendering is asynchronous. It lets you await certain data from within oninit
hooks.
var myAsyncComponent = {
oninit: function (node, waitFor) {
waitFor(new Promise(function (resolve) {
node.state.foo = 'bar'
resolve()
}))
},
view: function (node) {
return m('div', node.state.foo)
}
}
render(myAsyncComponent).then(function (html) {
// html === '<div>bar</div>'
})
You can also render synchronously. You just don't get the waitFor
callback.
var myAsyncComponent = {
oninit: function (node, waitFor) {
// waitFor === undefined
new Promise(function (resolve) {
node.state.foo = 'bar'
resolve()
})
},
view: function (node) {
return m('div', node.state.foo)
}
}
var html = render.sync(myAsyncComponent)
// html === '<div>bar</div>'
Optionally pass in options as an object: render(component, options)
.
The following options are supported:
escapeAttribute(value)
Default: render.escapeAttribute
A filter function for attribute values. Receives value, returns what is printed.
escapeText(value)
Default: render.escapeText
A filter function for string nodes. Receives value, returns what is printed.
strict
Default: false
Set this to true to close all empty tags automatically. Default is standard HTML mode where tags like <br>
and <meta>
are allowed to implicitly close themselves. This should be set to true
if you're rendering XML-compatible HTML documents.
xml
Default: false
Set this to true to render as generic XML instead of (possibly XML-compatible) HTML. Default is HTML mode, where children of void elements are ignored. This implies strict: true
.
- Blog post about isomorphic mithril applications
- Usage Example