RequireJS:如何从多个域加载js?

时间:2015-09-21 02:41:53

标签: requirejs

我在两个域下有脚本:

main.mydomain.com
- /scripts/
    - entry.js
    - userManager.js


user.mydomain.com
- /scripts/
    - user.js
    - admin/
        - superUser.js

entry.js:

requirejs.config({
    baseUrl: '/scripts/',
    paths: {
        'userManager': 'userManager.js',
        'user': 'http://user.mydomain.com/scripts/user'
    },
    deps: ['userManager']
});

当我在一个域下部署它们时,一切正常。但是当它们位于这两个域之下时,不会加载/admin/superUser.js.

我看到的原因是:浏览器尝试从/admin/superUser.js加载main.mydomain.com,但js应该从user.mydomain.com加载。

user.js如下所示

define(['./admin/superUser'], function(superUser) {
 ....
})

如何配置requirejs以从第二个域加载文件?

1 个答案:

答案 0 :(得分:2)

它不会像你那样工作,因为依赖关系中的相对路径是相对于模块名称解释的,而不是模块路径

您将 $http({ method: 'POST', url: url, data: data, responseType: 'arraybuffer' }).success(function (response, status, headers, config) { var blob = new Blob([response], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }); var filename = headers('Content-Disposition').split('filename=')[1]; var config = { data: blob, filename: filename, }; FileSaver.saveAs(config); }) 加载为http://user.mydomain.com/scripts/user.js。因此,当RequireJS解释user时,它会占用模块名称./admin/superUser的目录部分,该目录部分为空并向其添加user,因此您将获得模块名称admin/superUser,这是未在admin/superUser中定义,因此RequireJS通过向其添加paths并在结尾添加baseUrl来构建路径。

这样做的一种方法是访问模块名称空间目录下.js的模块层次结构,这样你就可以把它放在路径而不是中。您现在http://user.mydomain.com/scripts的路径:

user

然后将模块'userlib': 'http://user.mydomain.com/scripts' 的请求替换为user的请求。因此,现在将在模块名称userlib/user下访问user.js。当此模块请求userlib/user时,模块名称的目录部分为./admin/superUser,请求的最终模块名称为userlib。整个模块名称未在userlib/admin/superUser中定义,但前缀paths已定义,因此RequireJS使用前缀构建最终URL userlib