dom-renderer
Version:
A light-weight DOM Renderer supports Web components standard & TypeScript language
187 lines (141 loc) • 5.06 kB
Markdown
1] standard & [TypeScript][2] language.
[][3]
[][4]
[][5]
[][6]
- input: [Virtual DOM][7] object in [JSX][8] syntax
- output: [DOM][9] object or [XML][10] string of [HTML][11], [SVG][12] & [MathML][13] languages
- run as: **Sync**, [Async][14], [Generator][15] functions & [Readable streams][16]
```js
import { DOMRenderer, VNode } from 'dom-renderer';
const newVNode = new DOMRenderer().patch(
new VNode({
tagName: 'body',
node: document.body
}),
new VNode({
tagName: 'body',
children: [
new VNode({
tagName: 'a',
props: { href: 'https://idea2.app/' },
style: { color: 'red' },
children: [new VNode({ text: 'idea2app' })]
})
]
})
);
console.log(newVNode);
```
```diff
import { DOMRenderer, VNode } from 'dom-renderer';
-const newVNode = new DOMRenderer().patch(
+const newVNode = new DOMRenderer().patchAsync(
new VNode({
tagName: 'body',
node: document.body
}),
new VNode({
tagName: 'body',
children: [
new VNode({
tagName: 'a',
props: { href: 'https://idea2.app/' },
style: { color: 'red' },
children: [new VNode({ text: 'idea2app' })]
})
]
})
);
-console.log(newVNode);
+newVNode.then(console.log);
```
[][17]
```json
{
"compilerOptions": {
"jsx": "react-jsx",
"jsxImportSource": "dom-renderer"
}
}
```
```tsx
import { DOMRenderer } from 'dom-renderer';
const newVNode = new DOMRenderer().render(
<a href="https://idea2.app/" style={{ color: 'red' }}>
idea2app
</a>
);
console.log(newVNode);
```
```diff
import { DOMRenderer } from 'dom-renderer';
const newVNode = new DOMRenderer().render(
<a href="https://idea2.app/" style={{ color: 'red' }}>
idea2app
- </a>
+ </a>,
+ document.body,
+ 'async'
);
-console.log(newVNode);
+newVNode.then(console.log);
```
```tsx
import { DOMRenderer } from 'dom-renderer';
const renderer = new DOMRenderer();
const Hello = () => <h1>Hello, JSX SSR!</h1>;
export const generateStream = () => renderer.renderToReadableStream(<Hello />);
```
```js
import { Readable } from 'stream';
import { createServer } from 'http';
import 'dom-renderer/polyfill';
import { generateStream } from './view';
createServer((request, response) => {
const stream = generateStream();
Readable.fromWeb(stream).pipe(response);
}).listen(8080);
```
[][18]
[][19]
[][20]
[ ]: https://www.webcomponents.org/
[ ]: https://www.typescriptlang.org/
[ ]: https://libraries.io/npm/dom-renderer
[ ]: https://github.com/EasyWebApp/DOM-Renderer/actions/workflows/main.yml
[ ]: https://nodei.co/npm/dom-renderer/
[ ]: https://gitpod.io/?autostart=true#https://github.com/EasyWebApp/DOM-Renderer
[ ]: https://en.wikipedia.org/wiki/Virtual_DOM
[ ]: https://facebook.github.io/jsx/
[ ]: https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model
[ ]: https://developer.mozilla.org/en-US/docs/Web/XML
[ ]: https://developer.mozilla.org/en-US/docs/Web/HTML
[ ]: https://developer.mozilla.org/en-US/docs/Web/SVG
[ ]: https://developer.mozilla.org/en-US/docs/Web/MathML
[ ]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function
[ ]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function*
[ ]: https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream
[ ]: https://codesandbox.io/s/dom-renderer-example-pmcsvs?autoresize=1&expanddevtools=1&fontsize=14&hidenavigation=1&module=%2Fsrc%2Findex.tsx&theme=dark
[ ]: https://codesandbox.io/s/mobx-web-components-pvn9rf?autoresize=1&fontsize=14&hidenavigation=1&module=%2Fsrc%2FWebComponent.ts&moduleview=1&theme=dark
[ ]: https://github.com/snabbdom/snabbdom
[ ]: https://codesandbox.io/s/dom-renderer-pglxkx?autoresize=1&expanddevtools=1&fontsize=14&hidenavigation=1&module=%2Fsrc%2Findex.ts&theme=dark
A light-weight DOM Renderer supports [Web components][