view-service

A lightweight lib for building an HTTP-based view rendering service that receives JSON and returns a string.

Usage no npm install needed!

<script type="module">
  import viewService from 'https://cdn.skypack.dev/view-service';
</script>

README

view-service

Tools for creating a view rendering service in Node.js.

Install

npm install view-service --save

Why would I want to use this?

  • You like Node's tooling for the view layer, but you don't want Node to be the center of your application.
  • You want to create a boundary to stop clowns from accessing databases and such inside of your view layer.
  • You have an unhealthy obsession with microservices. (This is dumb. Go with the other ones.)

What's the protocol?

It's very small, HTTP-based, and accepts a JSON object as the view vars. Why? Because everyone knows how to speak those things with ease. If you have performance concerns, keep in mind that HTTP over Unix sockets is a thing, and it's fast. You can always pair it with the other slice of your server app on the same machine. But the beauty of HTTP is that, when you need to, you can use IP like a normal person and then horizontally scale your view and data layers independently. That should be enough buzzwords to make your CIO or whatever happy. Okay, here are the details.

GET /my/view (Does the view exist?)

This will call hasView('my/view', callback). It will respond with 200 (and no body) if the view exists. It will respond with 404 if the view does not exist. It will respond with 500 (and the error as the body) if this throws an error.

POST /

POST the JSON {"name": "my/view", "data": {"my": "var"}} to /. The service will call renderView('my/view', {my: 'var'}, callback). It will respond with 200 and the rendered string as the body, or it will return 500 and an error if it throws an error.

Clients

  • view-service-client (Node.js)

(Please add to this list as more are created.)

Quick & Simple Example

var createViewService = require('view-service');

var port = process.env.PORT || 3000;

var views = {
  'home/index': function(data) {
    return JSON.stringify(data);
  }
};

createViewService({
  hasView: function(name, callback) {
    callback(null, views[name] != null);
  },
  renderView: function(name, data) {
    return callback(null, views[name](data));
  }
}).listen(port);

React + ES6 Example

import React, {Component} from 'react'
import ReactDOM from 'react-dom/server'
import createViewService from 'view-service'

class HomeIndex extends Component {
  render() {
    const {title} = this.props
    return (
      <div>
        <h1>{{title}}</h1>
        <pre>{JSON.stringify(this.props)}</pre>
      </div>
    )
  }
}

const views = {
  'home/index': HomeIndex,
}

function hasView(name, callback) {
  return callback(null, views[name] != null);
}

function renderView(name, data, callback) {
  return callback(null, ReactDOM.renderToString(React.createElement(views[name], data)));
}

createViewService({hasView, renderView}).listen(port)