Require.js甚至在IF语句中加载模块

时间:2016-01-14 10:30:03

标签: javascript jquery requirejs amd

我通过require.js加载某些.js模块时发现了一些问题 问题是:我只需要在某些页面中加载某些模块,而不是整个网站。因此,我以这种方式放置代码:

if($('.module-news').length > 0 + $('.module-ticket-euromillones-multiple').length + $('.module-news-page').length > 0) {
            require('_modules/news-grid').init();
        }

如果 class =" module-news" 存在(新闻页面),则此代码在HTML中搜索。如果是,则使用javascript加载模块。

这不起作用。 IF正在正确评估,但模块新闻网格总是加载,无论是否存在.module-news。

我发现如果我更改变量的模块路径的字符串,则需要正确行为,但这没有任何意义。以下代码如何工作:

var name =" _modules / news-grid&#34 ;;

if($('.module-news').length > 0 + $('.module-ticket-euromillones-multiple').length + $('.module-news-page').length > 0) {
                require(name).init();
            }

这是require的已知问题吗?我错过了什么吗? (可能在requirejs.config设置中?

帮助表示赞赏

1 个答案:

答案 0 :(得分:3)

解决方案

您应该使用常规的RequireJS惯用法来调用require

if (...) {
    require(['_modules/news-grid'], function (news_grid) {
        news_grid.init();
    });
}

为什么失败

您正在使用RequireJS'功能,可让您以CommonJS格式require编写var module = require("module name")次来电。 您无法使用它有条件地加载模块。

调用require('module name')(使用字符串作为第一个参数而不是依赖数组)是一种便利。它将返回一个模块,但是当且仅当模块已经加载时。如果尚未加载模块,则呼叫将失败。在调用require('module name')之前,您不必担心预加载模块的唯一原因是RequireJS会为您执行此操作。

define(function (require) {
    var foo = require('foo');
});

由RequireJS解释为:

define(['require', 'foo'], function (require) {
    var foo = require('foo');
});

它扫描函数以查找CommonJS习语中require的调用,并生成它在执行模块之前加载的模块列表。 条件对此过程完全透明。将检测到带有字符串作为第一个参数的任何require调用,并且它意味着加载的模块将被添加到{{1之前加载的依赖项调用回调...

RequireJS不会检测除了字符串之外的其他内容传递给define的情况。如果你写:

require

RequireJS不会知道您要加载var name = "foo"; var foo = require(name); ,也不会将foo添加到依赖项列表中。这是一个解决方案吗?不,因为记住我之前说的foo将返回一个模块,而不是失败,只有当模块已经加载时才会失败。

如果您希望有条件地加载模块,那么放弃CommonJS习语。