Simple, lazy way to serve a directory of semi-static pages in express.js. Handy for building quick 'static' pages inside an othewise 'dynamic' app.
Simple, lazy way to serve a directory of semi-static pages in express.js. Handy for building quick "static" pages inside an otherwise "dynamic" app.
Often you have a dynamic web app that also needs a bunch of mostly "static" pages. But you still want to use the same app layouts and template system to build out those pages. Take for instance an FAQ page inside your app that otherwise has a bunch of dynamic content.
It's silly to build a specifc route for that page when all you really want is a route that at 'http://yourapp.com/faq' renders the
faq.jade template in your express.js app.
I find myself adding code like this to nearly every express app I write, so I figured why the heck not publish an npm module and re-use that. So, here we are.
Install with npm:
npm install semi-static
Create a folder called
static inside your express views folder.
Register a handler that tells it to use semi-static to render and serve template names at urls as if they were static:
You can run the example in this repo by changing to the
example directory and running
node server.js and both http://localhost:3000/ and http://localhost:3000/help should render the correct templates.
Here's basic sample code (see the example directory for a more elaborate example):
// super simple demovar express = require'express';var semiStatic = require'semi-static';// init our appapp = express;// use jadeappset'view engine' 'jade';// serve our static filesappuseexpressstatic__dirname + '/public'// register our handlerappget'*' semiStatic;// we can still have a normal 404 at the end// because it will only do something if there's// a path that matches.appall'*'ressend'not found' 404;;applisten3000;console.log'started';
All it needs is the folder where your "static" templates live and the file extension your templates use. If you just need to render Jade (the default extension), you can simply call
If you need more customization, you can set the options as follows:
// This is with the default optionsappget"/hello*" semiStatic// Path to your templatesfolderPath: pathdirnamerequiremainfilename + "/views/static"// Extension for your templates.fileExt: "ejs"// URL root for your templates.root: "/"// Whether to pass the request as `req` to res.render()passReq: false// A custom context to send to the file, either a value or a function that// accepts two arguments: the request and a Node-style callback that takes// an error and return value.context: undefined;
That's it, easy-peasy.
You may also include an option called
context that will be passed to the rendering engine. Context can either be an object that will be passed as variables or a function that takes the
req from express and a callback (whose result will then be passed to the template). If you specify
passReq: true the express request object will also be passed (useful to access req.params, req.query, etc from your template).
See the example code for more details.
If you want to serve an
index file you can do that too.
So if you do this:
And put a file called
views/static it will get served at
yoursite.com as well as
This is so you can basically have little mini static sites inside your app. For example, I like doing stuff like this for serving out a little semi-static help site within an app:
appget'/help/*' semiStaticfolderPath: __dirname + '/help-site'root: '/help';
As long as you've got a folder with an
index.jade file in it your help site will be available at
If you think this is handy, follow @HenrikJoreteg on the twitters. See you on the interwebz!