我正在尝试使用RequireJS和MooTools的组合构建网站。这是我第一次使用这两个库。有很多文档可以将RequireJS与jQuery一起使用,但与MooTools一起使用则更少。我发现只有this。但我遇到了一些麻烦,其中很多可能是无知的结果;不过,也许你们都可以提供帮助。
目前,我只是试图测试基本功能,并了解我 如何设置它。这是我尝试过的:
在我的网站页脚中,我有以下脚本标记:
<script src="assets/js/vendor/require.js" data-main="../app.js"></script>
这将使用文件app.js加载requirejs。在app.js里面我主要处理路径:
requirejs.config({
"baseUrl": "assets/js",
"paths": {
"mootools": "//ajax.googleapis.com/ajax/libs/mootools/1.4.5/mootools-yui-compressed"
}
});
// Load the main app module to start the app
requirejs(["main"]);
最后,在main.js中,我(到目前为止)有以下内容:
define(["mootools"], function($) {
var a = $$('.menu'); // .menu is a nav menu in the DOM
console.log(a);
var b = $('.menu');
console.log(b);
});
所以在这里,一个工作,但b导致错误:undefined is not a function
。所以这里有几个问题。首先,有人能告诉我带有mootools的$和$$的含义有何不同?我从this tutorial收集,两者都用在了mootools。另外,为什么mootools没有映射到$?据我了解,使用jQuery,这就是你要这样做的方法,例如见here。
我确信这里有一些基本的混淆,但请怜悯。我是这些工具的新手。
答案 0 :(得分:3)
MooTools(按原样)不符合AMD标准。大卫沃尔什很酷,但他不喜欢或使用RequireJS。他的帖子中的信息已经过时,不再实用。事实上,我相信MooTools核心团队中没有一个人喜欢AMD或使用它。无论如何,那就是重点。 jQuery现在基于AMD,所以使用它很容易。 MooTools在2年前试过它 - https://github.com/arian/mootools-core/tree/1.5amd - 然后放弃了。 1.5仍然没有出局(希望下周,仍然没有AMD)。
反正
你不能以这种方式做到这一点,期望脚本神奇地返回$
未定义模块的地方。
这里还有另一个问题,那就是你正在加载一个远程脚本并且让你自动确定协议 - 这是RequireJS自己处理的一些奇怪的事情。
处理它的两种或三种方法。
define([
'http://ajax.googleapis.com/ajax/libs/mootools/1.4.5/mootools-yui-compressed.js'
], function(){
return window.$;
});
然后通过要求它来使用:
require(['mootools'], function($){
$(document.body).adopt(new Element('div[html=hi]'));
});
例如。 http://jsfiddle.net/dimitar/5zYnW/
但是,mootools无论如何都会导出各种全局变量,所以它并没有真正有用。你最好使用requirejs shim config。
require.config({
paths: {
mootools: 'https://ajax.googleapis.com/ajax/libs/mootools/1.4.5/mootools-yui-compressed'
},
shim: {
mootools: {
exports: '$'
}
}
});
// some code.
require(['mootools'], function(){
document.id('foo').adopt(new Element('div[html=hi]'));
});
例如:http://jsfiddle.net/dimitar/5zYnW/1/
我发现在RequireJS之前加载MooTools更容易,并且假设它在我编写的所有模块中都是全局的 - 因为要捕获的全局导出太多,所以更有意义。例如。类,元素,请求等等。
例如。来自我的MooTools MVC框架Epitome的https://github.com/epitome-mvc/Epitome/blob/master/example/js/model-demo-require.js -s。
这是通过UMD包装的示例模块代码 - https://github.com/epitome-mvc/Epitome/blob/master/src/epitome-model.js - 隐式需要MooTools的唯一代码是node.js代码。