最近我们覆写了原生Promise做了一些处理,如果在小程序不引入plugin的情况下,Promise正常被覆写,功能也正常。但是不论在主包和子包内,只要引入任意plugin(甚至不使用),Promise则会被覆写失败,这种情况在真机和开发者工具都能稳定复现。请问使用插件前后的编译模式有什么区别?
代码片段:
https://developers.weixin.qq.com/s/dX02rtmB76Iz
复现步骤:
1.新建utils/sdk.js,插入如下代码:
Promise = class extends Promise {}
module.exports = {
Promise
}
2.在app.js中仅引入
const { sdk } = require('./utils/sdk');
3.在app.json中引入插件
{
...
"plugins": {
"routePlan": {
"version": "1.0.19",
"provider": "wx50b5593e81dd937a"
}
}
}
5.在pages/index.js中增加data
Page({
data: {
promise: Promise.toString()
}
})
6.在pages/index.wxml中增加如下代码,打印在页面上方便显示
<view>{{promise}}</view>
7.查看结果
// 页面显示该结果
function Promise() {[native code]}
// 预期结果
function _class() {_classCallCheck2(this,_class);return _super.apply(this,arguments);}
注意事项:
- 在app.json删除plugin的时候需要手动清除下缓存
- 开发者工具要关闭“启用独立域进行调试”,该选项打开则不会被复现,但根据官方文档,该选项不影响真机
为了保证插件和小程序之间相互的数据安全,使用插件时不能修改两者共享的全局对象或者方法;因为其中一方可能通过劫持全局对象或者方法来获取另一方的业务数据或者介入另一方的逻辑处理