Dojo和RequireJS:Error:defineAlreadyDefined(…)在站点上同时使用这两种方法时
Dojo and RequireJS : Error: defineAlreadyDefined(…) when using both on a site
我试图创建一个自定义的可嵌入小部件,我的用户可以将其包含在他们的网站上。
我们提供代码,然后将其添加到他们的网站,然后他们可以访问我们从SaaS中生成的一堆自定义小部件。
如果他们试图嵌入小部件的网站还没有使用requirejs,这会很好,然而,当它已经使用requirejs时,我们会得到可怕的。。。
控制台中出现Error: defineAlreadyDefined(…)
错误。
我们正在做的事情如下:
我们为他们提供的代码
他们会有指示在他们的网站上添加这样的东西:
var foobar_load = function(){
require([
"foobar/rental!53891",
"widget/PriceAvailabilityCalculator" ,
"foobar/widget!/property/53891",
], function( Bridge, PriceAvailabilityCalculator, Availability){
new PriceAvailabilityCalculator({}).place("widget-container-1");
Availability.place("widget-container-2");
});
};
(function() {
var d = document,
h = d.getElementsByTagName('head')[0],
s = d.createElement('script');
s.type = 'text/javascript';
s.async = true;
s.src = 'https://www.example.com/v1/sdk.js';
h.appendChild(s);
} )();
</script>
然后,这将加载我们的"sdk"代码,它只是一般引导过程的包装器,您需要这样做才能在站点上包含dojo。
装载机代码
看起来是这样的:
dojoConfig = {
async: true,
parseOnLoad: false,
locale: 'en-gb',
selectorEngine: 'css3',
paths: {
't' : '//dev.foobar.com/utils/i18n',
'my' : '//dev.foobar.com/js/custom/my',
'foobar' : '//dev.foobar.com/js/sdk',
'widget' : '//dev.foobar.com/js/custom/my/frontend'
},
packages: [
{ name: 'currency', location: '//dev.foobar.com/currency' },
{ name: 'x-application', location: '//dev.foobar.com/x-application' }
]
};
(function() {
var d = document,
h = d.getElementsByTagName('head')[0],
s = d.createElement('script');
s.type = 'text/javascript';
s.async = true;
// If foobar_load is missing.. what should happen?
s.onload= function(){
require(["dojo/ready", "dojo/domReady!", 'x-application'],
function(ready, x,r){
ready(0, foobar_load );
});
};
s.src = '//dev.foobar.com/js/dojo/1_9_7/dojo/dojo.js?load';
h.appendChild(s);
} )();
现在,我不确定我们需要做什么来确保我们可以在同样使用RequireJS的网站上使用这个自定义代码。
在#dojo IRC上玩了一番并得到了一些建议之后,这就是我正在使用的解决方案。
这不是一个很干净的解决方案,但它有效如果你有更清洁的解决方案,请一定发表你的想法。我把这个留在这里是为了帮助其他有同样问题的人。
这个想法是切换出require
和define
函数,然后在dojo.js完成加载后将它们切换回来。(一个更干净的解决方案是根本不加载dojo.js)。
它看起来像这样:
第一
if(typeof define !== "undefined" && typeof require !== "undefined"){
window.__define = window.define;
window.__require = window.require;
window.define = undefined;
window.require = undefined;
}
然后在加载dojo.js之后
if( typeof window.__define !== "undefined" ) {
window.define = window.__define;
window.require = window.__require;
window.__define = undefined;
window.__require = undefined;
}
相关文章:
- 这两种不同的创建对象文字的方法有什么区别
- 这两种方法有什么不同
- 这两种使用 jQuery 追加 DOM 元素的方法有什么不同
- 通过两种方法创建和更新 CSS
- 使用两种不同的方法调用方法
- 声明Javascript名称空间的两种方法之间的区别
- Dojo和RequireJS:Error:defineAlreadyDefined(…)在站点上同时使用这两种方法时
- 处理jQuery提交表单的两种方法
- 什么'这两种对象构造方法之间的区别是什么
- 为什么这两种编写jQuery插件的方法是等价的
- 通过两种不同的方法将数据从HTML发送到Servlet
- 在敲除js中,这两种编码方法有什么区别
- 为什么在Javascript中创建函数有两种不同的方法
- 有没有办法改变两种分配方法的优先级
- 这两种创建元素的方法有什么区别
- 定义 ES6 React 组件的两种方法
- 在承诺链中调用两种方法
- 您将如何使用这两种概念上不同的方法来编写javaScript对象
- 这两种方法在javascript类中定义方法的区别
- 比较两种回退机制加载本地jQuery库的方法