jsx2string

Transpile JSX to plain javascript strings, without React or other runtime libraries.

NPM package github
npm package github

Features

How To Install

  1. The required packages are @babel/plugin-syntax-jsx, @babel/plugin-transform-react-jsx and of course jsx2string。
  2. Need @babel/core, webpack or any other way to transpile the code that you prefer.
$ npm install jsx2string @babel/plugin-syntax-jsx @babel/plugin-transform-react-jsx

Getting started

Make sure you have the “runtime” and “importSource” fn defined like below.

// .babelrc
{
  "presets": [
    "@babel/preset-env"
  ],
  "plugins": [
    "@babel/plugin-syntax-jsx",
    [
      "@babel/plugin-transform-react-jsx",
      {
        "runtime": "automatic",
        "importSource": "jsx2string"
      }
    ]
  ]
}

Now you can create components e.g.

import jsx2string, {Fragment} from "jsx2string";

const Avatar = ({children, title = "avatar", ...rest}) => {
  return <span title={title} {...rest}>{children}</span>;
};

const dangerText=`<i>hello</i>`;

const Home = function () {
  const user = {
    "firstName": "hello",
    "lastName": `world<br/>`
  };
  return jsx2string(
    <div>
      <Fragment dangerouslySetInnerHTML=/>
      <hr/>
      <>{null}</>
      <div/>
      <div dangerouslySetInnerHTML=/>
      <div className="123">{dangerText}</div>
      <div>{() => 'hello'}</div>
      <div>{['1', '2', '3']}</div>
      <input type="checkbox" checked/>
      <input type="checkbox" checked={false}/>
      <img src="avatar.png" className="profile"/>
      <h3>{[user.firstName, user.lastName].join(" ")} {dangerText} <span>hello</span></h3>
      <Avatar title="1232">1232</Avatar>
      {[1, 2, 3].map((item) => <Avatar>{item}</Avatar>)}
    </div>
  )
};

export default Home;

It just looks like React,but it’s totally plain javascript.

dangerouslySetInnerHTML

const dangerText=`<i>hello</i>`;

function render() {
  return <div dangerouslySetInnerHTML=>this children will be ignore</div>
}