有没有办法在requirejs中动态设置baseurl?

时间:2013-04-10 08:16:55

标签: javascript zend-framework2 requirejs

我正在Pi-engine(一个基于zend框架2的php应用程序引擎)上构建一个应用程序。

在我的应用程序中,javascript文件路径取决于应用程序名称,而应用程序名称则是 由安装人员挑选。

例如,require.js的网址为:

http://my.site.name/asset/module-{module_name}/script/js/require.js

module_name根据应用程序的名称进行更改。

我知道我可以将路径放在后端的'data-main'属性中,如:

<script data-main="/asset/module-{module_name}/script/" src="/asset/module-{module_name}/script/js/require.js"></script>

但是我想知道有没有办法使用javascript动态设置baseurl,这样我就不需要触摸后端了。

4 个答案:

答案 0 :(得分:10)

http://requirejs.org/docs/api.html#config

此外,您可以在加载require.js之前将配置对象定义为全局变量require,并自动应用值。此示例指定在require.js定义require():

时立即加载的一些依赖项
<script>
    var require = {
        baseUrl: generateBaseUrl()
    };
</script>
<script src="scripts/require.js"></script>

答案 1 :(得分:0)

如果我正确理解了您的问题,您可以在配置对象中使用'baseUrl',您可以在其中设置找到js文件的路径。

require.config({
   baseUrl: "/js/"
});

答案 2 :(得分:0)

感谢您的回答,我刚刚在页面上找到了使用javascript的解决方案:how to get the absolute path of the current javascript file name

var scripts = document.getElementsByTagName("script");

require.config({
    baseUrl: '/asset' + scripts[scripts.length-1].src.match(/\/module.*?\//)[0] + 'script/',
}); 

看起来很奇怪,但确实有效。

答案 3 :(得分:0)

为了避免污染全局范围,您可以像在您的情况下一样在即时执行的函数中包装动态配置代码:

require.config((function(){
    var scripts = document.getElementsByTagName("script");
    return {
        baseUrl: '/asset' + scripts[scripts.length-1].src.match(/\/module.*?\//)[0]
    };
})());