# hyperHTML
**Repository Path**: mirrors_FGRibreau/hyperHTML
## Basic Information
- **Project Name**: hyperHTML
- **Description**: A Fast & Light Virtual DOM Alternative
- **Primary Language**: Unknown
- **License**: ISC
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2020-09-24
- **Last Updated**: 2026-07-18
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# hyperHTML
[](https://opensource.org/licenses/ISC) [](https://travis-ci.org/WebReflection/hyperHTML) [](https://coveralls.io/github/WebReflection/hyperHTML?branch=master) [](https://github.com/WebReflection/donate)
A Fast & Light Virtual DOM Alternative - [release post](https://medium.com/@WebReflection/hyperhtml-a-virtual-dom-alternative-279db455ee0e#.lc65pz9vd),
now [available for both client, server](https://github.com/WebReflection/viperHTML)
and also [simplified for Custom Elements](https://github.com/WebReflection/hyperHTML-Element).
- - -
**New Experimental .adopt(node) API**
Since version _0.12_ you can `hyperHTML.adopt(node)` instead of `hyperHTML.bind(node)` in case you have already rendered
a node on the server via [viperHTML](https://github.com/WebReflection/viperHTML) and you are sharing the same template.
Adopting a node will not trash the node content, it will map it to the existent one.
- - -
Don't miss the [viperHTML](https://github.com/WebReflection/viperHTML) version of **Hacker News**
Live: https://viperhtml-164315.appspot.com/
Repo: https://github.com/WebReflection/viper-news
- - -
## How To Define _hyperHTML_ Templates
There are two basic but fundamental rules to remember:
1. **attributes**, as well as eventual **callbacks**, must be defined inside single or double quoted attributes
2. if there's any char different from `>` and `<` surrounding the interpolation, that content will be text, instead of HTML
Please read the [Getting Started](https://github.com/WebReflection/hyperHTML/blob/master/GETTING_STARTED.md#how-to-define-hyperhtml-templates) for more examples.
## Basic Example
The easiest way to describe `hyperHTML` is through [an example](https://webreflection.github.io/hyperHTML/test/tick.html).
```js
// this is React's first tick example
// https://facebook.github.io/react/docs/state-and-lifecycle.html
function tick() {
const element = (
Hello, world!
It is {new Date().toLocaleTimeString()}.
);
ReactDOM.render(
element,
document.getElementById('root')
);
}
setInterval(tick, 1000);
// this is hyperHTML
function tick(render) {
render`
Hello, world!
It is ${new Date().toLocaleTimeString()}.
`;
}
setInterval(tick, 1000,
hyperHTML.bind(document.getElementById('root'))
);
```
## Compatibility
* every modern browser (Chrome, Edge, Firefox, Safari)
* IE9 to IE11 on both Mobile and Desktop
* every other Mobile or Desktop browser compatible with Babel transpilation
## Features
* Zero dependencies and it fits in **less than 3KB** (minzipped)
* Uses directly native DOM instead of inventing new syntax/APIs, DOM diffing, or virtual DOM
* Designed for [template literals](http://www.ecma-international.org/ecma-262/6.0/#sec-template-literals), a templating feature built in to JS
* Compatible with vanilla DOM elements and vanilla JS data structures `*`
* Also compatible with Babel transpiled output, hence suitable for every browser you can think of
`*` actually, this is just a 100% vanilla JS utility, that's why is most likely the fastest and also the smallest. I also feel like I'm writing Assembly these days ... anyway ...
## Usage
You have a `hyperHTML` function that is suitable for parsing template literals but it needs a DOM node context to operate.
If you want to render many times the same template for a specific node, bind it once and boost up performance for free.
No new nodes, or innerHTML, will be ever used in such case: safe listeners, faster DOM.
You can also check the [TodoMVC repository](https://github.com/WebReflection/hypermvc/tree/master/js) or its [live demo](https://webreflection.github.io/hypermvc/index.html).
### Wait ... there is a wire ➰ in the code!
The helper `hyperHTML.wire([obj[, type]])` is the solution to a common use case:
using `hyperHTML` to _define not the content_ of a node, _but the node_ itself, or a list of nodes.
In this case binding a `DocumentFragment` would work but it will also lose its content as soon as it's appended.
Using `hyperHTML.wire(obj)` will grant that render will always work as expected, without ever losing knowledge of its initial content.
It wires render updates to whatever content is holding.
```js
// hyperHTML.wire() returns a new wire
const render = hyperHTML.wire();
// which can be used multiple times
const update = () => render`
Hello Wired!
`;
update() === update(); // true
update(); //
Hello Wired!
// it is possible to reference a wire
const point = {x: 1, y: 2};
// simply passing a generic object
hyperHTML.wire(point)`
O
`;
// the used render will be always the same
hyperHTML.wire(point) === hyperHTML.wire(point);
// true
```
It is also possible to define a generic template, and in such case the update won't be the single node, but an Array of nodes.
#### New in 0.11
An object can have multiple wires associated with it using different `:ids` as type.
```js
// item used to render an option
hyperHTML.wire(obj, ':option')`
`;
// same item used to render an li
hyperHTML.wire(obj, ':li')`