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

Require.js is loading modules even inside an IF statement

本文关键字:加载 模块 语句 IF js Require      更新时间:2023-09-26

通过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评估正确,但模块新闻网格始终在加载,无论模块新闻是否存在。

我发现,如果我更改变量的模块路径字符串,那么requires的行为是正确的,但这毫无意义。这样,下面的代码工作:

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格式var module = require("module name")编写require调用您不能使用它来有条件地加载模块

调用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习惯用法。