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

react-nojsx

v0.3.5

Published

A JSON based alternative to JSX.

Downloads

85

Readme

NoJSX

Build Status

A JSON based alternative to JSX. Accepts a simple tree shaped, DOM representing object, and returns a React element. This element could host any number of children and granchildren defined by a children property. The children property is either an HTML (or text) string or an array of children element references.

This mechanism utilizes React.createElement from the React top-level API.

The data object is passed in on construction. The compile method (see example below) returns a single React element. Each element representation in the tree-like object has properties based on the arguments accepted by React.createElement. There are only 3 properties that are important to set in this element object representation: props, type, and children (there is one additional property named escape described below).

By default elements are created using dangerouslySetInnerHTML. This can be overridden by using escape element representation property (see example below).

Installation

$ npm install react-nojsx --save

Example Element Representation

{
  children: 'Hello World.',
  escape: true,
  props: {
    className: 'header header--page'
  },
  type: 'div'
}

Note: escape is optional. Default is false.

Keys

By default NoJSX will generate keys for every element created. This can be overidden by specifying a key as part of the props property, however please ensure the strength of uniqueness is high. NoJSX generates keys based on the index of the element created. This may change in the future. The safest way to override the keys would be to prepend the string value with a prefix.

Example:

{
  children: 'Hello World.',
  escape: true,
  props: {
    className: 'header header--page',
    key: 'foo_123'
  },
  type: 'div'
}

Example Usage

NoJSX could be used in several ways, such as in smaller pieces... or even combined with JSX! Below is an example of potentially the most common use case. More examples coming soon.

import { Component } from 'react';

// using Helmet as an example React element.
import Helmet from 'react-helmet';
import NoJSX from 'react-nojsx';

export default class App extends Component {

  // ...

  render() {
    const {
      title
    } = this.props;

    const templateData = {
      children: [
        {
          props: { title },
          type: Helmet
        },
        {
          children: [
            {
              children: 'Hello Page Header.',
              props: { className: 'header header--page' },
              type: 'h1'
            },
            {
              children: '<strong>Lorem ipsum dolor sit amet</strong>, consectetur adipiscing elit.',
              type: 'p'
            }
          ],
          props: {
            className: 'jumbotron'
          },
          type: 'div'
        },
      ],
      props: { className: 'container container--app' },
      type: 'div'
    };

    const template = new NoJSX(templateData);
    return template.compile();
  }
}

Or you could write it like this (the contents of the render function above):

const {
  title
} = this.props;

const pageHeaderData = {
  children: [
    {
      children: 'Hello Page Header.',
      props: { className: 'header header--page' },
      type: 'h1'
    },
    {
      children: '<strong>Lorem ipsum dolor sit amet</strong>, consectetur adipiscing elit.',
      type: 'p'
    }
  ],
  props: { className: 'jumbotron' },
  type: 'div'
};

const templateData = {
  children: [
    {
      props: { title },
      type: Helmet
    },
    pageHeaderData
  ],
  props: { className: 'container container--app' },
  type: 'div'
};

const template = new NoJSX(templateData);
return template.compile();

Want More?

More documentation and examples coming soon.