1

我正在开发一个使用 require.js 的网络应用程序。我对应用程序和 requirejs 都很陌生,并且想知道解决我遇到的问题的最佳解决方案是什么。我们一直在 PHP 包含文件中加载带有脚本标签的第三方用户分析/跟踪库。我们不为这些使用 requirejs,因为 php 正在设置一些 js 运行时值。

这是一个这样的块的示例:

<script src="//js.revsci.net/gateway/gw.js?csid=A08723"></script>
<script type="text/javascript">
    <?php
        global $base_url;
        $host = parse_url( $base_url, PHP_URL_HOST );
    ?>
    if( typeof DM_cat != 'undefined' ) {
        DM_cat('Track');
        DM_tag();
    }
</script>

现在我同意了,像这样结合js和php并不理想,但是所有的分析代码都是这样写的,而且还有很多。我没有时间(或知识)以 requirejs 的方式重构它,所以我暂时坚持使用这种结构。现在我被要求将这些第三方脚本设为“异步”或“延迟”。如果可能的话,我更喜欢异步,但两者都是可以接受的解决方案。所以我想改变这个:

<script src="//js.revsci.net/gateway/gw.js?csid=A08723"></script>

对此:

<script src="//js.revsci.net/gateway/gw.js?csid=A08723" defer></script>

我的问题是,如何使用 Require 加载第三方脚本并防止在加载脚本之前执行内联 javascript 块?从我尝试编写的代码中,我不断收到“不匹配的匿名定义()模块”错误。我已经阅读了错误,但我无法理解它。即使我粘贴了一个基本示例,我也会不断收到该错误。例如,我什至无法让这个测试代码工作:

define(["testcode"], function(testcode){
  window.foo = "bar";
});

define(["foo"], function(){
  alert(window.foo);  // "bar"
});

错误信息:

Uncaught Error: Mismatched anonymous define() module: function
(testcode){   window.foo = "bar"; }

我不明白这个错误,谁能帮我指出正确的方向?提前致谢!

4

2 回答 2

2

迟到了,但这个错误是由于在一个文件中有 2 个定义语句而没有命名它们。这是区分您在单个文件中声明的两个模块所必需的。您需要添加一个名称参数,如下所示:

define('Name1', ["testcode"], function(testcode){
  window.foo = "bar";
});

define('Name2', ["foo"], function(){
  alert(window.foo);  // "bar"
});

请参阅以下两个:-文档 -相关 Stackoverflow 文章

于 2014-10-25T05:08:36.237 回答
1

nopuck4you 建议您将模块名称添加为define调用的第一个参数。如果这些模块是在<script>HTML 中的标签内创建的,那没关系。这是您可以将模块名称作为define. 实际上,在这种情况下,您必须为模块命名,否则 RequireJS 找不到它们。所以你会有:

<script>
define("foo", ["testcode"], function(testcode){
  window.foo = "bar";
});

define("test", ["foo"], function(){
  alert(window.foo);  // "bar"
});
</script>

(我假设第二个模块依赖于第一个并相应地命名事物。我不知道testcode事物是什么所以我保持原样。)

但是,一般来说,您不应该通过在调用中放置名称来为模块命名defineRequireJS 文档对此非常清楚。如果你确实在 中命名你的模块define,这可能会由于 RequireJS 的工作方式而导致问题。除非您解决问题,否则事情将无法正常工作,或者它们将无法正常工作。例如,如果您将模块foobarinfoo.js放入并将它们的名称作为 的第一个参数define,RequireJS 不会有任何问题来确定该模块foo是否在其中,但它foo.js不会立即知道也在. 取决于您加载模块的顺序barfoo.js,您可能必须有额外的配置告诉 RequireJSbarfoo.js.

将模块名称放在define调用中只会导致失败、意外、复杂化等。不要这样做。留下名字,让 RequireJS 弄清楚。然后,当你优化时,r.js把名字放进去。

注意:您可能已经看到来自 3rd 方的一些代码,这些代码将模块名称直接放入define. jQuery 是一个突出的例子。我上面所说的也有例外,但如果你不能清楚地说明为什么需要输入这个名字,那么你就不需要这样做。(事实上​​,查看 jQuery 案例,我认为没有充分的理由将名称放在define那里,我认为他们犯了一个错误。)

于 2014-10-25T12:49:16.010 回答