【问题标题】:intern dojo loader issue实习生道场加载器问题
【发布时间】:2013-09-09 04:13:41
【问题描述】:

我正在尝试为我的项目(一个 Dojo/JS 项目)设置实习生,但服务器不是 Node……我遇到了加载程序问题,这似乎是由于 dojo.has 使用了 Dojo 加载程序…… here 中建议的 require 包装器对我不起作用。

我收到以下错误:

> node node_modules/intern/client.js config=tests/intern
Defaulting to "console" reporter
dojo/text plugin failed to load because loader does not support getText
TypeError: undefined is not a function
at Object.load (lib/dojo/dojo/text.js:199:6)

下面是我的实习配置和测试文件:

/tests/intern.js:(配置文件)

loader: {
    packages: [ { name: 'visitorsPortal', location: 'portals/visitor' },
        { name: 'dojo', location: 'lib/dojo/dojo'},
        { name: 'dijit', location: 'lib/dojo/dijit'},               
        { name: 'portalLib', location: 'portals/lib'} ]
},
suites: [ 'tests/uitests' ],

测试/uitests:

define([
    'intern!tdd',
    'intern/chai!assert',
    'portals/visitor/views/MyModule'
 ], function (test, assert, MyModule) {

     // empty for now...

 });

【问题讨论】:

  • 你找到解决方案了吗?

标签: dojo intern


【解决方案1】:

这与dojo/has 无关,而与dojo/text 插件有关,该插件需要在服务器端使用时仅存在于Dojo 1 加载器中的功能。

如果您尝试测试依赖于任何非标准 AMD 加载程序功能的软件,您将需要使用非标准加载程序,或使用兼容的替代副本覆盖这些模块其他装载机。

在这种特定情况下,最简单的方法是使用 Geezer 版本的 Intern,因为它包含旧的 Dojo 加载器,其中包含这些非标准扩展。 最佳 前进的路径是将dojo/text 模块重新映射到另一个不需要在加载器中进行任何特殊操作以检索数据的兼容模块:

// in intern.js
// ...
loader: {
  map: {
    '*': {
      'dojo/text': 'my/text'
    }
  }
},
// ...

【讨论】:

    【解决方案2】:

    我昨天遇到了同样的问题,但是感谢 C Snover 在这里的回答以及你的问题 linking to,我确实取得了一些进展。

    我将map 指令添加到intern.js 加载程序配置中(正如C Snover 所建议的那样)。

        // in intern.js
        // ...
        loader: {
          map: {
            '*': {
              'dojo/text': 'my/text'
            }
          }
        },
        // ...
    

    对于my/text 模块,我只是复制了dojo/text 并在解析getText 函数的部分添加了一个else if 子句:

    if(has("host-browser")){
        getText= function(url, sync, load){
            request(url, {sync:!!sync}).then(load);
        };
    } else if(has("host-node")){      
        // This was my addition...
        getText = function(url, sync, load) {
            require(["dojo/node!fs"], function(fs) {
                fs.readFile(url, 'utf-8', function(err, data) {
                    if(err) console.error("Failed to read file", url);
                    load(data);
                });
            });
        };
    } else {
          // Path for node.js and rhino, to load from local file system.
          // TODO: use node.js native methods rather than depending on a require.getText() method to exist.
          if(require.getText){
    
              getText= require.getText;
    
          }else{
              console.error("dojo/text plugin failed to load because loader does not support getText");
          }
      }
    

    但是,即使测试是通过节点在实习生中运行的,host-node 值也没有被设置。通过在我的 intern.js 配置中设置 dojo-has-api 来解决这个问题:

    define(["intern/node_modules/dojo/has"], function(has) {
    
        has.add("dojo-has-api", true);
    
        return { /* my intern config as normal */ };
    });
    

    我承认我不能 100% 理解我在这里所做的事情,而且复制/粘贴的效果并不完全漂亮,但它至少可以暂时解决我的问题。

    注意:这确实引入了另一组问题:由于 Dojo 现在知道它在节点中运行,所以 dojo/request 不再尝试使用 XHR。我使用 sinon.js 来模拟我的 xhr 请求,所以必须更改它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-06
      • 1970-01-01
      相关资源
      最近更新 更多