Asynchronous 允许用户在加载后使用已编译的RequireJS小部件
我正在使用RequireJS编写一个JS小部件。完成小部件后,我将使用r.js和Almond编译它。一切进展顺利——但我无法找到一种简单的方法让用户在不使用RequireJS的情况下使用小部件——因为小部件代码加载异步(RequireJS使用AMD) 我现在正在忙着等待小部件代码加载,并在检测到它已加载后才使用它。这对用户不是很友好 有没有办法让我们就这样做Asynchronous 允许用户在加载后使用已编译的RequireJS小部件,asynchronous,requirejs,javascript,Asynchronous,Requirejs,Javascript,我正在使用RequireJS编写一个JS小部件。完成小部件后,我将使用r.js和Almond编译它。一切进展顺利——但我无法找到一种简单的方法让用户在不使用RequireJS的情况下使用小部件——因为小部件代码加载异步(RequireJS使用AMD) 我现在正在忙着等待小部件代码加载,并在检测到它已加载后才使用它。这对用户不是很友好 有没有办法让我们就这样做 var widget = new Widget(); 而不是像这样忙着等待: count = 0; function loadWidg
var widget = new Widget();
而不是像这样忙着等待:
count = 0;
function loadWidget() {
if (typeof Widget != 'undefined') {
var p1 = new Widget();
p1.render();
} else {
if (count > 10) {
console.log('Failed to load the Widget');
return false;
}
setTimeout(loadWidget, 50);
count++;
}
}
$(document).ready(function() {
loadWidget();
});
谢谢
编辑:
我的build.js
({
name: './lib/almond.js',
out: './deploy/sdk.min.js',
baseUrl: '.',
optimize: 'uglify2',
mainConfigFile: 'sdk.js',
include: ['sdk'],
wrap: true
})
网页上的代码(假定网页上没有其他脚本标记):
不确定在编译js时是否真的需要“data main”。您需要遵循随附的说明。为了总结文档中的要点,您需要在构建配置中使用以下配置:
wrap: {
startFile: 'path/to/start.frag',
endFile: 'path/to/end.frag'
}
并且start.frag
应该是:
(function (root, factory) {
if (typeof define === 'function' && define.amd) {
define([], factory);
} else {
root.Widget = factory();
}
}(this, function () {
和end.frag
:
return require('main');
}));
结束片段调用需要以同步形式进行,在这种情况下,它是真正的同步的(而不是requirejs本身可以使用的伪同步糖)
我以前试过这个。它起作用了。hm。。为什么不使用标准的requirejs工作流-将小部件定义为AMD模块,包括页面上的主require文件和内部的require小部件?我不想让用户使用RequireJS-因此我将小部件编译成一个JS文件供使用。你的评论让问题变得更奇怪)在你提到的问题的标题中,你想让用户使用RequireJS,在问题正文中,您还提到您使用RequireJS开发了小部件,并在相反的评论文本中提到了。。请在您的问题中添加一些详细信息或重新措辞谢谢-我更改了标题以使其更清楚。请向我们展示您传递到r.js
的构建配置,以及您如何在网页中加载您的小部件。谢谢@Louis-我已成功编译了此内容,但在任何地方都找不到“小部件”-您将如何使用它?(您将如何执行“var p=new Widget()”?如果在root.Widget=factory()
上设置断点,则Widget似乎不可用调试器是否停止在那里?是的:/在删除uglify2优化后,行运行,但root.Widget获得“未定义”值main
模块如何导出Widget
?
return require('main');
}));