我试图弄清楚如何在构建 Web 应用程序时将基于浏览器的 aws-sdk.js 与 require.js 一起使用。
如果我尝试构建一个类并在 require.js 定义中包含 aws-sdk,一旦我尝试创建一个实例并引用 AWS 类,它就会说它是未定义的。
例如,我有一个函数可以检查凭证是否是 AWS.Credentials 的实例,如果不是,它会尝试使用通过 Rest 检索到的 STS 令牌对其进行初始化。问题是,代码在 if(this.credentials instanceof AWS.Credentials) 上死掉了,说 AWS 是未定义的。它甚至死于我对需求刷新的简单检查。
这就是我的定义的样子——我将包含“needsRefresh”包装器,作为引发未定义错误的例子:
define(['require','aws-sdk','jquery'],
function (require, AWS, $) {
// Aws helper class
function AwsHelper() { };
AwsHelper.prototype = {
credentials: null,
tokenNeedsRefresh: function () {
//////////////////////////////////////////////////////////////////
// errors out on the following line with: //
// TypeError: Cannot read property 'Credentials' of undefined //
//////////////////////////////////////////////////////////////////
if(this.credentials instanceof AWS.Credentials) {
return this.credentials.needsRefresh();
} else return true;
}
};
return AwsHelper;
}
);
我还在文件顶部尝试了以下格式:
define(function (require) {
var AWS = require("aws-sdk"),
$ = require("jquery");
/* .. */
如果我删除所有对正在运行的刷新代码的 onLoad 引用,它将加载并且我可以创建一个实例。但只要我调用任何引用 AWS 类的函数,它就会死掉。
生成实例后,如何确保 AWS 类定义仍在全局空间中?
不知道路径会有什么不同(它可以很好地查找和加载代码 - 我可以在调试器的命名空间中看到 AWS 类,因为它正在加载,但它不在函数调用的命名空间中),但根据请求添加:
requirejs.config({
baseUrl: '/js',
paths: {
lib: 'lib',
ImageUploader: 'ImageUploader'
}
});