【问题标题】:RequireJS - Exporting a Set of FunctionsRequireJS - 导出一组函数
【发布时间】:2017-07-13 16:31:01
【问题描述】:

我遇到 RequireJS 问题,当我有 require 语句时,我无法导出一组函数.

假设我有一个名为 mySubFile.js 的文件,首先我需要注入 jQuery,然后再注入另一个依赖项。现在,假设我有 myFunction,我想导出它以便从另一个文件中调用。

define('mySubFile', ['jquery'], function ($) {
    require(['dependency1'], function (dependency1) {

       let myFunction = function(){ return "Hey There"; }

       return : {
                    myFunction : myFunction
       }

    });
});

现在假设我想从 myFile.js 调用该函数:

define('myFile', ['jquery'], function ($) {
    require(['mySubFile'], function (mySubFile) {

       console.log(mySubFile.myFunction());

    });
});

这不起作用。我明白了:

无法读取未定义的属性“myFunction”。

另一方面,如果我将 mySubFile.js 定义如下:

define('mySubFile', ['jquery', 'dependency1'], function ($, dependency1) {

   let myFunction = function(){ return "Hey There"; }

   return : {
               myFunction : myFunction
   }

});

我可以访问 myFunction,但我需要先解析 jQuery

我正在努力寻找解决方案,但仍然没有找到任何东西。

我该如何解决?

【问题讨论】:

  • 你的意思是在 mySubFile 模块之前需要 jquery?
  • @Nitesh我需要先注入 jQuery。

标签: javascript jquery dependency-injection requirejs dependencies


【解决方案1】:

如果你总是需要 jQuery 在你的模块之前可用,你可以这样做:

define("mySubFile", function(require, exports, module){ 
    var a = require("jQuery"), // dependency
        b = require("knockout"); // dependency
    /* rest of the code for this module */ 

    let myFunction = function(){ return "Hey There"; }

   return : {
            myFunction : myFunction
         }
}); 

【讨论】:

  • 问题不是由 jQuery 引起的,我已经能够在其他任何事情之前获得它。当该子文件具有 require 语句时,我在从另一个文件访问外部函数时遇到问题。
【解决方案2】:

鉴于您在问题中显示的代码,这确实是要走的路:

define('mySubFile', ['jquery', 'dependency1'], function ($, dependency1) {

但你不想使用它,因为:

可以访问myFunction,但我需要先解析jQuery

好吧,当然jquery 必须先解决,然后才能返回一个值,但是让我们假设有一些魔法可以让你的其他尝试返回你想要的值,让我们从什么时候得到解决的观点。这就是你所拥有的:

define('mySubFile', ['jquery'], function ($) {
    require(['dependency1'], function (dependency1) {

会发生什么:

  1. define 调用已执行。 RequireJS 看到一个模块名称 (mySubFile)、一个依赖列表 ['jquery'] 和一个回调。
  2. RequireJS 解析jquery 并用它调用回调。
  3. require 调用已执行。 RequireJS 看到一个依赖列表和一个回调。
  4. RequireJS 解析dependency1 并调用回调。

同样,jquery 必须先解决,然后才能返回任何内容。在 define 回调中包含 require 不会对此进行任何更改。

define 中获取require 调用以按照您想要的方式工作需要大量重写。顺便说一句,您在那里遇到的问题并不是 RequireJS 特有的,而是所有异步代码共有的问题。有关一般问题和解决方法,请参阅this question

【讨论】:

  • 感谢您的解释。我知道问题的异步性质。如果我确实像你在开始时所说的那样,我没有任何 undefined 问题,但我的应用程序只是以某种方式崩溃,因为我没有先解决 jquery。我正在查看您链接的那个问题,但找不到首先解决 jquery 的方法。也许使用 $document(ready)
  • 我不清楚您遇到问题的原因。 jquery 在调用 define 的回调之前被解析。如果 dependency1 also 依赖于 jquery,那么您需要将 jquery 放入其依赖项列表中:要么在其 define 调用中,要么如果它是第三方非 AMD一段代码,你需要在RequireJS的配置中设置一个shim,将jquery列为依赖项。
  • 例如,现在我有一个问题,我必须触发一个给定的函数,该函数位于 $(document).ready 之后的另一个 js 文件中,但不知何故我获取 externalFile.thatFunction() 未定义,因为 externalFile 似乎与 jQuery 同时得到解决。
猜你喜欢
  • 2019-01-13
  • 1970-01-01
  • 1970-01-01
  • 2016-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-10
  • 1970-01-01
相关资源
最近更新 更多