noddity-static-server v2.2.1
First: deploy your Noddity content to a static http server somewhere (think now or surge).
Second: deploy any other assets (css, background images, logos) you want to reference to a static server (or the same one, if you like).
This module gives you a function that creates a server that will pull the markdown files from your content server and use them to generate static HTML on demand.
Usage
The function exported by this server creates a new koa-router instance.
Example usage:
const noddityStaticServer = require('noddity-static-server')
const makeLazyRenderer = require('noddity-lazy-static-render')
const Butler = require('noddity-butler')
const level = require('level-mem')
const indexHtml = require('fs').readFileSync('./index.html', { encoding: 'utf8' })
const contentUrl = 'https://content.yoursite.com/'
const butler = Butler(contentUrl, level('server'), {
refreshEvery: 1000 * 60 * 5,
parallelPostRequests: 10
})
const lazyRender = makeLazyRenderer({
butler,
data: {
title: 'Site name here',
pathPrefix: '/',
pagePathPrefix: '',
},
indexHtml
})
const staticServerRouter = noddityStaticServer({
assetsUrl: 'https://assets.yoursite.com/',
nonMarkdownContentUrl: contentUrl,
butler,
lazyRender
})
const router = Router()
const app = new Koa()
router.use('', staticServerRouter.routes(), staticServerRouter.allowedMethods())
router.get('/custom', async function customPage(context, next) {
context.body = 'This is a custom response, separate from the noddity-static-server routes!'
})
app.use(conditionalGet())
app.use(compress())
app.use(router.routes(), router.allowedMethods())
app.listen(8000)API
noddityStaticServer(options)
Returns a koa-router instance.
Takes an options map with these properties:
butler, a noddity-butler instanceassetsUrl, a string url to redirect all requests to/assetstolazyRender, a noddity-lazy-static-render instancenonMarkdownContentUrl, a string url where static files matching/content/.*will be looked for. All/content/*.mdfiles will still be served with the butler.assetExtensionsToServeFromContent, an array of extensions to allow to be served fromnonMarkdownContentUrl. Any extensions not in this list will 404 and will not be served from the folder. Defaults to[ 'jpg', 'jpeg', 'gif', 'png' ]
Notes
This module is not very polished or extensible at the moment, lots of stuff is hardcoded. I'm open to moving functionality out of this module and/or refactoring. If you have any particular needs and want to help, open an issue.
Some things this module currently does:
- for any requests matching
/*.md, fetches that file from the content server, renders it as HTML, and serves it up inside of the templateindexHtml - serves up
index.mdwhen you visit/ - returns 301 redirects to paths starting with the
assetsUrlwhen a request comes to/assets/* - for any requests matching
/*.(jpg|jpeg|gif|png), returns a 301 redirect to the same path atnonMarkdownContentUrl - sets Last-Modified headers on page responses, using the last time when a post change was detected
Node compatibility
This module uses async/await, so if you (like everyone else at time of publishing) aren't using Node 8 yet, you'll need to install these modules:
npm i babel-polyfill babel-register babel-plugin-transform-async-to-generator -Sand plop this at the top of your server file:
require(`babel-polyfill`)
require(`babel-register`)({
plugins: [
`transform-async-to-generator`,
],
ignore: function(path) {
// false => transpile with babel
const nodeModules = /\/node_modules\//.test(path)
if (nodeModules) {
return !/\/noddity-static-server\//.test(path)
}
return false
}
})