efront 4.0.51 → 4.0.53

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,7 +5,7 @@ function decodeUTF16(buff, be) {
5
5
  if (buff[0] === 0xfe && buff[1] === 0xff) {
6
6
  be = true;
7
7
  }
8
- else if (buff[0] === 0xff && buff[1] === 0xfe) be = true;
8
+ else if (buff[0] === 0xff && buff[1] === 0xfe) be = false;
9
9
  else if (isEmpty(be)) be = false;
10
10
  var dec = be ? BE : LE;
11
11
  for (var cx = 0, dx = buff.length; cx < dx; cx += 2) {
@@ -35,7 +35,9 @@ if (!Promise) {
35
35
  // <!--
36
36
  console.warn("在异步过程中发现未处理的异常:", t.ohed[0], t.ohed[1], t.ohed[2]);
37
37
  // -->
38
- throw t.ohed[0];
38
+ requestAnimationFrame(function () {
39
+ throw t.ohed[0];
40
+ })
39
41
  }
40
42
  for (var r of PromiseRejectReactions) {
41
43
  r.apply(null, t.ohed);
@@ -1,4 +1,4 @@
1
- var { skipAssignment, snapSentenceHead, EXPRESS, SCOPED, QUOTED, VALUE, STRAP, STAMP, number_reg, createString } = require("./common");
1
+ var { skipAssignment, snapSentenceHead, snapExpressFoot, EXPRESS, SCOPED, QUOTED, VALUE, STRAP, STAMP, number_reg, createString } = require("./common");
2
2
  var strings = require("../basic/strings");
3
3
 
4
4
  var createRefId = function (o) {
@@ -50,6 +50,7 @@ var createRefId = function (o) {
50
50
  }
51
51
  return ids.join('');
52
52
  }
53
+ var ignore = Symbol("ignore");
53
54
  var maplist = function (u) {
54
55
  var map = Object.create(null);
55
56
  for (var o of u) {
@@ -59,9 +60,33 @@ var maplist = function (u) {
59
60
  map[r].wcount = 0;
60
61
  map[r].ccount = 0;
61
62
  }
62
- map[r].push(o);
63
- if (o.equal || o.kind) map[r].wcount++;
64
- if (o.called) map[r].ccount++;
63
+ var m = map[r];
64
+ m.push(o);
65
+ if (o.equal || o.kind) {
66
+ var typeref = o.typeref;
67
+ if (typeref && typeof typeref === 'object') {
68
+ typeref = typeref.typeref;
69
+ o.typeref = typeref;
70
+ }
71
+ if (typeref && typeref !== m.typeref) {
72
+ m.typeref = typeref;
73
+ m.wcount++;
74
+ }
75
+ else if (m.typeref) {
76
+ var n = o.next;
77
+ o[ignore] = true;
78
+ if (n.type === STAMP && /^(\+\+|\-\-)$/.test(n.text)) continue;
79
+ if (/^[\+\-]\=$/.test(n.text)) {
80
+ var nn = n.next;
81
+ if (nn && snapExpressFoot(nn) == nn && nn.isdigit && (nn.text & 0x1ff) === +nn.text) continue;
82
+ }
83
+ else if (!n || !/=$/.test(n.text)) continue;
84
+ o[ignore] = false;
85
+ m.wcount++;
86
+ }
87
+ else m.wcount++;
88
+ }
89
+ if (o.called) m.ccount++;
65
90
  }
66
91
  return map;
67
92
  }
@@ -69,7 +94,6 @@ function createRefMap(scoped) {
69
94
  var { used } = scoped;
70
95
  var refs = Object.create(null);
71
96
  for (var k in used) refs[k] = maplist(used[k]);
72
- scoped.forEach(createRefMap);
73
97
  return scoped.refs = refs;
74
98
  }
75
99
  function removeRefs(o) {
@@ -126,53 +150,70 @@ function inCondition(o) {
126
150
  }
127
151
 
128
152
  function enumref(scoped) {
129
- if (scoped.isfunc) {
130
- var { refs } = scoped;
131
- for (var k in refs) {
132
- var rs = refs[k];
133
- for (var rk in rs) {
134
- var os = rs[rk];
135
- if (os.wcount !== 1 || os.length < 2) continue;
136
- var eq = null, em = null;
137
- loop: for (var o of os) {
138
- if (o.equal) {
139
- if (o.equal.text !== '=') break;
140
- if (o.queue.kind) break;
141
- if (o.queue !== scoped.body) break;
142
- if (inCondition(o)) break;
143
- if (o.enumref) {
144
- em = o.enumref;
145
- continue;
146
- }
147
- o = o.equal.next;
148
- var n = skipAssignment(o);
149
- var exps = [];
150
- do {
151
- exps.push(o);
152
- o = o.next;
153
- } while (o && o !== n);
154
- if (exps.length !== 1) break loop;
155
- eq = exps[0];
156
- if (eq.type !== VALUE || !eq.isdigit) {
157
- eq = null;
153
+ var { refs } = scoped;
154
+ for (var k in refs) {
155
+ var rs = refs[k];
156
+ for (var rk in rs) {
157
+ var os = rs[rk];
158
+ if (os.wcount !== 1 || os.length < 2) continue;
159
+ var eq = null, em = null, tp = null;
160
+ loop: for (var o of os) {
161
+ if (o.equal && !o[ignore]) {
162
+ if (o.equal.text !== '=') break;
163
+ if (o.queue.kind) break;
164
+ var q = o.queue;
165
+ if (q !== scoped.body) {
166
+ if (q.entry === '(' && q.queue === scoped.body) {
167
+ var qp = q.prev;
168
+ if (qp.type === EXPRESS) qp = qp.prev;
169
+ if (qp && qp.type === STRAP && qp.text === "await") qp = qp.prev;
170
+ if (qp && qp.type === STRAP && qp.text === 'for') {
171
+ var f = q.first;
172
+ var fc = 0;
173
+ while (f && f !== o) {
174
+ if (f.type === STAMP && f.text === ";") {
175
+ fc++;
176
+ if (fc > 1) break loop;
177
+ }
178
+ f = f.next;
179
+ }
180
+ }
158
181
  }
182
+ else break;
159
183
  }
160
- else {
161
- if (em) {
162
- o.enumref = em;
163
- continue;
164
- }
165
- if (!eq) break;
166
- o.type = eq.type;
167
- o.isdigit = true;
168
- o.text = eq.text;
169
- removeRefs(o);
184
+ if (inCondition(o)) break;
185
+ if (o.typeref) {
186
+ tp = o.typeref;
187
+ if (isObject(tp)) tp = tp.typeref;
188
+ continue;
189
+ }
190
+ if (o.enumref) {
191
+ em = o.enumref;
192
+ continue;
170
193
  }
194
+ o = o.equal.next;
195
+ var n = skipAssignment(o);
196
+ if (!o || n !== o.next) break loop;
197
+ if (o.type === VALUE && o.isdigit) eq = o;
198
+ }
199
+ else {
200
+ if (tp) {
201
+ o.typeref = tp;
202
+ continue;
203
+ }
204
+ if (em) {
205
+ o.enumref = em;
206
+ continue;
207
+ }
208
+ if (!eq) break;
209
+ o.type = eq.type;
210
+ o.isdigit = true;
211
+ o.text = eq.text;
212
+ removeRefs(o);
171
213
  }
172
214
  }
173
215
  }
174
216
  }
175
- scoped.forEach(enumref)
176
217
  }
177
218
 
178
219
  function atuoenum(scoped) {
@@ -180,8 +221,14 @@ function atuoenum(scoped) {
180
221
  enumref(scoped);
181
222
  }
182
223
  var exports = module.exports = function main(code) {
183
- atuoenum(code.scoped);
224
+ var rest = [code.scoped];
225
+ while (rest.length) {
226
+ var s = rest.pop();
227
+ if (s.length) rest.push(...s);
228
+ atuoenum(s);
229
+ }
184
230
  return code;
185
231
  }
186
232
  exports.createRefId = createRefId;
187
- exports.createRefMap = createRefMap;
233
+ exports.createRefMap = createRefMap;
234
+ exports.enumscoped = atuoenum;
@@ -16,4 +16,14 @@ t("var {a=1};console.log(a)", "var { a = 1 }; console.log(a)");
16
16
  t("if(c) a=1;console.log(a)", "if (c) a = 1; console.log(a)");
17
17
  t("console.log(a);a=1;", "console.log(a); a = 1;");
18
18
  t("console.log(a);var a=1;", "console.log(a); var a = 1;");
19
+ t("var a=1;console.log(a++);", "var a = 1; console.log(a++);");
20
+ t("for(;;){let a =1; console.log(a)}", "for (;;) { let a = 1; console.log(1) }");
21
+ t("for(;;){a =1; console.log(a)}", "for (;;) { a = 1; console.log(1) }");
22
+ t("a=2;for(;;){var a =1; console.log(a)}", "a = 2; for (;;) { var a = 1; console.log(1) }");
23
+ t("for(;;){var a =1; console.log(a)} console.log(a)", "for (;;) { var a = 1; console.log(1) } console.log(a)");
24
+ t("for(;a=1;){ console.log(a)} console.log(a)", "for (; a = 1;) { console.log(1) } console.log(1)");
25
+ t("for(;a=1;){ console.log(a)} console.log(a)", "for (; a = 1;) { console.log(1) } console.log(1)");
26
+ t("for(;;a=1){ console.log(a)} console.log(a)", "for (;; a = 1) { console.log(a) } console.log(a)");
27
+ t("for(var a = 1;;){ console.log(a)} console.log(a)", "for (var a = 1;;) { console.log(1) } console.log(1)");
28
+ t("for(let a = 1;;){ console.log(a)} console.log(a)", "for (let a = 1;;) { console.log(a) } console.log(a)");
19
29
  // t(fs.readFileSync(path.join(__dirname,"../zimoli/spacechar_test.js")).toString())
@@ -358,7 +358,7 @@ var killdec = function (queue, i, getobjname, _var = 'var', killobj, islet) {
358
358
  return i;
359
359
  };
360
360
  // 键值对重组
361
- var killmap = function (body, i, _getobjname, killobj) {
361
+ var killmap = function (body, i, _getobjname, _getnewname, killobj) {
362
362
  var o = body[i];
363
363
  if (!o.length) return indexof(body, o.next, i);
364
364
  var m = o.first;
@@ -432,6 +432,7 @@ var killmap = function (body, i, _getobjname, killobj) {
432
432
  insert1(q, null, { type: STAMP, text: ',' });
433
433
  }
434
434
  var define_ = Object.create(null);
435
+ var tempname = null;
435
436
  var t;
436
437
  while (m) {
437
438
  if (m.type === EXPRESS) {
@@ -479,7 +480,8 @@ var killmap = function (body, i, _getobjname, killobj) {
479
480
  var [prop, m] = getprop(o, m);
480
481
  if (!prop.value.length) insert1(prop.value, null, { type: EXPRESS, text: prop.name })
481
482
  else if (prop.sfunc === false) killobj(prop.value);
482
- setprop(prop, _getobjname(), define_, q);
483
+ if ((prop.get || prop.set) && !tempname) tempname = _getnewname();
484
+ setprop(prop, _getobjname(), define_, q, tempname);
483
485
  }
484
486
 
485
487
  if (q) {
@@ -538,7 +540,7 @@ var getprop = function (o, m) {
538
540
  else if (!prop.value) prop.value = [];
539
541
  return [prop, m];
540
542
  };
541
- var setprop = function (prop, k, d, q) {
543
+ var setprop = function (prop, k, d, q, tempname) {
542
544
  if (prop.sfunc !== false)
543
545
  // insert1(prop.value, prop.value[0], ...scanner2(`${prop.async ? "async " : ""}function${prop["*"] ? "*" : ''}`));
544
546
  insert1(prop.value, prop.value[0], ...scanner2(`function`));
@@ -551,17 +553,14 @@ var setprop = function (prop, k, d, q) {
551
553
  else pe = null;
552
554
  }
553
555
  if (!d[prop.name]) {
554
- let tmp = scanner2(`\r\nObject["defineProperty"](${k},${prop.name},{})`);
556
+ let tmp = scanner2(`\r\nObject["defineProperty"](${k},${prop.name},(${tempname}={},${tempname}))`);
555
557
  insert1(q, null, ...tmp);
556
558
  if (pe) insert1(q, null, pe);
557
559
  tmp = tmp[tmp.length - 1];
558
560
  tmp = tmp[tmp.length - 1];
559
561
  d[prop.name] = tmp;
560
562
  }
561
- if (d[prop.name].length) insert1(d[prop.name], null, { type: STAMP, text: ',' });
562
- insert1(d[prop.name], null, { type: PROPERTY, text: prop.get ? "get" : "set" });
563
- insert1(d[prop.name], null, { type: STAMP, text: ":" });
564
- if (pv && pv.length) insert1(d[prop.name], null, ...pv);
563
+ insert1(d[prop.name], null, ...rescan`[${prop.get ? '"get"' : '"set"'}]=${pv},${tempname}`);
565
564
  }
566
565
  else {
567
566
  insert1(q, null, ...scanner2(`${q && q.length ? "\r\n" : ''}${k}${prop.name}=`));
@@ -569,7 +568,7 @@ var setprop = function (prop, k, d, q) {
569
568
  }
570
569
  }
571
570
  var rootenvs = null, rootHyper;
572
- var killcls = function (body, i, getname_) {
571
+ var killcls = function (body, i, letname_, getname_) {
573
572
  var extends_ = [];
574
573
  var o = body[i];
575
574
  var ishalf = isHalfSentence(body, i - 1);
@@ -610,13 +609,14 @@ var killcls = function (body, i, getname_) {
610
609
  var scoped = o.scoped;
611
610
  var m = o.first;
612
611
  var name = extends_.pop();
613
- if (!name && (base || extends_.length)) name = getname_('cls' + index);
612
+ if (!name && (base || extends_.length)) name = letname_('cls' + index);
614
613
  var assign = [];
615
614
  var constructor = scanner2('(){}');
616
615
  var define_ = Object.create(null);
617
616
  var static_ = Object.create(null);
618
617
  var clz = { name };
619
- if (!clz.name) clz.name = getname_("cls" + index);
618
+ if (!clz.name) clz.name = letname_("cls" + index);
619
+ var tempname = null;
620
620
  while (m) {
621
621
  var [prop, m] = getprop(o, m);
622
622
  if (!prop.value.length) prop.value = scanner2('undefined;');
@@ -624,7 +624,8 @@ var killcls = function (body, i, getname_) {
624
624
  var d = prop.static ? static_ : define_;
625
625
  if (prop.get || prop.set || prop.static) {
626
626
  if (prop.name) {
627
- setprop(prop, k, d, defines);
627
+ if ((prop.get || prop.set) && !tempname) tempname = getname_("tmp");
628
+ setprop(prop, k, d, defines, tempname);
628
629
  }
629
630
  else if (prop.static) {
630
631
  var value = scanner2(`(function(){}())`);
@@ -931,7 +932,7 @@ var killobj = function (body, getobjname, getletname, getname_, letname_, deep =
931
932
  i++;
932
933
  break;
933
934
  case "class":
934
- i = killcls(body, i, letname_);
935
+ i = killcls(body, i, letname_, getname_);
935
936
  break;
936
937
  case "for":
937
938
  case "function":
@@ -964,7 +965,7 @@ var killobj = function (body, getobjname, getletname, getname_, letname_, deep =
964
965
  continue;
965
966
  }
966
967
  else {
967
- i = killmap(body, i, _getobjname, deepkill);
968
+ i = killmap(body, i, _getobjname, _getnewname, deepkill);
968
969
  // i = indexof(body, o, i);
969
970
  continue;
970
971
  }
@@ -1100,7 +1101,7 @@ var unforin = function (o, getnewname_, killobj) {
1100
1101
  var s = scanner2(`${sname}=`);
1101
1102
  insert1(s, null, ...splice2(o, n));
1102
1103
  insert1(s, null,
1103
- ...scanner2(`,${tname}=[];for(${hasdeclare ? 'var ' : ''}${hasdeclare ? f.text : kname} in ${sname})${tname}.push(${hasdeclare ? f.text : kname});`)
1104
+ ...scanner2(`,${tname}=[];for(${hasdeclare ? 'var ' : ''}${hasdeclare ? f.text : kname} in ${sname})${tname}["push"](${hasdeclare ? f.text : kname});`)
1104
1105
  );
1105
1106
  insert1(o.queue, o.prev, ...s);
1106
1107
  splice(o, 0, o.length, ...scanner2(`${kname}=0;${kname}<${tname}["length"]&&`));
@@ -1210,11 +1211,31 @@ var unarrow = function (body, i, killobj, letname_) {
1210
1211
  return nni;
1211
1212
  };
1212
1213
  var getname = function (vars, envs, k) {
1213
- if (!(k in vars) && !(k in envs)) return vars[k] = true, k;
1214
+ var extra = this instanceof Array ? this : null;
1215
+ a: if (!(k in vars) && !(k in envs)) {
1216
+ if (extra) for (var e of extra) {
1217
+ if (k in e) break a;
1218
+ }
1219
+ return vars[k] = true, k;
1220
+ }
1214
1221
  var inc = /\d+$/.exec(k);
1215
1222
  if (inc) k = k.slice(0, k.length - inc[0].length), inc = 1 + +inc[0];
1216
1223
  else inc = 0;
1217
- while ((k + inc) in vars || (k + inc) in envs) inc++;
1224
+ loop: while (true) {
1225
+ var k0 = k + inc;
1226
+ if (k0 in vars || k0 in envs) {
1227
+ inc++;
1228
+ continue;
1229
+ }
1230
+ if (extra) for (var e of extra) {
1231
+ if (k0 in e) {
1232
+ inc++;
1233
+ continue loop;
1234
+ }
1235
+ }
1236
+
1237
+ break;
1238
+ }
1218
1239
  vars[k + inc] = true;
1219
1240
  return k + inc;
1220
1241
  };
@@ -1659,7 +1680,7 @@ var down = function (scoped) {
1659
1680
  if (scoped.isfunc) return down(scoped);
1660
1681
  killlet(scoped);
1661
1682
  var saveddeep = fordeep;
1662
- var _getlocal = getname.bind(null, scoped.lets, scoped.envs);
1683
+ var _getlocal = getname.bind([scoped.lets, scoped.envs], vars, envs);
1663
1684
  var getdeepname = function () {
1664
1685
  return gettmpname(--fordeep);
1665
1686
  };
@@ -102,15 +102,19 @@ assert(downLevel(`class a extends class b{}{}`), `var a = function (b, a) { exte
102
102
  var this_ = b["apply"](this, arguments) || this;
103
103
  return this_ })`);
104
104
  assert(downLevel(`class a {get a(){}}`), `function a() {};
105
- Object["defineProperty"](a["prototype"], "a", { get: function () {} })`);
105
+ Object["defineProperty"](a["prototype"], "a", (tmp = {}, tmp["get"] = function () {}, tmp))
106
+ var tmp`);
106
107
  assert(downLevel(`class a {set a(){}}`), `function a() {};
107
- Object["defineProperty"](a["prototype"], "a", { set: function () {} })`);
108
+ Object["defineProperty"](a["prototype"], "a", (tmp = {}, tmp["set"] = function () {}, tmp))
109
+ var tmp`);
108
110
  assert(downLevel(`class a {get a(){}; get b(){}; set a(){}}`), `function a() {};
109
- Object["defineProperty"](a["prototype"], "a", { get: function () {}, set: function () {} });
110
- Object["defineProperty"](a["prototype"], "b", { get: function () {} });`);
111
+ Object["defineProperty"](a["prototype"], "a", (tmp = {}, tmp["get"] = function () {}, tmp["set"] = function () {}, tmp));
112
+ Object["defineProperty"](a["prototype"], "b", (tmp = {}, tmp["get"] = function () {}, tmp));
113
+ var tmp`);
111
114
  assert(downLevel(`class a {set a(){}; get b(){}; set a(){}}`), `function a() {};
112
- Object["defineProperty"](a["prototype"], "a", { set: function () {}, set: function () {} });
113
- Object["defineProperty"](a["prototype"], "b", { get: function () {} });`);
115
+ Object["defineProperty"](a["prototype"], "a", (tmp = {}, tmp["set"] = function () {}, tmp["set"] = function () {}, tmp));
116
+ Object["defineProperty"](a["prototype"], "b", (tmp = {}, tmp["get"] = function () {}, tmp));
117
+ var tmp`);
114
118
  i++// 属性降级
115
119
  assert(downLevel(`return ({b,async a(){}})`), `return ((_ = {},
116
120
  _.b = b,
@@ -180,8 +184,9 @@ assert(downLevel(`={...{},...c,b}`), `= (_ = extend({}, {}, c),
180
184
  _.b = b, _)\r\nvar _`);
181
185
  assert(downLevel(`={a(){},get c(){},b}`), `= (_ = {},
182
186
  _.a = function () {},
183
- Object["defineProperty"](_, "c", { get: function () {} }),
184
- _.b = b, _)\r\nvar _`);
187
+ Object["defineProperty"](_, "c", (_0 = {}, _0["get"] = function () {}, _0)),
188
+ _.b = b, _)\r\nvar _, _0`);
189
+ assert(downLevel(`if(){Promise.reslove({get then() {}})}`), `if () { Promise.reslove((_ = {},\r\nObject["defineProperty"](_, "then", (_0 = {}, _0["get"] = function () {}, _0)), _)) }\r\nvar _, _0`)
185
190
  assert(downLevel(`=[...a]`), `var slice_ = Array["prototype"]["slice"];\r\n= slice_["call"](a)`)
186
191
  assert(downLevel(`let a = [...a,...a()];`), `var slice_ = Array["prototype"]["slice"];\r\nvar a = slice_["call"](a)["concat"](slice_["call"](a()));`)
187
192
  assert(downLevel(`=[...a,...b]`), `var slice_ = Array["prototype"]["slice"];\r\n= slice_["call"](a)["concat"](slice_["call"](b))`)
@@ -226,12 +226,13 @@ var _for = function (body, cx, unblock, result) {
226
226
  var o = body[cx];
227
227
  var label = o;
228
228
  o = o.next;
229
+ if (o.type === STRAP && o.text === 'await') o = o.next;
229
230
  var m = o.first;
230
231
  if (m.type === STRAP && /^(let|const|var)$/.test(m.text)) {
231
232
  m = m.next;
232
233
  }
233
234
  var mn = m.next;
234
- if (mn.type === STRAP && mn.text === 'in') {
235
+ if (mn.type === STRAP && /^(of|in)$/.test(mn.text)) {
235
236
  // 含有高级语法的 for in 语句在 ./downLevel.js 中预处理
236
237
  var dx = cx;
237
238
  var n = o.next;
@@ -65,6 +65,9 @@ test("if(await a) await b", "_ = a; return [_, 1];\r\n if (!@) return [2, 0]; _
65
65
  test("for(a in b)", "for (a in b)", true);
66
66
  test("for(var a in b) a.push()", "for (var a in b) a.push()", true);
67
67
  test("for(;;)", "return [0, 0]", true);
68
+ test("for(a in b)", "for (a in b)", true);
69
+ test("for(a of b)", "for (a of b)", true);
70
+ test("for await(a of b)", "for await (a of b)", true);
68
71
  test("for(a = os[Symbol.iterator] || os[Symbol.asyncIterator] || Array.prototype[Symbol.iterator], a = a.call(os), b = a.next(); !b.done && (o = b.value, true); b = a.next())", "_ = Symbol.iterator; _ = os[_]; if (_) return [1, 0]; _ = Symbol.asyncIterator; _ = os[_]; if (_) return [1, 0]; _ = Symbol.iterator; _ = Array.prototype[_];\r\n a = _; a = a.call(os); b = a.next(); return [1, 0];\r\n _ = !b.done; if (!_) return [1, 0]; o = b.value; _ = (true);\r\n if (!_) return [1, 0]; b = a.next(); return [-1, 0]", true);
69
72
  test("for(a=0;a<1;a++)if(a==0)continue\r\n else a=1", `a = 0; return [1, 0];\r\n _ = a < 1; if (!_) return [3, 0]; _ = a == 0; if (_) return [2, 0]; return [1, 0];\r\n a = 1; return [1, 0];\r\n _ = a++; return [-2, 0]`, true);
70
73
  test("for(a=0;a<1;a++)if(a==0){continue} else {a=1}", `a = 0; return [1, 0];\r\n _ = a < 1; if (!_) return [3, 0]; _ = a == 0; if (!_) return [1, 0]; return [2, 0];\r\n a = 1; return [1, 0];\r\n _ = a++; return [-2, 0]`, true);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "efront",
3
- "version": "4.0.51",
3
+ "version": "4.0.53",
4
4
  "description": "简化前端开发,优化web性能",
5
5
  "main": "public/efront.js",
6
6
  "directories": {