使用RequireJS和MooTools无法获得$

时间:2014-02-08 19:14:15

标签: javascript requirejs mootools

我正在尝试使用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

我确信这里有一些基本的混淆,但请怜悯。我是这些工具的新手。

1 个答案:

答案 0 :(得分:3)

MooTools(按原样)不符合AMD标准。大卫沃尔什很酷,但他不喜欢或使用RequireJS。他的帖子中的信息已经过时,不再实用。事实上,我相信MooTools核心团队中没有一个人喜欢AMD或使用它。无论如何,那就是重点。 jQuery现在基于AMD,所以使用它很容易。 MooTools在2年前试过它 - https://github.com/arian/mootools-core/tree/1.5amd - 然后放弃了。 1.5仍然没有出局(希望下周,仍然没有AMD)。

反正

你不能以这种方式做到这一点,期望脚本神奇地返回$未定义模块的地方。

这里还有另一个问题,那就是你正在加载一个远程脚本并且让你自动确定协议 - 这是RequireJS自己处理的一些奇怪的事情。

处理它的两种或三种方法。

你可以定义一个本地模块,例如你自己的mootools.js

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代码。