Talk is cheap, show me the code.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
| class Compiler { constructor(el, vm) { this.el = this.isElementNode(el) ? el : document.querySeletor(el); this.vm = vm; let fragment = this.node2fragment(this.el); this.el.appendChild(fragment); } isElementNode(node) { return node.nodeType === 1; } compileText () { let attributes = node.attributes; [...attributes].forEach(attr => { }); } compileElement() { } compile(node) { let childNodes = node.childNode; [...childNodes].forEach(child => { if (this.isElementNode(child)) { this.compileElement(child); } else { this.compileText(child); } }); } node2fragment(node) { let fragment = document.createDocumentFragment(); let firstChild; while (firstChild = node.firstChild) { fragment.appendChild(firstChild); } } }
class Vue { constructor(options) { this.$el = options.el; this.$data = options.data; if (this.$el) { new Compiler(this.$el, this); } } }
|