测试环境搭建
npm i -S snabbdom
安装好的node_modules提供了js和ts的代码:build:js代码,src:ts代码
npm i -D webpack@5 webpack-cli@3 webpack-dev-server@3
webpack:构建工具,必须安装5版本的,因为5版本才支持exports导出的能力webpack-dev-server:提供8080端口访问
package.json中配置运行文件的入口
javascript
"scripts": {
"dev": "webpack-dev-server"
},
www/index.html
javascript
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<!-- src/index.js中需要一个container容器 -->
<div id="container">你好</div>
<script src="/xuni/bundle.js"></script>
</body>
</html>
src/index.js
javascript
// 官方demo,参照https://github.com/snabbdom/snabbdom配置
import { init, classModule, propsModule, styleModule, eventListenersModule, h } from 'snabbdom'
const patch = init([
// Init patch function with chosen modules
classModule, // makes it easy to toggle classes
propsModule, // for setting properties on DOM elements
styleModule, // handles styling on elements with support for animations
eventListenersModule // attaches event listeners
])
const container = document.getElementById('container')
const vnode = h('div#container.two.classes', { on: { click: () => console.log('div clicked') } }, [
h('span', { style: { fontWeight: 'bold' } }, 'This is bold'),
' and this is just normal text',
h('a', { props: { href: '/foo' } }, "I'll take you places!")
])
// Patch into empty DOM element -- this modifies the DOM as a side effect
patch(container, vnode)
const newVnode = h('div#container.two.classes', { on: { click: () => console.log('updated div clicked') } }, [
h('span', { style: { fontWeight: 'normal', fontStyle: 'italic' } }, 'This is now italic type'),
' and this is still just normal text',
h('a', { props: { href: '/bar' } }, "I'll take you places!")
])
// Second `patch` invocation
patch(vnode, newVnode) // Snabbdom efficiently updates the old view to the new state
运行:yarn dev
访问:http://localhost:8080/