- # 问题
- # 分析
调试出错点:
~~~~
(function(global) {
'use strict';
// existing version for noConflict()
var _Base64 = global.Base64; // 这句出错了...变量global的值是传入的this指针值,this指针为空了.
var version = "2.1.9";
// if node.js, we use Buffer
var buffer;
~~~~
调试了一下,主要现象
base64.js 代码里面假定了this指定非空。微信小程序require调入进来后,this指针为空,就会抛出异常。
- # 处理
知道这个修改就较容易了:
两处改动:
一 避免global为空指针
~~~~
代码头部几行
(function(global) {
'use strict';
// existing version for noConflict()
var _Base64 = global.Base64;
var version = "2.1.9";
~~~
添加两行改为
~~~
(function(global) {
'use strict';
// existing version for noConflict()
var _Base64 = global.Base64;
var version = "2.1.9";
if (!global)
global = {}
~~~
二 添加module.exports
~~~
文件尾部几行
}
// that's it!
if (global['Meteor']) {
Base64 = global.Base64; // for normal export in Meteor.js
}
})(this);
~~~
添加一行
~~~
}
// that's it!
if (global['Meteor']) {
Base64 = global.Base64; // for normal export in Meteor.js
}
module.exports = global.Base64;
})(this);
~~~
然后在微信小程序里面调用测试:
~~~
var base64 = require("../../utils/base64.js");
...
var srcstr = '不要问我从哪里来';
var base64str = base64.encode(srcstr);
console.log(base64str);
输出: 5LiN6KaB6Zeu5oiR5LuO5ZOq6YeM5p2l
~~~
- # 总结
1,因为目前微信小程序require机制,,并不容易自定义一个require函数去代替(内存中模块列表对象在闭包之中,不易访问),所以通常做法是修改被加载的js模块。
2,被微信小程序require初始化时,this指针为空,处理避开这类访问。
3,js模块中,尽可能按module.exports = ... 方式导出对象.