使用RequireJS加载jQuery:第三方库中的不同名称约定

时间:2014-06-03 13:07:32

标签: javascript jquery requirejs

我有一个使用某些第三方库的应用程序,因为我也有自己使用jQuery创建的一些插件。

重点是:某些第三方库使用$和其他jQuery作为命名约定。我通过RequireJS要求jQuery的方式就是:

[...]

var $ = require('jquery');

[...]

这样,我得到以下控制台消息作为return:

  

未捕获的ReferenceError:未定义jQuery jquery.scrolly.js:79

     

未捕获的TypeError:undefined不是函数

然后,我通过创建两个变量并在两者中都需要jQuery来找出候选解决方案:

var $ = require('jquery'),
    jQuery = require('jquery');

所以,你可以看到这个"解决方案"是多余的,不必要的和不复杂的 - 我需要一致的东西,更好的东西。

有人可以与我分享想法吗?

1 个答案:

答案 0 :(得分:1)

感谢Daniel A. White,我可以使用名为shim config的优雅解决方案。

让我们一步一步来做。我的HTML要求app.js require.js想要:{/ p>

<!DOCTYPE html>
    <head>
        <!-- ... -->
        <script data-main="js/app" src="js/require.js"></script>
    </head>
    <body>
        <!-- ... -->
    </body>
</html>

这是我的 js/app.js

require.config({
    baseUrl: 'js',
    paths: {
        jquery: 'vendor/jquery-2.1.1.min',
        modernizr: 'vendor/modernizr-2.6.2.min',
        scrolly: 'vendor/jquery.scrolly'
    }
});

require(['main']);

现在,魔法发生了 - 看看你自己的新js/app.js

require.config({
    baseUrl: 'js',
    paths: {
        jquery: 'vendor/jquery-2.1.1.min',
        modernizr: 'vendor/modernizr-2.6.2.min',
        scrolly: 'vendor/jquery.scrolly'
    },
    shim: {
        'scrolly': {
            deps: ['jquery'],
            exports: 'scrolly'
        }
    }
});

require(['main']);

有什么大不了的?

这里的伟大之处在于RequireJS认为的简单性。据我所知, shim config 类似于库的“依赖管理器”。例如,scrolly是一个已经加载的依赖于jQuery的第三方库 - 为什么我们应该再次加载它?没有必要!我们只需要将其有用性注入使用jQuery资源的scrolly机制。

另一个流行的例子是BackboneJS。它的单一硬依赖是UnderscoreJS。要教Backbone可以使用Underscore,我们通过shim config提供依赖:

[...]

    shim: {
        'backbone': {
            deps: ['underscore'],
            exports: '_'
        }
    }

[...]

所以,就是这样。