Javascript 将AngularJS应用程序中的模块文件包含到Karma中的RequireJS配置文件中

Javascript 将AngularJS应用程序中的模块文件包含到Karma中的RequireJS配置文件中,javascript,angularjs,requirejs,phantomjs,karma-runner,Javascript,Angularjs,Requirejs,Phantomjs,Karma Runner,我们知道,在配置文件中使用RequireJS时,必须定义“路径”和“垫片”。在编写测试(Karma、Jasmine)时,我们需要为RequireJS创建一个额外的配置文件,并重新定义相同的数据 我尝试提取公共部分并动态加载它们。在AngularJS应用程序中,一切正常,但在测试中,我总是出现错误“404”。但让我们开始吧。简单示例结构: . |-- newApp | |-- app | | `-- app.require.js | |-- newApp.require.js |

我们知道,在配置文件中使用RequireJS时,必须定义“路径”和“垫片”。在编写测试(Karma、Jasmine)时,我们需要为RequireJS创建一个额外的配置文件,并重新定义相同的数据

我尝试提取公共部分并动态加载它们。在AngularJS应用程序中,一切正常,但在测试中,我总是出现错误“404”。但让我们开始吧。简单示例结构:

.
|-- newApp
|   |-- app
|   |   `-- app.require.js
|   |-- newApp.require.js
|   `-- index.html
`-- test
    |-- test.karma.js
    `-- test.require.js
index.html加载RequireJS配置文件

<script data-main="newApp.require.js" src="bower_components/requirejs/require.js"></script>
app.require.js带有路径和垫片的模块/对象

define([
    'some/others/components.require'
], function (componentsRequire) {
    "use strict";

    var appRequire = {
        'NewApp': 'app.module',
        'NewAppBootstrap': 'app.bootstrap',
        'NewAppRoute': 'app.routes'
    };

    var vendorRequire = {
        'jQuery': {
            exports: '$'
        },
        'angular': {
            exports: 'angular'
        }
    };

    return {
        paths: Object.assign(
            appRequire,
            componentsRequire
        ),
        shim: vendorRequire
    };
});
到目前为止,一切正常。现在我想将app.require.js文件加载到test.require.js中。问题开始了

测试.require.js

var TEST_REGEXP = /(spec|test)\.js$/i;
var allTestFiles = [];

Object.keys(window.__karma__.files).forEach(function (file) {
    'use strict';

    if (TEST_REGEXP.test(file)) {
        var normalizedTestModule = file.replace(/^\/base\/|\.js$/g, '');
        allTestFiles.push(normalizedTestModule);
    }
});

require([
    'app/app.require'
], function (appRequire) {
    "use strict";

    require.config({
        baseUrl: '/base/newApp',
        waitSeconds: 200,
        paths: appRequire.paths,
        shim: appRequire.shim,
        deps: allTestFiles,
        callback: window.__karma__.start
    });
});
不幸的是,我仍然有错误:

WARN [web-server]: 404: /app/app.require.js
PhantomJS 2.1.1 (Linux 0.0.0) ERROR: 'There is no timestamp for app/app.require.js!'

PhantomJS 2.1.1 (Linux 0.0.0) ERROR
  Error: Script error for "app/app.require"
  http://requirejs.org/docs/errors.html#scripterror at node_modules/requirejs/require.js:143

我尝试了不同的途径,但还是一无所获。有人知道如何加载这个文件吗?是否有可能在此处加载文件?如有任何提示,我将不胜感激。

当您的代码点击此
要求时
呼叫:

require([
    'app/app.require'
],
require.config({
  baseUrl: '/base/newApp',
});
没有有效的RequireJS配置,并且未使用
data main
,因此默认情况下,RequireJS将包含加载RequireJS的HTML页面的目录作为
baseUrl
(请参阅)。因为
index.HTML
位于根目录,然后RequireJS将您的模块名解析为
/app/app.require.js
,但找不到它

您可以使用完整路径解决此问题:

require([
    'base/newApp/app/app.require'
], 
或者,如果其他代码稍后将尝试访问与
app/app.require
相同的模块,则在第一次调用
require
之前,您应该具有最低配置:

require([
    'app/app.require'
],
require.config({
  baseUrl: '/base/newApp',
});

多次调用
require.config
非常好。后续调用将覆盖原子值(如
baseUrl
)和可合并的marge值。(后者的一个例子是
路径
。如果第一次调用为模块
foo
设置了
路径
,第二次调用为模块
bar
设置了
路径
,则生成的配置将为
foo
bar
都设置
路径

您是否尝试过将路径更改为:
。/newApp/app/app.require
当然,我也尝试过:app.require、app/app.require、newApp/app/app.require、../newApp/app/app.require。即使使用/base,但错误仍然相同……这里的答案可能会有所帮助?