需要在另一个脚本

时间:2015-10-20 20:15:07

标签: javascript requirejs

脚本A

;(function(g){

  define('hotness', [], function() {
    function f() {;
      console.log('gotem');
    }
    return f;
  });

  define('otherModule', [], function() {});


})(this);

脚本B

define([
  'ScriptA',
], function() {

  var hotness = require('hotness')
});

Error: Module name "hotness" has not been loaded yet for context: _

在ScriptB的ScriptA中定义要求的推荐方法是什么?

我也尝试过:

脚本B Alt

define([
  'require',
  'ScriptA',
  'hotness'
], function(require) {

  var hotness = require('hotness')
});

哪个给了我

Error loading resource ... /hotness.js: No such file or directory Error: Script error for: hotness

编辑:

值得注意的是ScriptA保持原样,不会被修改。问题是如何从ScriptB获取ScriptA中的命名模块。

EDIT2:

我无法控制HTML或页面的任何其他方面。我必须在ScriptB中做所有事情。

EDIT3:

我有一个可行的例子,但它看起来像一个可怕的反模式解决方案所以我甚至不想提及它:

define(['require'], function(require) {
    // why use window? IDK.
    // this is just verbatim what is "working" for someone else
    window.require(['scriptA'], function(sA) {
        //sA never actually used
        window.require([
            'otherModule'
        ], function(oM) {
            var hotness = require('hotness'),

2 个答案:

答案 0 :(得分:1)

您应该使用bundles configuration。鉴于您所描述的内容,您应该使用:

bundles: {
    'scriptA': ['hotness', 'otherModule']
}

这基本上告诉RequireJS"当你想要找到hotnessotherModule然后加载scriptA因为它们在那里定义了#34;。我不时地使用它来加载使用r.js生成的包中的模块。

除此之外Joseph the Dreamer是正确的,你不应该在同一个模块中混合使用AMD和CommonJS获取依赖关系的方法。

答案 1 :(得分:0)

您的ScriptA使用命名模块。它们必须在RequireJS之后但在任何家属之前加载。 RequireJS does not recommend named modules除非您知道自己在做什么(比如像常规脚本一样加载库,并将其同时注册为模块)。

  

错误:尚未为上下文加载模块名称“hotness”:_

这是一个通用的RequireJS错误,当从服务器加载模块时,但不知何故RequireJS无法将其提供给依赖项。通常在模块出现语法错误或存在循环依赖性时发生。

ScriptB也存在问题。它试图同时使用AMD style(数组依赖关系)和CommonJS style(显式要求)。只需使用两种语法中的一种。请注意,在CommonJS格式中,它需要模块具有名为require的第一个参数来触发CommonJS编写格式。

define(['hotness'], function(hotness) {
  // use hotness
});

// or

define(function(require){
  var hotness = require('hotness');
  // use hotness
});
  

加载资源时出错...... /hotness.js:没有这样的文件或目录

务必设置基本网址。它可以是隐式的(基于data-main location)或显式的(using require.config)。模块名称通常是相对于基本URL的路径+文件名。

建议您为每个模块使用一个文件,其中包含没有名称的模块定义(文件名成为模块的名称),并位于集合baseUrl下的某个位置。