【问题标题】:Strange behavior with RequireJS using CommonJS sintax使用 CommonJS 语法的 RequireJS 的奇怪行为
【发布时间】:2013-11-18 15:39:30
【问题描述】:

对于使用 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 条件的分支。相反,第一个解决方案是在请求时下载文件。

我错过了什么吗?是不是变量提升的原因?

【问题讨论】:

  • 这不是由于变量提升。我会检查以确保您没有以其他方式显式导入该脚本,因为您所描述的确实不应该发生。
  • @Pointy 感谢您的评论。我检查了两次,但没有找出问题所在。是的,吊装不是问题,但我只要求确认...
  • Firefox 的Tamper Data 插件或本地浏览器开发工具通常可以显示所有正在进行的HTTP 请求。您应该清除缓存并验证在回调版本中(无论如何这确实是正确的做事方式)当您的代码采用“else”分支时,您肯定没有导入脚本。

标签: javascript download requirejs commonjs


【解决方案1】:

这是对 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 和回调。

【讨论】:

  • 谢谢。你是对的。基于源代码,RequireJS 将在任何级别找到该模式,并将推送您所描述的附加依赖项(请参阅第 1984 行的define 函数)。
猜你喜欢
  • 2014-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多