使用RequireJS文本插件

时间:2016-11-15 16:04:37

标签: javascript text requirejs karma-runner

我正在使用Karma对某些代码运行测试。

在由Karma运行之前,测试和代码都被转换(ES6 => ES5使用babel)。

这很好用,测试运行正常。

但是,如果我尝试使用正在测试的任何文件中的text!插件......

import template from 'text!./template.html';

......我明白了:

There is no timestamp for /base/src/text.js!
Uncaught Error: Script error for "text", needed by: text!app/template.html_unnormalized2
http://requirejs.org/docs/errors.html#scripterror 
Uncaught Error: Load timeout for modules: text!app/template.html_unnormalized2

有没有人知道为什么会这样?

dist文件夹中的构建工件(即测试项目)包含成功编码的文本RequireJS项目,例如:

define('text!app/template.html',[],function () { return '<div>foo</div>';});

其他信息

测试main.js

var TEST_REGEXP = /(spec|test)\.js$/i;
var allTestFiles = [];   
Object.keys(window.__karma__.files).forEach(function(file) {
  if (TEST_REGEXP.test(file)) {
    var normalizedTestModule = file.replace(/^\/base\/|\.js$/g, '');
    allTestFiles.push(normalizedTestModule);
  }
});

require.config({
  baseUrl: '/base/src',
  paths: {},    
  shim: {},
  deps: allTestFiles,
  callback: window.__karma__.start
});

karma.conf.js

module.exports = function(config) {
    'use strict';    
    var path = require('path');    
    var cdn = 'http://localhost:55635/modules/';
    var basePath = path.dirname(__filename);

    config.set({
        basePath: '../../..',
        frameworks: [
            'requirejs', 
            'jasmine'
        ],
        files: [
            {
                pattern: path.join(basePath, 'test-transpiled', '*-spec.js'),
                included: false
            },
            path.join(basePath, 'dist', 'artifacts', 'app.js'),
            path.join(basePath, 'test', 'unit', 'test-main.js')
        ],
        proxies: {
            '/cdn/': cdn
        },
        exclude: [],
        preprocessors: {},
        reporters: ['dots'],
        colors: true,
        autoWatch: false,
        singleRun: false,
        browsers: ['Chrome'],
    });
};

修改

我已将以下内容添加到karma.conf.js:

files: [
  {
    pattern: path.join(basePath, 'node_modules/require-plugins/text/text.js'),
    included: false
  },
   // ...
],

运行测试时我仍然遇到错误:

There is no timestamp for /base/src/text.js! 

大概是因为我需要在test-main.js的路径部分添加“text”?

require.config({
  baseUrl: '/base/src',
  paths: {
    'text': '../node_modules/require-plugins/text/text'
  },
  // ...
});

但是我尝试了baseUrltext路径中的路径的各种组合,我无法让它停止404-ing。

2 个答案:

答案 0 :(得分:2)

fetch中的files选项不包含karma.conf.js插件,这就是您收到没有时间戳的错误的原因。

在您的text列表中添加一个项目,该列表会点击您文件系统上的files插件,并确保您拥有text。 RequireJS插件与其他模块类似:RequireJS必须能够加载它们才能使用它们。

您可能还需要在included: false中设置paths,具体取决于您放置插件的位置。 RequireJS已经在test-main.js寻找它。如果您找到它以便在此URL上提供插件,则无需设置/base/src/text.js。如果你把它放在其他地方,那么你需要设置paths。类似的东西:

paths

请注意,paths: { text: 'path/to/text', } 中的路径是相对于paths设置进​​行解释的。

答案 1 :(得分:0)

我尝试使用require.js文本!插件,并且还发现它与为项目其余部分定义的baseUrl冲突。

requirejs.config将baseUrl设置为JS文件的父目录,而我的模板在js的兄弟目录中定义。  没有办法告诉requirejs从/ base / templates加载模板和从base / js加载js。

我的解决方案是更改text.js插件,并在进行ajax调用以获取HTML文件之前添加一个钩子来更改URL。您可以从here获取我的text.js版本。