通过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是否存在,模块news-grid总是在加载。

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

var name =“ _modules / news-grid”;

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


这是require的已知问题吗?我想念什么吗? (也许在requirejs.config设置中?

感谢帮助

最佳答案



您应该使用常规的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调用都将被检测到,并且它意味着要加载的模块将添加到调用define的回调之前加载的依赖项中...

RequireJS不会检测将字符串以外的其他内容传递给require的情况。如果您写:

var name = "foo";
var foo = require(name);


RequireJS不会知道您要加载foo,也不会将foo添加到依赖项列表中。这是解决方案吗?不,因为请记住我之前说的require('module name')将返回一个模块,并且仅当该模块已加载时才会失败。

如果要有条件地加载模块,请放弃CommonJS惯用语。

关于javascript - Require.js甚至在IF语句中也正在加载模块,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34787194/

10-16 21:17