Tag | Description |
---|---|
<% | 'Scriptlet' tag, for control-flow, no output |
<%_ | 'Whitespace Slurping' Scriptlet tag, strips all whitespace before it |
<%= | Outputs the value into the template (HTML escaped) |
<%- | Outputs the unescaped value into the template |
<%# | Comment tag, no execution, no output |
<%% | Outputs a literal '<%' |
%> | Plain ending tag |
-%> | Trim-mode ('newline slurp') tag, trims following newline |
_%> | 'Whitespace Slurping' ending tag, removes all whitespace after it |
EJS Cheat Sheet
EJS(Embedded JavaScript) is a simple templating language that lets you generate HTML markup with plain JavaScr
Tags
Tags list
Options
Options list
Option | Description |
---|---|
cache | Compiled functions are cached, requires filename |
filename | Used by cache to key caches, and for includes |
root | Set project root for includes with an absolute path (e.g., /file.ejs). Can be an array to try to resolve include from multiple directories. |
views | An array of paths to use when resolving includes with relative paths. |
context | Function execution context |
compileDebug | When false, no debug instrumentation is compiled |
client | Returns standalone compiled function |
delimiter | Character to use for inner delimiter, by default '%' |
openDelimiter | Character to use for opening delimiter, by default '<' |
closeDelimiter | Character to use for closing delimiter, by default '>' |
debug | Outputs generated function body |
strict | When set to true , generated function is in strict mode |
_with | Whether or not to use with() {} constructs. If false, then the locals will be stored in the locals object. (Implies --strict ) |
localsName | Name to use for the object storing local variables when not using with Defaults to locals |
rmWhitespace | Remove all safe-to-remove whitespace, including leading and trailing whitespace. It also enables a safer version of -%> line slurping for all scriptlet tags (it does not strip new lines of tags in the middle of a line). |
escape | The escaping function used with <%= construct. It is used in rendering and is .toString()ed in the generation of client functions. (By default escapes XML). |
outputFunctionName | Set to a string (e.g., 'echo' or 'print') for a function to print output inside scriptlet tags. |
async | When true, EJS will use an async function for rendering. (Depends on async/await support in the JS runtime. |
Client-side support
Caveats
let str = "Hello <%= include('file', {person: 'John'}); %>",
fn = ejs.compile(str, {client: true});
fn(data, null, function(path, d){ // include callback
// path -> 'file'
// d -> {person: 'John'}
// Put your code here
// Return the contents of file as a string
}); // returns rendered string
Example
<div id="output"></div>
<script src="ejs.min.js"></script>
<script>
let people = ['geddy', 'neil', 'alex'],
html = ejs.render('<%= people.join(", "); %>', {people: people});
// With jQuery:
$('#output').html(html);
// Vanilla JS:
document.getElementById('output').innerHTML = html;
</script>
Docs
Layouts
<%- include('header'); -%>
<h1>
Title
</h1>
<p>
My page
</p>
<%- include('footer'); -%>
Custom file loader
let ejs = require('ejs');
let myFileLoader = function (filePath) {
return 'myFileLoader: ' + fs.readFileSync(filePath);
};
ejs.fileLoader = myFileLoader;
Caching
let ejs = require('ejs'),
LRU = require('lru-cache');
// LRU cache with 100-item limit
ejs.cache = LRU(100);
Custom delimiters
let ejs = require('ejs'),
users = ['geddy', 'neil', 'alex'];
// Just one template
ejs.render('<?= users.join(" | "); ?>',
{users: users},
{delimiter: '?'});
// => 'geddy | neil | alex'
// Or globally
ejs.delimiter = '$';
ejs.render('<$= users.join(" | "); $>',
{users: users});
// => 'geddy | neil | alex'
Using loops
<% if (userLoggedIn) { %>
<p>Welcome, <%= username %>!</p>
<% } else { %>
<p>Please log in.</p>
<% } %>
Conditionals
<% if (userLoggedIn) { %>
<p>Welcome, <%= username %>!</p>
<% } else { %>
<p>Please log in.</p>
<% } %>
Get Started
Including Files
<%- include('partials/navbar.ejs') %>
Include a template with data:
<% include('header', { title: 'My Page' }) %>
<ul>
<% users.forEach(function(user){ %>
<%- include('item', {user: user}); %>
<% }); %>
</ul>
To include a template, needs a file name option, paths are relative
Method
let ejs = require('ejs');
let template = ejs.compile(str, options);
template(data);
// => Rendered HTML string
ejs.render(str, data, options);
// => Rendered HTML string
ejs.renderFile(filename, data, options, function(err, str){
// str => Rendered HTML string
});
Comments
<%# This line will denote a comment %>
<%# This is a multi-line EJS comment.
It can span multiple lines,
but will not be displayed
in the final HTML output.
%>
CLI
Render and specify an output file.
$ ejs hello.ejs -o hello.html
Feed it a template file and a data file
$ ejs hello.ejs -f data.json -o hello.html
Variables
<%= var %> |
Prints the value of the variable |
<%- var %> |
Prints without HTML escaping |
Browser Support
<script src="ejs.js"></script>
<script>
let people = ['geddy', 'neil', 'alex'];
let html = ejs.render('<%= people.join(", "); %>', {people: people});
</script>
Use ejs in a script tag.
Render with Data
let ejs = require('ejs');
let people = ['geddy', 'neil', 'alex'];
let tpl = '<%= people.join(", "); %>';
let html = ejs.render(tpl, {people: people});
console.log(html);
Pass EJS a template string and some data.