Require.js甚至在IF语句中也在加载模块
Require.js is loading modules even inside an IF statement
通过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习惯用法。
- 使用RequireJS从数组动态加载模块
- NgRoute未加载(模块错误)
- 动态加载模块角度
- RequireJS - 动态加载模块
- 无法在 Angular JS 中加载模块
- 从视图调用异步加载模块函数
- 主干木偶:木偶.应用程序导致 Require.js 模块加载错误,“'错误:尚未为上下文加载模块名称'A
- Webpack - 在不创建别名的情况下加载模块
- Jasmine 由于 ES6 语法而未加载模块
- 角度AMD加载模块不起作用
- 带有 angularjs 和 requirejs 的延迟加载模块
- RequireJS 有时不加载模块
- Require.js甚至在IF语句中也在加载模块
- AngularJS加载模块失败
- 节点未从项目根目录加载模块
- 通过requirejs自动加载模块
- 在运行时重新加载模块
- 动态命名的局部变量,用于加载模块
- RequireJS-加载模块的多个实例
- 无法在HotTowel SPA上加载模块