使用CommonJS语法,RequireJS是一个奇怪的行为。我会尽力解释我正在研究的背景。
我有一个名为Controller.js
的JS文件,用于注册输入事件(单击)并使用一系列if
语句来执行正确的操作。典型的if语句块可以是以下内容。
if(something) {
// RequireJS syntax here
} else if(other) { // ...
为了实现RequireJS语法,我尝试了两种不同的模式。第一个是以下内容。这是加载模块的标准方法。
if(something) {
require(['CompositeView'], function(CompositeView) {
// using CompositeView here...
});
} else if(other) { // ...
第二种,使用像
这样的CommonJS语法if(something) {
var CompositeView = require('CompositeView');
// using CompositeView here...
} else if(other) { // ...
两种模式都按预期工作,但我注意到Firebug出现了一种奇怪的行为(Chrome工具也是如此)。特别是,使用第二个文件,即使我没有按照管理特定操作以响应CompositeView
条件的分支,也已下载something
文件。相反,使用第一个解决方案,文件在请求时下载。
我错过了什么吗?是因为可变升降吗?
答案 0 :(得分:3)
这是对CommonJS风格require
的支持的限制。 documentation解释了这样的事情:
define(function (require) {
var dependency1 = require('dependency1'),
dependency2 = require('dependency2');
return function () {};
});
由RequireJS翻译为:
define(['require', 'dependency1', 'dependency2'], function (require) {
var dependency1 = require('dependency1'),
dependency2 = require('dependency2');
return function () {};
});
注意2 require
次调用的参数如何成为传递给define
的数组的一部分。
您所说的观察结果与RequireJS到达if
并将所需模块提升至define
一致,即使分支始终也是如此没有被采取。阻止RequireJS始终加载模块的唯一方法就是你已经发现的:你必须使用require
进行回调。