Hapi.js is a small Node framework for developing back end web apps.
In this article, we’ll look at how to create back end apps with Hapi.js.
Rendering Templates
We can render templates with the @hapi/vision
module.
For instance, we can write:
index.js
const Ejs = require('ejs');
const Hapi = require('@hapi/hapi');
const Vision = require('@hapi/vision');
const server = Hapi.Server({ port: 3000 });
const rootHandler = (request, h) => {
return h.view('index', {
title: request.server.version,
message: 'Hello Ejs!'
});
};
const init = async () => {
await server.register(Vision);
server.views({
engines: { ejs: Ejs },
relativeTo: __dirname,
path: 'templates'
});
server.route({ method: 'GET', path: '/', handler: rootHandler });
await server.start();
console.log('Server running at:', server.info.uri);
};
init();
templates/index.ejs
<%= message %>
We have await server.register(Vision);
to register the @hapi/vision
plugin.
Then we call h.view
to render the view.
title
and message
will be available in the template.
We set the engines.ejs
property to the Ejs
module to use it as our rendering engine.
We can use the Handlebars view engine by writing:
index.js
const Handlebars = require('handlebars');
const Hapi = require('@hapi/hapi');
const Vision = require('@hapi/vision');
const server = Hapi.Server({ port: 3000 });
const rootHandler = (request, h) => {
return h.view('index', {
title: request.server.version,
message: 'Hello!'
});
};
const init = async () => {
await server.register(Vision);
server.views({
engines: { html: Handlebars },
relativeTo: __dirname,
path: 'templates'
});
server.route({ method: 'GET', path: '/', handler: rootHandler });
await server.start();
console.log('Server running at:', server.info.uri);
};
init();
templates/index.html
{{message}}
We change the engines
property to { html: Handlebars }
and require the handlebars
module to use the Handlebars views engine.
To use the Pug view engine with Hapi, we write:
index.js
const Pug = require('pug');
const Hapi = require('@hapi/hapi');
const Vision = require('@hapi/vision');
const server = Hapi.Server({ port: 3000 });
const rootHandler = (request, h) => {
return h.view('index', {
title: request.server.version,
message: 'Hello!'
});
};
const init = async () => {
await server.register(Vision);
server.views({
engines: { pug: Pug },
relativeTo: __dirname,
path: 'templates'
});
server.route({ method: 'GET', path: '/', handler: rootHandler });
await server.start();
console.log('Server running at:', server.info.uri);
};
init();
templates/index.pug
p #{message}
To use the Mustache view engine, we write:
const Mustache = require('mustache');
const Hapi = require('@hapi/hapi');
const Vision = require('@hapi/vision');
const server = Hapi.Server({ port: 3000 });
const rootHandler = (request, h) => {
return h.view('index', {
title: request.server.version,
message: 'Hello!'
});
};
const init = async () => {
await server.register(Vision);
server.views({
engines: {
html: {
compile: (template) => {
Mustache.parse(template);
return (context) => {
return Mustache.render(template, context);
};
}
}
},
relativeTo: __dirname,
path: 'templates'
});
server.route({ method: 'GET', path: '/', handler: rootHandler });
await server.start();
console.log('Server running at:', server.info.uri);
};
init();
templates/index.html
:
{{message}}
We have the engines.html.compile
method to compile the template into rendered HTML.
context
has the data we pass into the 2nd argument of h.view
.
Conclusion
We can render various kinds of templates into HTML with the @hapi/vision
plugin.