https://github.com/arif-rachim/yalla
YallaJS, ES6 Templating Engine.
https://github.com/arif-rachim/yalla
javascript-framework lightweight performance virtualdom yalla
Last synced: 2 months ago
JSON representation
YallaJS, ES6 Templating Engine.
- Host: GitHub
- URL: https://github.com/arif-rachim/yalla
- Owner: arif-rachim
- License: mit
- Created: 2017-02-17T14:21:40.000Z (over 8 years ago)
- Default Branch: master
- Last Pushed: 2017-12-29T10:57:46.000Z (over 7 years ago)
- Last Synced: 2025-04-18T01:41:19.391Z (2 months ago)
- Topics: javascript-framework, lightweight, performance, virtualdom, yalla
- Language: JavaScript
- Homepage:
- Size: 1.02 MB
- Stars: 248
- Watchers: 18
- Forks: 19
- Open Issues: 4
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
![]()
----
![]()
![]()
![]()
![]()
![]()
**YallaJS** makes it easy to create HtmlTemplate and render it to DOM efficiently.
```javascript
import {Context,render} from 'yallajs';// we pull html Tagged Template literals from the Context object.
let {html} = new Context();// create template function that produce HtmlTemplate "
Hello xxx"
let hello = (name) => html`Hello ${name}`;// render
Hello worldto document.body.
render(hello('world'),document.body);// render
Hello yallajsto document.body.
render(hello('yallajs'),document.body);
````yallajs` has 3 main API
1. `render` : Render is a function that renders an HtmlTemplate or HtmlTemplateCollection into node.
2. `html` : html is contextual Tagged Template Literal that generates HtmlTemplate object from Html strings
3. `htmlCollection` : htmlCollection is contextual Tagged Template Literals that generates HtmlTemplateCollection for rendering arrays of object.
4. `Context` : Context is an object that stores local information such as HtmlTemplate cache (in most cases you dont have to do anything with this object).**Motivation**
---The original motivation of yallajs is perfectly described in this story :
[How it feels to learn javascript in 2018](https://codeburst.io/how-it-feels-to-learn-javascript-in-2018-6b2cf7abb6aa)>YallaJS hopes one day we will no longer need yallajs after the browser incorporates ES6 Templating library.
>An example of a rewritten infamous angular Hero Editor tutorial using ES6 module and ES6 String Template
*No babel, no transpiler, just your hand written ES6 straight into the browser stomach*
`yallajs` has following main goals :
1. Highly efficient in DOM creation, updates and deletion.
2. Easy to use and very simple to understand
3. Using web standards instead of creating new ones
4. Very small size and no dependency.
5. Support ES 5 browsers suchas IE 9, IOS 6 and Android 5.**How it works**
---**`html` Tagged Template Literals**
---
`html` tag expression processed Template Literal, and generate HtmlTemplate object out of it.
Template literals are string literals allowing embedded expressions. You can use multi-line strings and string interpolation features with them.Template literals are enclosed by the back-tick (\` \`) character instead of double or single quotes. Template literals can contain place holders. These are indicated by the Dollar sign and curly braces (${expression}). The expressions in the place holders and the text between them get passed to a `html` Tagged Template Literals.
**`render` HtmlTemplate rendering**
----
`render()` takes a `HtmlTemplate`, `HtmlTemplateCollection`, `Text` or `Promise`, and renders it to a DOM Container. The process of rendering is describe in following orders :1. `yallajs` take the static strings in `HtmlTemplate` and join the strings with `` to mark the position of dynamic parts.
2. `yallajs` passes joined strings to innerHTML to create `DOMTemplate`.
3. It walks through the `DOMTemplate` and identify the comment tag `outlet`.
4. On initial rendering `yallajs` update the `outlet` with actual values.
5. After that `yallajs` store the updated `DOMTemplate` into `Context` object.
6. Lastly `yallajs` clone the `DOMTemplate` to create `HtmlTemplateInstance` and append it to DOM Container.By keeping the template DOM in the cache, next DOM creation will be done in two steps only :
1. look the template DOM, and update the outlet with next value,
2. clone the template DOM and append it to DOM Container.In this way we can also perform the DOM update process very efficiently because we already know the location of the placeholder. So if there is a new value that changes, we simply update the placeholder without having to touch other DOM
**Performance**
---
The Benchmark result of yallajs 2.0 beta version is very promising. With very early stage of performance tuning, yallajs wins against angular, react and vue, both on rendering and memory allocation.
Following benchmark result using Stefan Krause performance benchmark.
**Memory**
---
On the other hand, yallajs memory usage is showing very promising result.
You can find the details here, and the code that we use in this benchmark here.
**Features**
---Yalla uses ES 2015 String literal for html templating, yallajs API is very simple, making yalla js almost invisible in your code. This makes your application smells good and no boilerplate.
Overview
--------**hello world**
---
To render hello world we can write as follows :```javascript
render(`Hello World`,document.body);
```The above code means we want to render 'Hello World' string into the body tag.
**`render`**
---
`render` is a function that accepts 2 parameters, the first parameter is
the object to be rendered and the second parameter is the container where the object will be rendered.The first parameter of `render` can be` string`, `boolean`,` date`, `number`,` Promise`, `HtmlTemplate` and` HtmlTemplateCollection`.
The second parameter is the DOM node, we can use `document.body` or` document.getElementById` for the second parameterTo render html we can pass it to the first parameter `HtmlTemplate` object by using tag `html` like the following example :
```javascript
render(html`Hello World`,document.body);
```The above code means that we want to render the Hello World button to the document.body element.
**`html`**
---
`html` tag behind the screen is an ES6 Template Tag.
`html` generate HtmlTemplate object, which contains information about static strings, and dynamic values.
`html` tag can be retrieved from ` yalla.Context` object.> `yalla.Context` is the object that stores the cache of `html` and` htmlCollection` Tags.
For hybrid application cases where we can have multiple sub-applications (not single page app),
we can separate contexts from sub-applications by providing aliases of `html` and` htmlCollection` of each `Context`**Examples:**
Rendering `div` :
```javascript
render(html`This is Div`,document.body);
```Rendering `html in html` :
```javascript
render(html`This is Div ${html`,document.body);This is Sub-Div`}
```Rendering with expression :
```javascript
let displayMe = false;
render(html`This is Div ${displayMe ? html`,document.body);This is Sub-Div` : ''}
```We can also listen to the DOM event by setting the value of `oneventname` with expression ` e => {} `
**Events**
---Event in HtmlTemplate can be called by using callback expression `e => {}`.
Here is an example to listen to the `onclick` event of a` button`.```javascript
function buttonListener(){
alert('hello');
}render(html`Hello World`,document.body);
```We can also mempassing parameters into our callback.
```javascript
let alertSomething = (something) => {
alert(something);
}render(html`Hello World`,document.body);
```In addition to Event, HtmlTemplate can also set values of attributes & styles using Template Literal.
**Attribute & Style**
---Attribute in HtmlTemplate can be set its value by using $ {}.
Following is an example on how to set the value of the color and color attribute.```javascript
let dynamicColor = '#CCCCCC';
let fontSize = '32px';render(html`
This is a Node`,document.body);
```Attributes can only render primitive object types such as `text`,` number` and `boolean`.
If you need a style attribute that has a combination of values, it is recommended to use the `style` tag.
Following an example on how to use yalla in `style`
```javascript
let fontColor = '#666666';
let backgroundColor = '#CCCCCC';
render(`.my-class {
color : ${fontColor};
background-color : ${backgroundColor};
}Hello Class
`);
```**`htmlCollection`**
---
To render an Array, we can use `Html Template Collection`. HtmlTemplateCollection is high performance Object that map array of items to HtmlTemplate Array.
HtmlTemplateCollection requires key of the item to update the collection effectively.htmlCollection has 3 parameters:
```javascript
htmlCollection(arrayItems,keyFunction,templateFunction);
```*Example*
```javascript
let marshalArtArtist = [
{id:1,name:'Yip Man'},
{id:2,name:'Bruce Lee'},
{id:3,label:'Jackie Chan'}]render(html`
${htmlCollection(marshalArtArtist,(data) => data.id, (data,index) => html`
${data.name}
`)}
`,document.body);
```**Advance**
---
Following is an advanced topic that can be used to extend yallajs.1. Promise :
We can call asynchronous process by using Promise. Promise by default is not supported by IE9, therefore
to use this feature you should use a 3rd party libray like bluebird.jsExample of how to use Promise :
```javascript
render(html``,document.body);
${new Promise(resolve => {
setTimeout(()=>{
resolve(html`This will be visible after 1s.`);
},1000);
})}
```2. Manual content decorator with `Plug`
Plug is a special function that will receive a callback function that contains the `outlet` object as its parameter.
With the object `outlet`, we can customize what content to be rendered to dom.Here is an example of using `plug`.
```javascript
render(html``,document.body);
${plug(outlet => {
// here we can put some logic to intercept and set our own content.
outlet.setContent(html`This is my custom content`)
})}
```Sample Project
--------------
1. TodoMVC : a simple todomvc application
2. Hero Editor : Hero Editor tutorial from Angular JS rewritten in Yallajs
3. Benchmark : benchmark tools for measuring performance, fork of Stefan Krause github project
4. React Fiber Demo : React Fiber Triangle rewritten with YallaJS
5. SAM Pattern Todo : Example of how to use YallaJS with SAM PatternBasic Example
-------------
1. Hello world : Basic hello world application
2. Simple Calculator : Simple calculator with yallajs
3. SVG - Sample : Showcase on using SVG with yallajsEvent Example
------------
1. Color Picker : Simple color pickerHtml Collection Example
------------
1. Array with Html Collection : Using HtmlCollection to render arrays
2. Html Collection with Promise : HtmlCollection with PromiseAsync Example
--------------------------
1. Node with Promise : Example using Promise on Node
2. Attribute with Promise : Example using Promise on AttributePlug Example
------------
1. Node With Plug : Example using Plug on Node
2. Attribute With Plug : Example using Plug on AttributeAminate.CSS
-----------
1. Animation.css : Example with Animation.CSSYallaJS Project is supported by :
![]()