Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/dannyyassine/vanille
A minimalistic vanilla web component framework
https://github.com/dannyyassine/vanille
component components jsx observable typescript vanilla web-components webcomponent
Last synced: 2 months ago
JSON representation
A minimalistic vanilla web component framework
- Host: GitHub
- URL: https://github.com/dannyyassine/vanille
- Owner: dannyYassine
- License: mit
- Created: 2023-08-23T23:58:13.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2024-11-21T02:53:50.000Z (3 months ago)
- Last Synced: 2024-12-18T23:42:43.123Z (2 months ago)
- Topics: component, components, jsx, observable, typescript, vanilla, web-components, webcomponent
- Language: TypeScript
- Homepage: https://dannyyassine.github.io/vanille/
- Size: 27.6 MB
- Stars: 1
- Watchers: 3
- Forks: 0
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
![]()
A minimalistic web component framework
Using native browser features to maximum performance with a few exceptions
![]()
### Features
- Web components as first class citizens
- Templating with JSX
- Reactive rendering with signals
- Pass `objects` to custom element attributes
- No virtual DOM
![]()
### Installation
```bash
yarn add @vanille/core
```### Prerequisites
#### `vite.config.ts`
Using `vite`, please specify the `esbuild` options:```js
esbuild: {
jsxFactory: 'h',
jsxFragment: 'Fragment',
}
```#### `tsconfig.json`
To use `decorators`, enable `experimentalDecorators`:```json
"experimentalDecorators": true
```### No dependencies
All features are in-house implementations to maximize native functionality, with a few exceptions (check out below!)
### Extending web components for native performance
```ts
import { View } from '@vanille/core';export class App extends View {}
```### Fast templating web components with in-house JSX
```ts
export class App extends View {
render() {
return (
JSX!
);
}
}
```### Signals
```ts
export class App extends View {
render() {
const name = state('your name');
const computedName = computed(() => name.get());return (
{name}
{computedName}
);
}
}
```### Simple routing
```jsx
Home
Dashboard
User with id
```
### Pass objects in web component attributes
```ts
const user = { name: 'vanille' };;
export class App extends View {
render() {
return (
{this.props.user.name}
)
}
}
```### Query the DOM with `refs` to update elements
```ts
export class App extends View {
setBindings() {
this.refs.name.textContent = newValue;
}render() {
return (
JSX!
);
}
}
```### Declarative testing with JSX
```tsx
import { mount } from './test-utils';
// load the component
import './test-utils/Test';test('can render from jsx', () => {
const $shadow = mount() <---- JSX!const $el = $shadow.querySelector('[data-id="test"');
expect($el).toBeTruthy();
});
```