Vasille
core library is frontend solution for safe
, performant
& powerful
applications.
- Installation
- How to use Vasille
- How SAFE is Vasille
- How SIMPLE is Vasille
- How POWERFUL is Vasille
- Best Practices
npm install vasille --save
npm install vasille-less --save
npm install vasille-magic --save
There are several modes to use Vasille.
Vasille Magic
- perfect for you -highest-level
Vasille Less Library
- no transcriber usage -high-level
Vasille Core Library
- the hard way -low-level
Vasille Magic API
- compiler writes for you -highest-level
Vasille Less Library API
- write less do more -high-level
Vasille Core Library API
- write anything -low-level
The safe of your application is ensured by
-
100%
coverage ofvasille
code by unit tests. Each function, each branch is working as designed. -
strong typing
makes your javascript/typescript code safe as C++ code. All entities ofvasille
core library are strongly typed, including:- data fields & properties.
- computed properties (function parameters & result).
- methods.
- events (defined handlers & event emit).
- DOM events & DOM operation (attributing, styling, etc.).
- slots of component.
- references to children.
- What you write is what you get. There are no hidden operations, you can control everything.
- No asynchronous code, when the line of code is executed, the DOM and reactive things are already synced.
Can you detect the correct order of console logs in the next code snippet:
import logo from './logo.svg';
import './App.css';
import {useEffect} from 'react';
function C1 ({children}) {
console.log(1);
useEffect(() => {
console.log(2);
});
return <div>{children}</div>;
}
function C2 () {
console.log(3);
useEffect(() => {
console.log(4);
});
return <div></div>;
}
function App() {
return <C1>
<C2/>
</C1>;
}
export default App;
So let's see the same example using Vasille:
interface Options extends FragmentOptions {
slot?: () => void;
}
const C1 : VFragment<Options> = ({slot}) => {
console.log(1);
<div>
<vxSlot model={slot} />
</div>;
console.log(2);
}
const C2: VFragment = () => {
console.log(3);
<div></div>;
console.log(4);
}
const App: VApp = () => {
<C1>
<C2/>
</C1>
}
The C2
function is sent to C1
as function,
so it will be called after console.log(1)
and before console.log(2)
.
No return is present in this case,
then construction like for
& if
can be used in place of [].map()
and ternary operator.
The component function is called once, no recalls on component update.
The secret of Vasille
is a good task decomposition. The core library is composed of
an effective reactive module and a DOM generation engine based on it.
Reactivity module is used to create a model of data. It can contain self-updating values, forward-only shared data. Reactivity of objects/fields can be disabled/enabled manually.
-
Destroyable
is an entity which has a custom destructor. -
IValue<T>
is a common interface for any value container, with next members:-
get $
gets the encapsulated value. -
set $
manually update the encapsulated value, if enabled triggers updating of all linked data. -
disable
disables the reactivity. -
enable
enables the reactivity and triggers updating of all linked data.
-
-
Reference<T>
contains a value of typeT
. -
Mirror<T>
syncs self value with anotherIValue
container, can be used to share a value forward-only. -
Pointer<T>
same asMirror
, but it can switch betweenIValue
target anytime. -
Expression<ReturnType, Args...>
is a self-updating value. -
Reactive
is a reactive object which can have multiple reactive fields, emit/receive events/signals.
DOM Generation Engine is used to describe a virtual DOM of reactive fragments, which will be reflected into a browser DOM and keep up to date it.
-
Fragment
describes a virtual DOM node, which has siblings, children, parent & slots. -
TextNode
reflects aText
node. -
INode
reflects aElement
node. -
Tag
reflect a self createdElement
node. -
Extension
reflects an existingElement
node. -
Component
reflects aElement
node created by aTag
child. -
AppNode
is root of aVasille
application, can be used to create applications in application. -
App
is root of a definitiveVasille
application. -
DebugNode
reflects aComment
node, useful for debug. -
Watch
recompose children nodes on model value change. -
RepeatNode
creates multiples children nodes using the same code multiple time. -
BaseView
represent a view in context of MVC (Model-View-Controller). -
ObjectView
repeats slot content for each value ofObjectModel
. -
MapView
repeats slot content for eachMapModel
value. -
SetView
repeats slot content for eachSetModel
value. -
ArrayView
repeats slot content for eachArrayModel
value respecting its order.
<script src="https://unpkg.com/vasille"></script>
- Reactive Object Practice
- Application
- Application in Application (Micro frontends)
- Signaling
- Forward Only Data Exchange
- Absolute, Relative & Auto Values
- Signaling Intercepting
- Debugging
- Fragment vs Component
- Extensions
- Model-View-Controller
If you have questions, feel free to contact the maintainer of the project: