Requirejs 在浏览器中使用aws-sdk.js和require.js

Requirejs 在浏览器中使用aws-sdk.js和require.js,requirejs,aws-sdk,Requirejs,Aws Sdk,我试图弄清楚在构建web应用程序时如何将基于浏览器的aws-sdk.js与require.js结合使用 如果我尝试构建一个类并在require.js定义中包含aws sdk,那么一旦我尝试创建一个实例并引用aws类,它就会说它是未定义的 例如,我有一个函数,它检查凭证是否是AWS.credentials的实例,如果不是,它将尝试使用通过Rest检索的STS令牌对其进行初始化。 问题是,如果(this.credentials instanceof AWS.credentials)表明AWS未定义,

我试图弄清楚在构建web应用程序时如何将基于浏览器的aws-sdk.js与require.js结合使用

如果我尝试构建一个类并在require.js定义中包含aws sdk,那么一旦我尝试创建一个实例并引用aws类,它就会说它是未定义的

例如,我有一个函数,它检查凭证是否是AWS.credentials的实例,如果不是,它将尝试使用通过Rest检索的STS令牌对其进行初始化。 问题是,如果(this.credentials instanceof AWS.credentials)表明AWS未定义,则代码将在if(this.credentials instanceof AWS.credentials)上消失。它甚至会在我简单的需求检查后消失

这就是我的define看起来的样子-我将包括'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类时,我可以在调试器的命名空间中看到AWS类,但它不在函数调用的命名空间中),但在请求时添加:

requirejs.config({
    baseUrl: '/js',
    paths: {
        lib: 'lib',
        ImageUploader: 'ImageUploader'
    }
});

我决定再次尝试玩这个游戏,似乎已经弄明白了我是怎么做的。我还没有将它集成到我现有的代码设置中,但我认为我有一个可行的解决方案

我做错的事情是,我试图设置AWS类,以便将其作为模块加载(因此,我尝试按照require.js建议的方式包装它)

这次玩的时候,我注意到了一些以前没有的东西。我有一个在局部范围内未定义的AWS,还有一个在全局范围内持有类定义的AWS。因此,它试图在创建本地“null”版本的定义中指定AWS:

define(
    ["jquery","aws-sdk","dropzone","app/MyUtilities"],
    function ($, AWS, Dropzone, MyUtilities) {
        "use strict";
        function MyClass() {};
        return MyClass;
    }
);
jquery和dropzone拥有确保以这种方式加载所需的一切,但aws sdk似乎自己进行了一些异步加载。因此,函数中的范围变量未定义。 从技术上讲,似乎我唯一需要在函数包装器中定义为模块的是我自己的实用程序模块。因此,将其切换到:

define(
    ["app/MyUtilities","jquery","aws-sdk","dropzone"],
    function (MyUtilities) {
        "use strict";
        function MyClass() {};
        return MyClass;
    }
);

。。。看起来,$和jquery是根据需要定义的,Dropzone是根据需要定义的,AWS是根据需要定义的。(在访问静态AWS.config或AWS.Credentials定义时,我没有像以前那样收到错误)

您能给您显示配置文件路径吗?刚刚检查过,似乎
AWS sdk
是一个NodeJS代码,所以您应该遵循以下指南:有一个node.js版本和一个特定于浏览器的版本。但肯定有一些奇怪的事情在那里发生-代码是半最小化的,所以很难检查。如果我使用typeof('AWS')删除console.log(),我可以在调用实例init之前看到AWS的'object',但是在类方法中得到'undefined',但是'$'在两个位置都是type函数。我甚至尝试手动加载aws sdk,并在typeof(aws)之前设置超时在启动onLoad初始化之前未定义。如果我尝试将缩小的aws-sdk.js浏览器代码包装在“define(function(require,exports,module){/*code*/};”中,那就没有运气了正如在该链接上的手动转换中所建议的,我在“if instanceof”之前得到了typeof AWS对象,但在instanceof上出现了错误,因为凭证不是AWS对象的属性,因此“instanceof”的右侧不是对象。在该点上它只是一个没有属性的原型对象