All Projects → WebReflection → jsx2tag

WebReflection / jsx2tag

Licence: ISC License
Enable JSX for Template Literal Tags based projects.

Programming Languages

javascript
184084 projects - #8 most used programming language

Projects that are alternatives of or similar to jsx2tag

whatsup
Reactive framework, simple, fast, easy to use!
Stars: ✭ 115 (+283.33%)
Mutual labels:  jsx
lsxc
Compile Livescript + Pug + React + SASS as a single component
Stars: ✭ 17 (-43.33%)
Mutual labels:  jsx
core
Light weight feature rich UI Framework for JavaScript for Browser with Dependency Injection, Mocking and Unit Testing
Stars: ✭ 18 (-40%)
Mutual labels:  jsx
photoshop-react-redux-ramda
🎨😱💀⚛️
Stars: ✭ 24 (-20%)
Mutual labels:  jsx
IndieNoMo
A full-stack web-app inspired by crowdfunding platform IndieGoGo.
Stars: ✭ 36 (+20%)
Mutual labels:  jsx
liyad
Liyad (Lisp yet another DSL interpreter) is very small Lisp interpreter written in JavaScript.
Stars: ✭ 27 (-10%)
Mutual labels:  jsx
react-lite
A simple implementation of react
Stars: ✭ 51 (+70%)
Mutual labels:  jsx
sendight-frontend
P2P File sharing
Stars: ✭ 53 (+76.67%)
Mutual labels:  jsx
vite-vue-admin
🎉🎉使用Vite + Vue3 + TypeScript + Element-plus + Mock开发的后台管理系统🎉🎉
Stars: ✭ 97 (+223.33%)
Mutual labels:  jsx
tink hxx
JSX - JS + HX
Stars: ✭ 50 (+66.67%)
Mutual labels:  jsx
benefit
✨ Utility CSS-in-JS library that provides a set of low-level, configurable, ready-to-use styles
Stars: ✭ 51 (+70%)
Mutual labels:  jsx
prax
Experimental rendering library geared towards hybrid SSR+SPA apps. Focus on radical simplicity and performance. Tiny and dependency-free.
Stars: ✭ 18 (-40%)
Mutual labels:  jsx
render.rs
🔏 A safe and simple template engine with the ergonomics of JSX
Stars: ✭ 158 (+426.67%)
Mutual labels:  jsx
cannercms
⚡️[NOT MAINTAINED] Content Management Framework creates custom CMS fast and easy. Support data sources such as Firebase/Firestore, GraphQL and Restful APIs.
Stars: ✭ 2,452 (+8073.33%)
Mutual labels:  jsx
rollup-plugin-tagged-template
Use plain HTML files as tagged templates.
Stars: ✭ 24 (-20%)
Mutual labels:  template-literals
React-Native-Tutorials
Repo for React Native tutorials from the Cheetah Coding YouTube Channel
Stars: ✭ 158 (+426.67%)
Mutual labels:  jsx
eslint-plugin-layout-shift
ESLint plugin to force responsive media elements to set the width/height attributes
Stars: ✭ 15 (-50%)
Mutual labels:  jsx
DWKit
DWKit is a Business Process Management System based on .NET Core and React
Stars: ✭ 121 (+303.33%)
Mutual labels:  jsx
vite-example
Todo app with vite/vue3/vue-router4
Stars: ✭ 22 (-26.67%)
Mutual labels:  jsx
react-with-observable
Use Observables with React declaratively!
Stars: ✭ 108 (+260%)
Mutual labels:  jsx

JSX2TAG

Build Status Coverage Status

Social Media Photo by Andre Taissin on Unsplash

Enable JSX for Template Literal Tags based projects.

Features

  • a createPragma(tag, config?) utility to have a React.createElement like function to use as pragma
  • a bind utility to mimic .prop=${value} in the template
  • automatic onEventName to @eventName conversion
  • automatic ?prop=${value} conversion in the template, when the property is boolean
  • optionally boost performance via @ungap/plugin-transform-static-jsx, able to create best template literals tags' arguments

Example

See test/index.jsx to see all features applied.

/** @jsx h *//** @jsxFrag h */

// your template literal library of choice
const {render, html} = require('uhtml-ssr');

// this module utils
const {bind, createPragma} = require('jsx2tag');

// create your `h` / pragma function
const h = createPragma(html);
// if your env works already with `React.createElement`, use:
// const React = {createElement: createPragma(html)};

// any component (passed as template value)
const Bold = ({children}) => html`<strong>${children}</strong>`;

// any generic value
const test = 123;

// test it!
const myDocument = (
  <p class="what" test={bind(test)} onClick={console.log}>
    <Bold>Hello</Bold>, <input type="password" disabled={false} />
    <span id="greetings">Hello</span>
  </p>
);

render(String, myDocument);
// <p class="what" test="123"><strong>Hello</strong>, <input type="password"><span id="greetings">Hello</span></p>

How To Transpile JSX

Specify pragma and pragmaFrag or use this syntax on top:

/** @jsx h */
/** @jsxFrag h */

Otherwise, follow @Robbb_J post about minimal requirements and you'll be good.

A huge thanks to him for writing such simple, step by step, guide.

How to render keyed components

The config object accepts a keyed(tagName, props) callback that can return a keyed version of the component.

/** @jsx h *//** @jsxFrag h */
import {createPragma} from '//unpkg.com/jsx2tag?module';
import {render, html} from '//unpkg.com/uhtml?module';

// used as weakMap key for global keyed references
const refs = {};
const h = createPragma(html, {
  // invoked when a key={value} is found in the node
  // to render regular elements (or µbe classes)
  keyed(tagName, {key}) {
    const ref = refs[tagName] || (refs[tagName] = {});
    return html.for(ref, key);
  }
});

render(document.body, <div key={'unique-id'} />);

Alternatively, each library might have its own way, but the gist of this feature, whenever available, is that the key property is all we're after:

/** @jsx h *//** @jsxFrag h */

import {createPragma} from '//unpkg.com/jsx2tag?module';
import {render, html} from '//unpkg.com/uhtml?module';

const h = createPragma(html);

const App = ({name, key}) => html.for(App, key)`Hello ${name} 👋`;

render(document.body, <App name="JSX" key={'specific-key'} />);

Conditional keyed components are also possible.

Here another uhtml example:

/** @jsx h *//** @jsxFrag h */

import {createPragma} from '//unpkg.com/jsx2tag?module';
import {render, html} from '//unpkg.com/uhtml?module';

const h = createPragma(html);

const App = ({name, key}) => {
  const tag = key ? html.for(App, key) : html;
  return tag`Hello ${name} 👋`;
};

render(document.body, <App name="JSX" key={'specific-key'} />);

In few words, there's literally nothing stopping template literal tags libraries to be keyed compatible.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].