Javascript 如何使用curl.js加载对象?
我从这里获得了一些AMD/CommonJS适配器代码: 我希望使用该代码使我的所有代码与AMD/CommonJS兼容。我希望能够做到的是:Javascript 如何使用curl.js加载对象?,javascript,module,requirejs,amd,curl.js,Javascript,Module,Requirejs,Amd,Curl.js,我从这里获得了一些AMD/CommonJS适配器代码: 我希望使用该代码使我的所有代码与AMD/CommonJS兼容。我希望能够做到的是: greeter = curl(['modXyz']); greeter.sayHi("Gracie"); 但是curl返回的对象不是我期望的对象。我能得到的最接近的结果是: curl(['modXyz'], function(mod) { window.greeter = mod; }); greeter.sayHi("Gracie"); 这似乎
greeter = curl(['modXyz']);
greeter.sayHi("Gracie");
但是curl
返回的对象不是我期望的对象。我能得到的最接近的结果是:
curl(['modXyz'], function(mod) { window.greeter = mod; });
greeter.sayHi("Gracie");
这似乎违背了AMD的目的。curl能做这样的事情吗?我必须使用它来实现它吗 curl函数是异步的,并返回一个承诺。因此,您只能通过传递给curl的回调或传递给当时的回调(在承诺实现后调用)来获得结果
curl(['dep1', 'dep2', 'dep3' /* etc */], callback);
或
CurlJS和RequireJS都支持AMD和CommonJS需要调用模式:
require(['name'], callbackFunction)
CJS和AMD之间的区别在于使用数组作为依赖项列表的包装器。还请注意,在CurlJS的配置中,您可以将curl
别名为require
,以使代码与AMD规范完全兼容。请注意:
CJS需要呼叫模式:
var a = require('name')
var promise = require(['name'])
promise.then(callbackFunction)
仅需要调用模式:
var a = require('name')
var promise = require(['name'])
promise.then(callbackFunction)
这通常可以缩短为:
require(['name']).then(callbackFunction)
注意,CurlJS返回Promise对象不是AMD规范的一部分。AMD规范似乎没有规定AMD样式require调用的返回值
RequireJS和CurlJS都支持标准AMD要求调用模式:
require(['name'], callbackFunction)
再次,请注意使用数组作为标志,这是AMD风格的要求。这会触发不同的返回值逻辑
要使您的东西按您的意愿工作,在CurlJS上,您的代码必须位于一个模块内,该模块被包装为一个CommonJS模块,请使用:
define(function(require) { ... });
我被告知,在这种情况下,require
的行为类似于CommonJS stylerequire
-sync。实际上,在幕后发生的事情是加载程序扫描工厂函数,查找您需要的内容,并将其折叠到该定义的需求列表中。然后,在工厂内部,您可以执行以下操作:
var greeter = require('modXyz');
greeter.sayHi("Gracie");
请注意,“同步”行为仍然是一种错觉,因为实际发生的情况是检测到的所需资源已预加载
在RequireJS上,即使是全局的require
也可以称为CJS样式:var resource=require('resource/path')
,但只有在您之前已经加载它之后才可以
换句话说,在工厂函数运行之前,CurlJS和RequireJS中的加载总是异步进行的,但在RequireJS中,您几乎可以在任何地方使用它,而在CurlJS中,这是一个非常小的场景。因为浏览器远离其资源,所以它必须在获取这些资源时阻塞主线程,或者必须异步获取它们。因为我们不应该阻止主线程(有效地使浏览器无响应),所以我们必须异步获取资源。(这与任何AMD加载程序、RequireJS、dojo等都是一样的。) 因此,像下面这样的事情是行不通的:
var foo = require('lib/foo');
好吧,它不能在浏览器中通常使用的全局ish空间中工作。但是,它可以在受控环境中工作,例如在AMD模块中
步骤1:在模块内部编写代码。
<script src="lib/curl/src/curl.js"><script>
<script src="myapp/run.js"><script>
步骤2:编写引导模块以启动应用程序。
<script src="lib/curl/src/curl.js"><script>
<script src="myapp/run.js"><script>
“myapp/main”可能看起来像这样:
define(function (require) {
var view1 = require('myapp/view1/controller');
view1.render();
view1.placeAt('body');
});
主模块(或任何AMD模块)内部,则require
的行为更像我认为您所期望的。请注意,这是一个特殊的AMD签名。您不能在define
中指定依赖项,也不能期望require
的行为像这样。您只能以一种方式指定依赖项。这将不起作用:
define(['myapp/view1'], function (view1) {
var foo = require('foo');
});
希望这有帮助
--JohnHmm,这似乎与require的实现方式有点不同。如果我想在回调之外使用结果对象,是否必须将其附加到窗口?我尝试在回调中返回结果,但没有效果。这与require无关,但与curl.js的实现方式有关。您最好使用同步varian例如jQuery.ajax的async设置为false。这让我更加困惑。require.js似乎不是同步的。require.js只加载代码。一旦加载了代码并且您可以执行它,require.js就不再涉及了。然后,问题只在于如何使用curl。完全不相关的.curl.js和RequireJS都有glo异步BAL。一旦您进入AMD包装的CJS模块或已列出其依赖项的经典AMD模块,本地
require
变量就可以用于同步。(注意“全局”和“本地”之间的差异。)非常彻底的响应,谢谢。我在OP中对此进行了一些说明:“但是curl返回的对象不是我期望的对象。”我刚才用var greeter=curl(['mod']);
(对象正确加载)再试了一次和greeter.sayHi
返回了未定义的对象。curl返回的对象具有config
、next
和then
函数。看起来不像curl返回了我告诉它加载的对象。@jcollum以防你不确定我所说的缺少或存在“数组括号”是什么意思,示例:require(/*无括号*/'a'/*无括号*/)
与require(/*括号!!!->*/['a']/*我两种方法都试过了,curl在两种情况下返回相同的对象。你能检查一下你使用的curl版本吗?@jcollum抱歉。var a=require('o')的用例
在CurlJS中确实非常狭窄。只有一种特殊的本地require
似乎支持CJS风格的调用。该模块必须包装到define(function(require){…})
中。感谢您的详细介绍。我想我花了一段时间才“获取”这个AMD的东西。它现在是有意义的。太棒了!从非模块到模块需要一个思维的转变。异步部分使它更难。