express-low-layout
Low-layout is a layout system based on Mustache and Express.
Instalation
$ npm install express-low-layout
Usage
const layout = require('low-layout')
app.use(layout)
Exemple:
install express and express-low-layout
$ npm install --save express
$ npm install --save express-low-layout
index.js
Create a simple express app with two route: /home and /test
var express = require('express')
var layout = require('express-low-layout')
var app = express()
app.set('view', './views')
app.use(layout)
app.get('/home', function (req, res) {
req.layout.loadTemplate('home.html')
req.layout.render().then((html) => {
res.send(html)
})
})
app.get('/test', function (req, res) {
req.layout.loadTemplate('test.html')
req.layout.getBlock('head').data.title = 'Test page'
req.layout.render().then((html) => {
res.send(html)
})
})
app.get('*', function (req, res) {
res.redirect('/home')
})
app.listen(3000, function () {
console.log('Example app listening on port 3000!')
})
/views/page/default.html
The template for the page
For the template syntax read the mustache js documentation
<template>
<!doctype html>
<html lang="en">
{{{blocks.head}}}
<body>
<header>
<nav>
<ul>
<li>
<a href="/home">Home</a>
</li>
<li>
<a href="/test">Test</a>
</li>
</ul>
</nav>
</header>
<main role="main">
{{{blocks.content}}}
</main>
<footer>
<p>footer</p>
</footer>
</body>
</html>
</template>
<script>
var Block = require('low-layout/block')
class Default extends Block {
init () {
this.name = 'page'
this.addBlock({name: 'head', template: 'page/head.html'})
this.addBlock({name: 'content', type: 'container'})
}
beforeRender () {
this.layout.getBlock('head').addCss('https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css')
}
}
module.exports = Default
</script>
/views/page/head.html
template for the head block define in the file views/page/default.html
<template>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="description" content="">
<meta name="author" content="">
<title>{{title}}</title>
{{#css}}
<link rel="stylesheet" href="{{{.}}}">
{{/css}}
{{#js}}
<script src="{{{.}}}"></script>
{{/js}}
</head>
</template>
<script>
var Block = require('low-layout/block')
class Head extends Block {
init () {
this.data.css = []
this.data.js = []
}
addCss (cssFiles) {
if (Array.isArray(cssFiles)) {
for (var key in cssFiles) {
this.data.css.push(cssFiles[key])
}
} else if (typeof cssFiles === 'string') {
this.data.css.push(cssFiles)
} else {
throw Error('Invalid addCss argument')
}
}
addJs (jsFiles) {
if (Array.isArray(jsFiles)) {
for (var key in jsFiles) {
this.data.js.push(jsFiles[key])
}
} else if (typeof jsFiles === 'string') {
this.data.js.push(jsFiles)
} else {
throw Error('Invalid addJs argument')
}
}
}
module.exports = Head
</script>
/views/home.html
The template for the /home route
<template>
<div>
<h1>Home page</h1>
</div>
</template>
<script>
var Block = require('low-layout/block')
class Home extends Block {
init () {
this.page ='page/default.html'
this.parent = 'content'
}
beforeRender() {
this.layout.getBlock('head').data.title = 'Home page'
}
}
module.exports = Home
</script>
/views/test.html
The template for the /test route
<template>
<div class="test">
<h1>Test</h1>
</div>
</template>
<script>
var Block = require('low-layout/block')
class Test extends Block {
init () {
this.page ='page/default.html'
this.parent= 'content'
}
}
module.exports = Test
</script>
Run:
$ node index.js