2017-08-25 64 views
0

我正在使用RequireJS加载一些模块。RequireJS:相对于数据主文件加载模块

我正在使用镜像CDN提供静态资产。问题是,模块相对加载到网站域名,而不是数据,主文件,使模块加载这样:

my-website.com/ 
↳ cdn.com/assets/js/require-main.min.js 
    ↳ my-website.com/assets/js/helper-module.js 
    ↳ my-website.com/assets/js/utility-module.js 

有没有一种办法相对加载模块的数据,主文件,以便为使用CDN的模块提供服务?

my-website.com/ 
↳ cdn.com/assets/js/require-main.min.js 
    ↳ cdn.com/assets/js/helper-module.js 
    ↳ cdn.com/assets/js/utility-module.js 

我不能硬编码的CDN域中的任何位置,因为它并不总是相同的。


这是require-main.js

requirejs.config({ 
    baseUrl: "../js/", 
    waitSeconds: 15, 
    paths: { 
     helper: "helper-module", 
     ... 
    } 
}); 

的样本,这是rjs.optimize功能I中缩小的全部资产,并结合一些模块

rjs.optimize({ 
    appDir: './assets/js/', 
    baseUrl: ".", 
    mainConfigFile: './assets/js/require-main.js', 
    dir: './public/assets/js/', 
    preserveLicenseComments: true, 
    optimize: 'uglify2', 
    findNestedDependencies: true, 
    logLevel: 0, 
    uglify2: { 
     mangle: false 
    }, 
    modules: [ 
     { 
      name: 'require-main' 
      ... 
     } 
    ], 
    removeCombined: true, 
    writeBuildTxt: false 
}); 
+0

你的构建是否应该将所有**模块合并到一个包中?如果是,那么问题不在于CDN,而在于RequireJS需要在包之外获取文件。 – Louis

+0

@Louis我编辑了我的问题:一些核心模块被组合,但我仍然需要一些未捆绑的额外模块。 – webpn

回答

0

在制作(当你使用CDN服务的愿望),提供baseUrl作为CDN域域。 requirejs优化器将配置实例输出到appDir。如果您正在从CDN加载文件,则可能必须将baseUrl值更改为CDN URL。

require.config({ 
    baseUrl : "https://yourcdn.com", 
    paths : { 
     module1: 'path/to/module1', 
     module2: 'path/to/module2' 
    }, 
    bundles: { 
    bundle1 : ['moduleA', 'moduleB'] 
    } 
}) 

要知道,如果你的模块依赖于第三方AMD模块 http://requirejs.org/docs/optimization.html#empty

阅读本太,因为它似乎使用的是包,使用bundlesConfigOutFile属性捆绑配置写入文件,所以你不需要手动编写配置。 For more:https://github.com/requirejs/r.js/blob/master/build/example.build.js

您可以更改r.js回调中的baseUrl值。

+0

我想过在baseUrl中包含CDN域,但是我不能对CDN域进行硬编码,因为我将不得不使用许多cdn提供程序,并使用不同的域,这些域会频繁更改。 – webpn

+0

有一个包含CDN域名列表的json文件。您可以使用正则表达式在rjs优化回调中根据域名生成输出。 –

相关问题