npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

view-service

v0.1.0

Published

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

Downloads

6

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)