An elegant DSL for React - DEPRECATED: CoffeeScript 2 has JSX built in! (requires a separate JSX→JS conversion)
Clone or download
Latest commit b789cd6 Jun 13, 2018
Type Name Latest commit message Commit time
Failed to load latest commit information.
spec Update README and strengthen a test Dec 15, 2015
.gitattributes 👾 Added .gitattributes Mar 15, 2015
.gitignore 🐣 Initial commit Mar 15, 2015
.npmignore 🏭 Refactor Apr 24, 2015 Update README Jul 19, 2016
package.json Update my website URL Jun 13, 2018 🐛 Fix elements being lost due to lazy evaluation Dec 4, 2015


An elegant, flexible DSL for React for use with CoffeeScript (and maybe other languages)

With CoffeeScript:

# Alias it as whatever you want (maybe _ or $?)
E = ReactScript or require "react-script"

class Message extends React.Component
	render: ->
		E ".message", class: (if is you then "from-you"),
			E ".info",
				style: float: "right"
				"From "
				E "",
				" at "
				E "span.time", @props.time
			E "p.body",
				if @props.fileTransfers
					E ".transfers",
						"Sent files:"
						E "ul.files",
							for transfer in @props.fileTransfers
								E "li", E "a",
									href: transfer.downloadLink
									download: transfer.fileName

message = E Message,
	author: "John"
	time: "5:47 PM"
	text: "Hello world!"
	fileTransfers: [
		{fileName:  "virus.exe", downloadLink: "#"}

ReactDOM.render message, document.body

By simply supporting arrays and ignoring nully values, it works with all forms of conditionals and comprehensions.

All the functionality of classnames is built in. Just provide any class, classes, className, classNames or classList. All those properties are treated the same and can be a single class name, a single string with multiple class names, an object where the keys are the class names and the values are whether they should be present, or an array of any of the preceding. Nully values are ignored, allowing for conditionals.

The whole library tries to be pretty flexible.

You can specify data-* and aria-* properties either as e.g. "data-size"/"aria-pressed" or dataSize/ariaPressed or data_size/aria_pressed or data: size: 1.337/aria: pressed: true. (ARIA's role attribute is just role.)

Check out the specs for more details.

If you find something that doesn't work as you'd hope, feel free to open an issue.


npm i react-script --save


You can use ReactScript through a bundler like browserify or webpack, or you can include it as a script:

<script src="node_modules/react-script/lib/react-script.js"></script>`

Then alias ReactScript as something short such as E to use as a DSL.

var E = ReactScript; // or require("react-script");

Run tests

npm test

Similar Projects