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

express-engine-inferno-jsx

v1.4.1

Published

Inferno JSX engine for ExpressJS

Downloads

35

Readme

Express View Engine with Inferno JSX and support for KrakenJS

Install and Configuration

Install express-engine-inferno-jsx

$ npm i express-engine-inferno-jsx --save

Module express-engine-inferno-jsx does not come with inferno packages to make sure you always can install/upgrade and use latest inferno's version.

$ npm i babel-plugin-inferno inferno inferno-component inferno-create-element inferno-dev-utils inferno-devtools --save

Configuration with Express

var express = require('express');
var app = express();

require('express-engine-inferno-jsx').attachTo(app, {
   cache: __dirname + '/views/cache', // required and should be absolute path to cache dir
   views: __dirname + '/views', // required and should be absolute path to views dir with jsx files
   typescriptSupport: false, // if you need typescript support using require *.ts and *.tsx files set true
   serverRoot: __dirname,
   requireAlias: {
    'shared-modules' : "path:../../shared-components/node_modules",
    "stores" : "path:../stores"
   },
   appRoot: __dirname + '/public/js/inferno/src', // relative path to inferno front end app root folder
   appSrc: 'public/js/inferno/src', // absolute path to inferno front end app root folder
   viewCache: false, // `false` for development `true` for production
   doctype: '<!DOCTYPE html>'
});

That's it, you no need to do app.set('views', 'views') and so on, attachTo will do that for you

Kraken JS integration

You can use express-engine-inferno-jsx with KrakenJs framework (https://github.com/krakenjs/kraken-js)

example of develpment config ./config/development.json

"express": {
        "view cache": false,
        "view engine": "jsx",
        "views": "path:./views"
    },

    "view engines": {
        "jsx": {
            "module": "express-engine-inferno-jsx",
            "renderer": {
                "method": "create",
                "arguments": [
                    {
                      "cache": "path:./.build/views/cache",
                      "views": "path:./views",
                      "requireAlias": {
                        "shared-modules" : "path:../../shared-components/node_modules",
                        "stores" : "path:../stores"
                      },
                      "serverRoot": "path:",
                      "appRoot": "path:./public/js/inferno/src",
                      "appSrc": "public/js/inferno/src",
                      "viewCache": false,
                      "doctype": "<!DOCTYPE html>"

                    }
                ]
            }
        }
    }

example of production config ./config/production.json

"express": {
        "view cache": true,
        "view engine": "js",
        "views": "path:./.build/views"
    },

  "view engines": {
      "js": {
          "module": "express-engine-inferno-jsx",
          "renderer": {
              "method": "create",
              "arguments": [
                  {
                    "cache": "path:./.build/views",
                    "views": "path:./.build/views",
                    "requireAlias": {
                      "shared-modules" : "path:../../shared-components/node_modules",
                      "stores" : "path:../stores"
                    },
                    "serverRoot": "path:",
                    "appRoot": "path:./public/js/inferno/src",
                    "appSrc": "public/js/inferno/src",
                    "viewCache": true,
                    "doctype": "<!DOCTYPE html>"

                  }
              ]
          }
      }
  }

module express-engine-inferno-jsx has build script with method to convert JSX to Js from command line, useful for building with grunt or your own build tools for production.

build script usage example: ./build-jsx-views.js

process.env.NODE_ENV = 'production';
const chalk = require('chalk');
const path = require('path');
const buildJSXView = require('express-engine-inferno-jsx/build');
// source path for JSX views
const devViewPath = path.join(__dirname, '../views');
// destination path for JS views
const productionViewPath = path.join(__dirname, '../.build/views');

buildJSX();

function buildJSX() {
  console.log('Building JSX Views for production...');
  buildJSXView(devViewPath, productionViewPath, (err)=> {
    if (err) {
      printErrors('Build JSX Error', [err]);
      process.exit(1);
    }
    console.log(chalk.green('JSX Views Compiled Successfully.'));
    console.log();
  })
}

function printErrors(summary, errors) {
  console.log(chalk.red(summary));
  console.log();
  errors.forEach(err => {
    console.log(err.message || err);
    console.log();
  });
}

to build views for production run script : node ./build-jsx-views.js

Usage

Example of users.jsx view file

var Layout = require('./layout');

<Layout>
  <ul class="users">
    {props.users.map(user => (
    	<li key={user}>{user.name}</li>
    ))}
  </ul>
</Layout>

Example of layout.jsx view file

<html>
<head>
  <meta charset="UTF-8"/>
</head>
<body>{props.children}</body>
</html>

Example of router

app.get('/users', function (req, res) {
  res.render('users', {
    users: [
      {name: 'Max'},
      {name: 'Sergey'},
      {name: 'Bob'}
    ]
  });
});

Output html

<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"/></head>
<body><ul class="users"><li>Max</li><li>Sergey</li><li>Bob</li></ul></body>
</html>

How it works

When you render some view, this engine takes jsx file like this

var Layout = require('./layout');

<Layout>
  <ul class="users">
    {props.users.map(user => (
    	<li key={user}>{user.name}</li>
    ))}
  </ul>
</Layout>

and compiles it to js file like this

var Inferno = require('inferno');
var requireJSX = require('express-engine-jsx/require');

module.exports = function (props) {
  var __components;
    var Layout = requireJSX('./layout');
    __components =
      Inferno.createElement(
      	Layout, 
      	null,
      	Inferno.createElement(
      	  'ul',
      	  {className: 'users'},
      	  props.users.map(user => (
            Inferno.createElement(
              'li',
              {key: user},
              user.name
            )
          ))
      )
    );
  return __components;
};

and now this component can be rendered to html with Inferno.renderToStaticMarkup().

As you can see, each jsx view file returns array of components and standard html attributes are converted to inferno attributes

<div class="first" tabindex="1"></div>
<div class="second" tabindex="2"></div>

API

engine

var engine = require('express-engine-inferno-jsx');

It's a function which takes three arguments:

  • path - path to jsx file
  • locals - object with properties which will be local variables in jsx file
  • callback - Node style callback which will receive html string as second argument

Also it has method attachTo which takes two arguments:

  • server - Express instance
  • options - object which will be merged to options

options

var options = require('express-engine-inferno-jsx/options');

Object which has three properties:

  • cache - absolute path to cache directory

  • views - absolute path to views directory

  • viewCache - true || false default false

  • requireAlias - alias map for require in views {}

  • appSrc - relative path to inferno client apps source folder 'apps-inferno/src'

  • appRoot: absolute path to inferno client app source folder __dirname + '/apps-inferno/src'

  • serverRoot - absolute path server root folder __dirname

  • babelOptions - object of babel tranform options,

  • doctype - string which will be prepended to output html, default value is "<!DOCTYPE html>\n"

  • template - string wrapper of compiled jsx, default value is

     var Component = require('inferno-component');
     var AppSharedData = require('express-engine-inferno-jsx/appshared');
     var requireJSX = require('express-engine-inferno-jsx/require');
     module.exports = function (props) {
       var __components;
       BODY
       return __components;
     };

    Where BODY will be replaced with your compiled jsx code

This options used by require

require

var requireJSX = require('express-engine-inferno-jsx/require');

This is a function which you can use as regular require but this one can run jsx files. It checks if path is jsx file and if it is then requireJSX will convert this file to js file and put in cache dir and then run it.

convert

var convert = require('express-engine-inferno-jsx/convert');

It is a function which can convert jsx view files to js files. It takes only two arguments:

  • jsxPath - path to jsx file
  • jsPath - path where js file should be saved

License

MIT, see LICENSE file