@tarojs/taro-h5 3.5.11 → 3.6.0-beta.1

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.
package/dist/index.cjs.js CHANGED
@@ -4,6 +4,7 @@ Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var Taro = require('@tarojs/api');
6
6
  var router = require('@tarojs/router');
7
+ var shared = require('@tarojs/shared');
7
8
  var utils = require('@tarojs/router/dist/utils');
8
9
  var runtime = require('@tarojs/runtime');
9
10
  var base64Js = require('base64-js');
@@ -37,30 +38,38 @@ var jsonpRetry__default = /*#__PURE__*/_interopDefaultLegacy(jsonpRetry);
37
38
 
38
39
  class MethodHandler {
39
40
  constructor({ name, success, fail, complete }) {
41
+ this.isHandlerError = false;
40
42
  this.methodName = name;
41
43
  this.__success = success;
42
44
  this.__fail = fail;
43
45
  this.__complete = complete;
46
+ this.isHandlerError = shared.isFunction(this.__complete) || shared.isFunction(this.__fail);
44
47
  }
45
- success(res = {}, resolve = Promise.resolve.bind(Promise)) {
48
+ success(res = {}, promise = {}) {
46
49
  if (!res.errMsg) {
47
50
  res.errMsg = `${this.methodName}:ok`;
48
51
  }
49
- typeof this.__success === 'function' && this.__success(res);
50
- typeof this.__complete === 'function' && this.__complete(res);
52
+ shared.isFunction(this.__success) && this.__success(res);
53
+ shared.isFunction(this.__complete) && this.__complete(res);
54
+ const { resolve = Promise.resolve.bind(Promise) } = promise;
51
55
  return resolve(res);
52
56
  }
53
- fail(res = {}, reject = Promise.reject.bind(Promise)) {
57
+ fail(res = {}, promise = {}) {
54
58
  if (!res.errMsg) {
55
59
  res.errMsg = `${this.methodName}:fail`;
56
60
  }
57
61
  else {
58
62
  res.errMsg = `${this.methodName}:fail ${res.errMsg}`;
59
63
  }
60
- console.error(res.errMsg);
61
- typeof this.__fail === 'function' && this.__fail(res);
62
- typeof this.__complete === 'function' && this.__complete(res);
63
- return reject(res);
64
+ if (!isProd) {
65
+ console.error(res.errMsg);
66
+ }
67
+ shared.isFunction(this.__fail) && this.__fail(res);
68
+ shared.isFunction(this.__complete) && this.__complete(res);
69
+ const { resolve = Promise.resolve.bind(Promise), reject = Promise.reject.bind(Promise) } = promise;
70
+ return this.isHandlerError
71
+ ? resolve(res)
72
+ : reject(res);
64
73
  }
65
74
  }
66
75
  class CallbackManager {
@@ -104,12 +113,12 @@ class CallbackManager {
104
113
  */
105
114
  this.trigger = (...args) => {
106
115
  this.callbacks.forEach(opt => {
107
- if (typeof opt === 'function') {
116
+ if (shared.isFunction(opt)) {
108
117
  opt(...args);
109
118
  }
110
119
  else {
111
120
  const { callback, ctx } = opt;
112
- typeof callback === 'function' && callback.call(ctx, ...args);
121
+ shared.isFunction(callback) && callback.call(ctx, ...args);
113
122
  }
114
123
  });
115
124
  };
@@ -161,9 +170,6 @@ function debounce(fn, ms = 250, scope) {
161
170
  };
162
171
  }
163
172
 
164
- function isFunction(obj) {
165
- return typeof obj === 'function';
166
- }
167
173
  const VALID_COLOR_REG = /^#[0-9a-fA-F]{6}$/;
168
174
  const isValidColor = (color) => {
169
175
  return VALID_COLOR_REG.test(color);
@@ -308,7 +314,7 @@ function processOpenApi({ name, defaultOptions, standardMethod, formatOptions =
308
314
  // @ts-ignore
309
315
  const targetApi = (_a = window === null || window === void 0 ? void 0 : window.wx) === null || _a === void 0 ? void 0 : _a[name];
310
316
  const opts = formatOptions(Object.assign({}, defaultOptions, options));
311
- if (typeof targetApi === 'function') {
317
+ if (shared.isFunction(targetApi)) {
312
318
  return new Promise((resolve, reject) => {
313
319
  ['fail', 'success', 'complete'].forEach(k => {
314
320
  opts[k] = preRef => {
@@ -325,7 +331,7 @@ function processOpenApi({ name, defaultOptions, standardMethod, formatOptions =
325
331
  });
326
332
  });
327
333
  }
328
- else if (typeof standardMethod === 'function') {
334
+ else if (shared.isFunction(standardMethod)) {
329
335
  return standardMethod(opts);
330
336
  }
331
337
  else {
@@ -1512,7 +1518,7 @@ const setClipboardData = ({ data, success, fail, complete }) => __awaiter(void 0
1512
1518
  * iOS < 10 的系统可能无法使用编程方式访问剪贴板,参考:
1513
1519
  * https://stackoverflow.com/questions/34045777/copy-to-clipboard-using-javascript-in-ios/34046084
1514
1520
  */
1515
- if (typeof document.execCommand === 'function') {
1521
+ if (shared.isFunction(document.execCommand)) {
1516
1522
  const textarea = document.createElement('textarea');
1517
1523
  textarea.readOnly = true;
1518
1524
  textarea.value = data;
@@ -1972,9 +1978,9 @@ const getLocationByW3CApi = (options) => {
1972
1978
  /** 调用结果,自动补充 */
1973
1979
  errMsg: ''
1974
1980
  };
1975
- handle.success(result, resolve);
1981
+ handle.success(result, { resolve, reject });
1976
1982
  }, (error) => {
1977
- handle.fail({ errMsg: error.message }, reject);
1983
+ handle.fail({ errMsg: error.message }, { resolve, reject });
1978
1984
  }, positionOptions);
1979
1985
  });
1980
1986
  };
@@ -2072,7 +2078,7 @@ const chooseLocation = ({ success, fail, complete, mapOpts } = {}) => {
2072
2078
  console.warn('chooseLocation api 依赖腾讯地图定位api,需要在 defineConstants 中配置 LOCATION_APIKEY');
2073
2079
  return handle.fail({
2074
2080
  errMsg: 'LOCATION_APIKEY needed'
2075
- }, reject);
2081
+ }, { resolve, reject });
2076
2082
  }
2077
2083
  const onMessage = event => {
2078
2084
  // 接收位置信息,用户选择确认位置点后选点组件会触发该事件,回传用户的位置信息
@@ -2091,14 +2097,14 @@ const chooseLocation = ({ success, fail, complete, mapOpts } = {}) => {
2091
2097
  chooser.remove();
2092
2098
  }, 300);
2093
2099
  if (res) {
2094
- return handle.fail(res, reject);
2100
+ return handle.fail(res, { resolve, reject });
2095
2101
  }
2096
2102
  else {
2097
2103
  if (chooseLocation.latitude && chooseLocation.longitude) {
2098
- return handle.success(chooseLocation, resolve);
2104
+ return handle.success(chooseLocation, { resolve, reject });
2099
2105
  }
2100
2106
  else {
2101
- return handle.fail({}, reject);
2107
+ return handle.fail({}, { resolve, reject });
2102
2108
  }
2103
2109
  }
2104
2110
  }, key, mapOpts);
@@ -2355,12 +2361,12 @@ const getImageInfo = (options) => {
2355
2361
  width: image.naturalWidth,
2356
2362
  height: image.naturalHeight,
2357
2363
  path: getBase64Image(image) || src
2358
- }, resolve);
2364
+ }, { resolve, reject });
2359
2365
  };
2360
2366
  image.onerror = (e) => {
2361
2367
  handle.fail({
2362
2368
  errMsg: e.message
2363
- }, reject);
2369
+ }, { resolve, reject });
2364
2370
  };
2365
2371
  image.src = src;
2366
2372
  });
@@ -2387,7 +2393,7 @@ const previewImage = (options) => __awaiter(void 0, void 0, void 0, function* ()
2387
2393
  item.appendChild(div);
2388
2394
  // Note: 等待图片加载完后返回,会导致轮播被卡住
2389
2395
  resolve(item);
2390
- if (typeof loadFail === 'function') {
2396
+ if (shared.isFunction(loadFail)) {
2391
2397
  image.addEventListener('error', (err) => {
2392
2398
  loadFail({ errMsg: err.message });
2393
2399
  });
@@ -2492,7 +2498,7 @@ const chooseImage = function (options) {
2492
2498
  el.removeAttribute('capture');
2493
2499
  }
2494
2500
  }
2495
- return new Promise(resolve => {
2501
+ return new Promise((resolve, reject) => {
2496
2502
  const TaroMouseEvents = document.createEvent('MouseEvents');
2497
2503
  TaroMouseEvents.initEvent('click', true, true);
2498
2504
  if (el) {
@@ -2511,7 +2517,7 @@ const chooseImage = function (options) {
2511
2517
  (_a = res.tempFilePaths) === null || _a === void 0 ? void 0 : _a.push(url);
2512
2518
  (_b = res.tempFiles) === null || _b === void 0 ? void 0 : _b.push({ path: url, size: item.size, type: item.type, originalFileObj: item });
2513
2519
  });
2514
- handle.success(res, resolve);
2520
+ handle.success(res, { resolve, reject });
2515
2521
  target.value = '';
2516
2522
  }
2517
2523
  };
@@ -2579,7 +2585,7 @@ const chooseVideo = (options) => {
2579
2585
  inputEl.setAttribute('accept', 'video/*');
2580
2586
  inputEl.setAttribute('style', 'position: fixed; top: -4000px; left: -3000px; z-index: -300;');
2581
2587
  document.body.appendChild(inputEl);
2582
- return new Promise(resolve => {
2588
+ return new Promise((resolve, reject) => {
2583
2589
  const TaroMouseEvents = document.createEvent('MouseEvents');
2584
2590
  TaroMouseEvents.initEvent('click', true, true);
2585
2591
  inputEl.dispatchEvent(TaroMouseEvents);
@@ -2600,7 +2606,7 @@ const chooseVideo = (options) => {
2600
2606
  res.size = event.total;
2601
2607
  res.height = videoEl.videoHeight;
2602
2608
  res.width = videoEl.videoHeight;
2603
- return handle.success(res, resolve);
2609
+ return handle.success(res, { resolve, reject });
2604
2610
  };
2605
2611
  };
2606
2612
  if (file) {
@@ -2881,13 +2887,13 @@ function _request(options) {
2881
2887
  .then(data => {
2882
2888
  res.statusCode = 200;
2883
2889
  res.data = data;
2884
- typeof success === 'function' && success(res);
2885
- typeof complete === 'function' && complete(res);
2890
+ shared.isFunction(success) && success(res);
2891
+ shared.isFunction(complete) && complete(res);
2886
2892
  return res;
2887
2893
  })
2888
2894
  .catch(err => {
2889
- typeof fail === 'function' && fail(err);
2890
- typeof complete === 'function' && complete(res);
2895
+ shared.isFunction(fail) && fail(err);
2896
+ shared.isFunction(complete) && complete(res);
2891
2897
  return Promise.reject(err);
2892
2898
  });
2893
2899
  }
@@ -2955,13 +2961,13 @@ function _request(options) {
2955
2961
  })
2956
2962
  .then(data => {
2957
2963
  res.data = data;
2958
- typeof success === 'function' && success(res);
2959
- typeof complete === 'function' && complete(res);
2964
+ shared.isFunction(success) && success(res);
2965
+ shared.isFunction(complete) && complete(res);
2960
2966
  return res;
2961
2967
  })
2962
2968
  .catch(err => {
2963
- typeof fail === 'function' && fail(err);
2964
- typeof complete === 'function' && complete(res);
2969
+ shared.isFunction(fail) && fail(err);
2970
+ shared.isFunction(complete) && complete(res);
2965
2971
  err.statusCode = res.statusCode;
2966
2972
  err.errMsg = err.message;
2967
2973
  return Promise.reject(err);
@@ -3150,14 +3156,14 @@ class SocketTask {
3150
3156
  if (this.readyState !== 1) {
3151
3157
  const res = { errMsg: 'SocketTask.send:fail SocketTask.readState is not OPEN' };
3152
3158
  console.error(res.errMsg);
3153
- typeof fail === 'function' && fail(res);
3154
- typeof complete === 'function' && complete(res);
3159
+ shared.isFunction(fail) && fail(res);
3160
+ shared.isFunction(complete) && complete(res);
3155
3161
  return Promise.reject(res);
3156
3162
  }
3157
3163
  this.ws.send(data);
3158
3164
  const res = { errMsg: 'sendSocketMessage:ok' };
3159
- typeof success === 'function' && success(res);
3160
- typeof complete === 'function' && complete(res);
3165
+ shared.isFunction(success) && success(res);
3166
+ shared.isFunction(complete) && complete(res);
3161
3167
  return Promise.resolve(res);
3162
3168
  }
3163
3169
  close(opts = {}) {
@@ -3169,8 +3175,8 @@ class SocketTask {
3169
3175
  this._destroyWhenClose && this._destroyWhenClose();
3170
3176
  this.ws.close();
3171
3177
  const res = { errMsg: 'closeSocket:ok' };
3172
- typeof success === 'function' && success(res);
3173
- typeof complete === 'function' && complete(res);
3178
+ shared.isFunction(success) && success(res);
3179
+ shared.isFunction(complete) && complete(res);
3174
3180
  return Promise.resolve(res);
3175
3181
  }
3176
3182
  onOpen(func) {
@@ -3228,13 +3234,13 @@ function connectSocket(options) {
3228
3234
  correct: 'String',
3229
3235
  wrong: url
3230
3236
  })
3231
- }, reject);
3237
+ }, { resolve, reject });
3232
3238
  }
3233
3239
  // options.url must be invalid
3234
3240
  if (!url.startsWith('ws://') && !url.startsWith('wss://')) {
3235
3241
  return handle.fail({
3236
3242
  errMsg: `request:fail invalid url "${url}"`
3237
- }, reject);
3243
+ }, { resolve, reject });
3238
3244
  }
3239
3245
  // protocols must be array
3240
3246
  const _protocols = Array.isArray(protocols) ? protocols : null;
@@ -3242,7 +3248,7 @@ function connectSocket(options) {
3242
3248
  if (socketTasks.length > 1) {
3243
3249
  return handle.fail({
3244
3250
  errMsg: '同时最多发起 2 个 socket 请求,更多请参考文档。'
3245
- }, reject);
3251
+ }, { resolve, reject });
3246
3252
  }
3247
3253
  const task = new SocketTask(url, _protocols);
3248
3254
  task._destroyWhenClose = function () {
@@ -4596,8 +4602,8 @@ const startPullDownRefresh = function ({ success, fail, complete } = {}) {
4596
4602
  const handle = new MethodHandler({ name: 'startPullDownRefresh', success, fail, complete });
4597
4603
  return new Promise((resolve, reject) => {
4598
4604
  Taro__default["default"].eventCenter.trigger('__taroStartPullDownRefresh', {
4599
- successHandler: (res = {}) => handle.success(res, resolve),
4600
- errorHandler: (res = {}) => handle.fail(res, reject)
4605
+ successHandler: (res = {}) => handle.success(res, { resolve, reject }),
4606
+ errorHandler: (res = {}) => handle.fail(res, { resolve, reject })
4601
4607
  });
4602
4608
  });
4603
4609
  };
@@ -4608,8 +4614,8 @@ const stopPullDownRefresh = function ({ success, fail, complete } = {}) {
4608
4614
  const handle = new MethodHandler({ name: 'stopPullDownRefresh', success, fail, complete });
4609
4615
  return new Promise((resolve, reject) => {
4610
4616
  Taro__default["default"].eventCenter.trigger('__taroStopPullDownRefresh', {
4611
- successHandler: (res = {}) => handle.success(res, resolve),
4612
- errorHandler: (res = {}) => handle.fail(res, reject)
4617
+ successHandler: (res = {}) => handle.success(res, { resolve, reject }),
4618
+ errorHandler: (res = {}) => handle.fail(res, { resolve, reject })
4613
4619
  });
4614
4620
  });
4615
4621
  };
@@ -4628,7 +4634,7 @@ const pageScrollTo = ({ scrollTop, selector = '', offsetTop = 0, duration = 300,
4628
4634
  if (scrollTop === undefined && !selector) {
4629
4635
  return handle.fail({
4630
4636
  errMsg: 'scrollTop" 或 "selector" 需要其之一'
4631
- }, reject);
4637
+ }, { resolve, reject });
4632
4638
  }
4633
4639
  const id = (_b = (_a = runtime.Current.page) === null || _a === void 0 ? void 0 : _a.path) === null || _b === void 0 ? void 0 : _b.replace(/([^a-z0-9\u00a0-\uffff_-])/ig, '\\$1');
4634
4640
  const el = (id
@@ -4682,7 +4688,7 @@ const pageScrollTo = ({ scrollTop, selector = '', offsetTop = 0, duration = 300,
4682
4688
  }, FRAME_DURATION);
4683
4689
  }
4684
4690
  else {
4685
- return handle.success({}, resolve);
4691
+ return handle.success({}, { resolve, reject });
4686
4692
  }
4687
4693
  };
4688
4694
  scroll();
@@ -4690,7 +4696,7 @@ const pageScrollTo = ({ scrollTop, selector = '', offsetTop = 0, duration = 300,
4690
4696
  catch (e) {
4691
4697
  return handle.fail({
4692
4698
  errMsg: e.message
4693
- }, reject);
4699
+ }, { resolve, reject });
4694
4700
  }
4695
4701
  });
4696
4702
  };
@@ -4727,8 +4733,8 @@ const showTabBarRedDot = (options) => {
4727
4733
  return new Promise((resolve, reject) => {
4728
4734
  Taro__default["default"].eventCenter.trigger('__taroShowTabBarRedDotHandler', {
4729
4735
  index,
4730
- successHandler: (res = {}) => handle.success(res, resolve),
4731
- errorHandler: (res = {}) => handle.fail(res, reject)
4736
+ successHandler: (res = {}) => handle.success(res, { resolve, reject }),
4737
+ errorHandler: (res = {}) => handle.fail(res, { resolve, reject })
4732
4738
  });
4733
4739
  });
4734
4740
  };
@@ -4757,8 +4763,8 @@ const showTabBar = (options = {}) => {
4757
4763
  return new Promise((resolve, reject) => {
4758
4764
  Taro__default["default"].eventCenter.trigger('__taroShowTabBar', {
4759
4765
  animation,
4760
- successHandler: (res = {}) => handle.success(res, resolve),
4761
- errorHandler: (res = {}) => handle.fail(res, reject)
4766
+ successHandler: (res = {}) => handle.success(res, { resolve, reject }),
4767
+ errorHandler: (res = {}) => handle.fail(res, { resolve, reject })
4762
4768
  });
4763
4769
  });
4764
4770
  };
@@ -4809,8 +4815,8 @@ const setTabBarStyle = (options = {}) => {
4809
4815
  selectedColor,
4810
4816
  backgroundColor,
4811
4817
  borderStyle,
4812
- successHandler: (res = {}) => handle.success(res, resolve),
4813
- errorHandler: (res = {}) => handle.fail(res, reject)
4818
+ successHandler: (res = {}) => handle.success(res, { resolve, reject }),
4819
+ errorHandler: (res = {}) => handle.fail(res, { resolve, reject })
4814
4820
  });
4815
4821
  });
4816
4822
  };
@@ -4842,8 +4848,8 @@ const setTabBarItem = (options) => {
4842
4848
  text,
4843
4849
  iconPath,
4844
4850
  selectedIconPath,
4845
- successHandler: (res = {}) => handle.success(res, resolve),
4846
- errorHandler: (res = {}) => handle.fail(res, reject)
4851
+ successHandler: (res = {}) => handle.success(res, { resolve, reject }),
4852
+ errorHandler: (res = {}) => handle.fail(res, { resolve, reject })
4847
4853
  });
4848
4854
  });
4849
4855
  };
@@ -4882,8 +4888,8 @@ const setTabBarBadge = (options) => {
4882
4888
  Taro__default["default"].eventCenter.trigger('__taroSetTabBarBadge', {
4883
4889
  index,
4884
4890
  text,
4885
- successHandler: (res = {}) => handle.success(res, resolve),
4886
- errorHandler: (res = {}) => handle.fail(res, reject)
4891
+ successHandler: (res = {}) => handle.success(res, { resolve, reject }),
4892
+ errorHandler: (res = {}) => handle.fail(res, { resolve, reject })
4887
4893
  });
4888
4894
  });
4889
4895
  };
@@ -4912,8 +4918,8 @@ const removeTabBarBadge = (options) => {
4912
4918
  return new Promise((resolve, reject) => {
4913
4919
  Taro__default["default"].eventCenter.trigger('__taroRemoveTabBarBadge', {
4914
4920
  index,
4915
- successHandler: (res = {}) => handle.success(res, resolve),
4916
- errorHandler: (res = {}) => handle.fail(res, reject)
4921
+ successHandler: (res = {}) => handle.success(res, { resolve, reject }),
4922
+ errorHandler: (res = {}) => handle.fail(res, { resolve, reject })
4917
4923
  });
4918
4924
  });
4919
4925
  };
@@ -4942,8 +4948,8 @@ const hideTabBarRedDot = (options) => {
4942
4948
  return new Promise((resolve, reject) => {
4943
4949
  Taro__default["default"].eventCenter.trigger('__taroHideTabBarRedDotHandler', {
4944
4950
  index,
4945
- successHandler: (res = {}) => handle.success(res, resolve),
4946
- errorHandler: (res = {}) => handle.fail(res, reject)
4951
+ successHandler: (res = {}) => handle.success(res, { resolve, reject }),
4952
+ errorHandler: (res = {}) => handle.fail(res, { resolve, reject })
4947
4953
  });
4948
4954
  });
4949
4955
  };
@@ -4972,8 +4978,8 @@ const hideTabBar = (options = {}) => {
4972
4978
  return new Promise((resolve, reject) => {
4973
4979
  Taro__default["default"].eventCenter.trigger('__taroHideTabBar', {
4974
4980
  animation,
4975
- successHandler: (res = {}) => handle.success(res, resolve),
4976
- errorHandler: (res = {}) => handle.fail(res, reject)
4981
+ successHandler: (res = {}) => handle.success(res, { resolve, reject }),
4982
+ errorHandler: (res = {}) => handle.fail(res, { resolve, reject })
4977
4983
  });
4978
4984
  });
4979
4985
  };
@@ -5133,7 +5139,7 @@ function generateMediaQueryStr(descriptor) {
5133
5139
  class MediaQueryObserver {
5134
5140
  // 监听页面媒体查询变化情况
5135
5141
  observe(descriptor, callback) {
5136
- if (isFunction(callback)) {
5142
+ if (shared.isFunction(callback)) {
5137
5143
  // 创建媒体查询对象
5138
5144
  this._mediaQueryObserver = window.matchMedia(generateMediaQueryStr(descriptor));
5139
5145
  // 监听器
@@ -5141,7 +5147,7 @@ class MediaQueryObserver {
5141
5147
  callback({ matches: ev.matches });
5142
5148
  };
5143
5149
  callback({ matches: this._mediaQueryObserver.matches });
5144
- // 兼容旧浏览器中MediaQueryList尚未继承于EventTarget导致不存在'addEventListener'
5150
+ // 兼容旧浏览器中 MediaQueryList 尚未继承于 EventTarget 导致不存在 'addEventListener'
5145
5151
  if ('addEventListener' in this._mediaQueryObserver) {
5146
5152
  this._mediaQueryObserver.addEventListener('change', this._listener);
5147
5153
  }
@@ -5153,7 +5159,7 @@ class MediaQueryObserver {
5153
5159
  // 停止监听,销毁媒体查询对象
5154
5160
  disconnect() {
5155
5161
  if (this._mediaQueryObserver && this._listener) {
5156
- // 兼容旧浏览器中MediaQueryList尚未继承于EventTarget导致不存在'removeEventListener'
5162
+ // 兼容旧浏览器中 MediaQueryList 尚未继承于 EventTarget 导致不存在 'removeEventListener'
5157
5163
  if ('removeEventListener' in this._mediaQueryObserver) {
5158
5164
  this._mediaQueryObserver.removeEventListener('change', this._listener);
5159
5165
  }
@@ -5389,9 +5395,9 @@ class SelectorQuery {
5389
5395
  const _queueCb = this._queueCb;
5390
5396
  res.forEach((item, index) => {
5391
5397
  const cb = _queueCb[index];
5392
- typeof cb === 'function' && cb.call(this, item);
5398
+ shared.isFunction(cb) && cb.call(this, item);
5393
5399
  });
5394
- typeof cb === 'function' && cb.call(this, res);
5400
+ shared.isFunction(cb) && cb.call(this, res);
5395
5401
  });
5396
5402
  return this;
5397
5403
  }
@@ -5444,7 +5450,7 @@ const requirePlugin = permanentlyNotSupport('requirePlugin');
5444
5450
  const pxTransform = function (size) {
5445
5451
  const options = taro.config;
5446
5452
  const baseFontSize = options.baseFontSize || 20;
5447
- const designWidth = ((input = 0) => typeof options.designWidth === 'function'
5453
+ const designWidth = ((input = 0) => shared.isFunction(options.designWidth)
5448
5454
  ? options.designWidth(input)
5449
5455
  : options.designWidth);
5450
5456
  const rootValue = (input = 0) => baseFontSize / options.deviceRatio[designWidth(input)] * 2;