-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbundle.js
461 lines (373 loc) · 13.2 KB
/
bundle.js
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
/******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, {
/******/ configurable: false,
/******/ enumerable: true,
/******/ get: getter
/******/ });
/******/ }
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = 1);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
/**
* 主题发布
* @class Dep
*/
var Dep = function () {
function Dep() {
_classCallCheck(this, Dep);
// 主题的订阅者们
this.subs = [];
}
/**
* 添加订阅者
* @param {watcher} sub 订阅者
* @memberof Dep
*/
_createClass(Dep, [{
key: "addSub",
value: function addSub(sub) {
this.subs.push(sub);
}
/**
* 发布信息(通知订阅者)
* @memberof Dep
*/
}, {
key: "notify",
value: function notify() {
this.subs.forEach(function (sub) {
return sub.update();
});
}
}]);
return Dep;
}();
exports.default = Dep;
/***/ }),
/* 1 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _observe = __webpack_require__(2);
var _observe2 = _interopRequireDefault(_observe);
var _compile = __webpack_require__(3);
var _compile2 = _interopRequireDefault(_compile);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
/**
* Vue 对象
* @class Vue
*/
var Vue = function Vue(options) {
_classCallCheck(this, Vue);
this.el = options.el;
this.data = options.data;
// 监听this(vm) 这个对象的 data 属性
new _observe2.default(this.data, this);
// 初始化 文档上数据
var el = document.querySelector(this.el);
el.appendChild(new _compile2.default(el, this).node2Fragment());
};
/***/ }),
/* 2 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _dep = __webpack_require__(0);
var _dep2 = _interopRequireDefault(_dep);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
/**
* 观察者
* @class Observe
*/
var Observe = function () {
/**
* 监听 vm 中 data 的各个属性
* @param {Object} obj
* @param {Vue} vm
* @memberof Observe
*/
function Observe(obj, vm) {
var _this = this;
_classCallCheck(this, Observe);
this.obj = obj;
this.vm = vm;
Object.keys(obj).forEach(function (key) {
return _this.defineReactive(vm, key, obj[key]);
});
}
/**
* 响应式的数据绑定函数
* @param {Object} obj 目标对象(vm)
* @param {String} key 属性key
* @param {String} val 属性value
* @memberof Observe
*/
_createClass(Observe, [{
key: 'defineReactive',
value: function defineReactive(obj, key, val) {
// 定义一个主题类, 每个 data 中的属性都对应一个主题类,负责添加订阅者和发布信息
var dep = new _dep2.default();
Object.defineProperty(obj, key, {
get: function get() {
// 添加订阅者 watcher 到主题对象 Dep 中
if (_dep2.default.target) {
dep.addSub(_dep2.default.target);
}
return val;
},
set: function set(newVal) {
if (newVal === val) {
return;
}
val = newVal;
// 发布通知
dep.notify();
}
});
}
}]);
return Observe;
}();
exports.default = Observe;
/***/ }),
/* 3 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _watcher = __webpack_require__(4);
var _watcher2 = _interopRequireDefault(_watcher);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
/**
* 编译 html 节点
* view -> data: 监听 绑定属性对应的 元素 的事件,并把视图中最新的数据更新到 vue 对象中
* data -> view: 绑定 vue 对象中对应的属性值,更新对应的 html
* @class Compile
*/
var Compile = function () {
/**
* 构造函数
* @param {Element} node html 节点
* @param {Vue} vm vue 实例
* @memberof Compile
*/
function Compile(node, vm) {
_classCallCheck(this, Compile);
this.node = node;
this.vm = vm;
}
/**
* 编译
* @param {Element} node
* @param {Vue} vm
* @memberof Compile
*/
_createClass(Compile, [{
key: '_compile',
value: function _compile(node, vm) {
var reg = /\{\{(.*)\}\}/;
/**
* 是元素节点
*/
if (node.nodeType === Node.ELEMENT_NODE) {
Array.from(node.attributes).filter(function (attr) {
return attr.nodeName === 'v-model';
}).forEach(function (attr) {
var name = attr.nodeValue;
node.value = vm[name];
new _watcher2.default(vm, node, name.trim());
/**
* 绑定事件,并给相应的属性赋值
*/
node.addEventListener('input', function (e) {
vm[name] = e.target.value;
});
});
}
/**
* 是文本节点
*/
else if (node.nodeType === Node.TEXT_NODE) {
if (reg.test(node.nodeValue)) {
var name = RegExp.$1;
// 新增一个订阅者
new _watcher2.default(vm, node, name.trim());
}
}
}
/**
* 将节点装成文档片段,并编译各个节点
* @param {Element} node 节点
* @param {Vue} vm vue 实例
* @returns {DocumentFragment} 文档片段
* @memberof Compile
*/
}, {
key: '_node2Fragment',
value: function _node2Fragment(node, vm) {
var documentFragment = document.createDocumentFragment();
var child = node.firstChild;
while (child) {
this._compile(child, vm);
documentFragment.appendChild(child);
child = node.firstChild;
}
return documentFragment;
}
/**
* 外部调用
* @memberof Compile
*/
}, {
key: 'node2Fragment',
value: function node2Fragment() {
return this._node2Fragment(this.node, this.vm);
}
}]);
return Compile;
}();
exports.default = Compile;
/***/ }),
/* 4 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _dep = __webpack_require__(0);
var _dep2 = _interopRequireDefault(_dep);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
/**
* 主题订阅
* @class Watcher
*/
var Watcher = function () {
/**
* 构造函数
* @param {Vue} vm
* @param {Node} node
* @param {String} name
* @memberof Watcher
*/
function Watcher(vm, node, name) {
_classCallCheck(this, Watcher);
this.vm = vm;
this.node = node;
this.name = name;
// Dep.target 存储了当前的观察者
_dep2.default.target = this;
// 订阅者执行一次更新视图
this.update();
// 设置Dep.target 为 null, 确保再次调用属性 getter 时,不会重复添加 watcher
_dep2.default.target = null;
}
/**
* 执行 this.vm[this.name] 时,由于数据已经被 observe 了,所以,会调用对应的 getter 方法
*
* 所以,这句话会做两件事
* 1. 从 vm 中获取数据,并赋值到 this.value 中
* 2. 添加当前 watcher 对象到属性的 dep 中,即订阅属性的变化
* @memberof Watcher
*/
_createClass(Watcher, [{
key: 'get',
value: function get() {
this.value = this.vm[this.name];
}
/**
* 更新 this.value ,更新视图,这个方法初始化时需要调用
* 当主题发布信息时 调用 notify 方法,也会调用
* @memberof Watcher
*/
}, {
key: 'update',
value: function update() {
// 更新 this.value
this.get();
// 更新视图,实际处理过程中会更复杂
if (this.node.nodeValue === null) {
// Element 文档节点
this.node.value = this.value;
return;
}
this.node.nodeValue = this.value;
}
}]);
return Watcher;
}();
exports.default = Watcher;
/***/ })
/******/ ]);