将来自 AngularJS 应用程序的模块文件包含到 Karma 中的 RequireJS 配置文件中
Include file with module from AngularJS app into RequireJS config file in Karma
我们知道,在配置文件中使用RequireJS时,我们必须定义'paths'和'shim'。在编写测试(Karma、Jasmine)时,我们需要为 RequireJS 创建一个额外的配置文件并重新定义相同的数据。
我尝试提取公共部分并动态加载它们。在 Angular JS 应用程序中,一切正常,但在测试中我总是出现错误“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>
newApp.require.js 初始化 RequireJS
require([
'app/app.require'
], function (appRequire) {
"use strict";
require.config({
baseUrl: 'app',
paths: appRequire.paths,
shim: appRequire.shim,
deps: [
'NewAppBootstrap'
]
});
});
app.require.js 带有路径和 shim 的模块/对象
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。问题开始了...
test.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
调用时:
require([
'app/app.require'
],
没有生效的RequireJS配置,也没有使用data-main
,所以默认情况下RequireJS将包含加载RequireJS的HTML页面的目录作为baseUrl
(请参阅 the documentation。)由于 index.html
位于根目录,因此 RequireJS 将您的模块名称解析为 /app/app.require.js
并且找不到它。
您可以使用完整路径解决此问题:
require([
'base/newApp/app/app.require'
],
或者如果碰巧其他代码稍后将尝试访问与 app/app.require
相同的模块,那么您应该在第一次 require
调用之前进行最小配置:
require.config({
baseUrl: '/base/newApp',
});
多次调用require.config
完全没问题。后续调用将覆盖原子值(如 baseUrl
)和可合并的边界值。 (后者的一个例子是 paths
。如果第一次调用为模块 foo
设置了一个 paths
,而第二次调用为模块 [=26] 设置了一个 paths
=],那么生成的配置对于 foo
和 bar
都将具有 paths
。)
我们知道,在配置文件中使用RequireJS时,我们必须定义'paths'和'shim'。在编写测试(Karma、Jasmine)时,我们需要为 RequireJS 创建一个额外的配置文件并重新定义相同的数据。
我尝试提取公共部分并动态加载它们。在 Angular JS 应用程序中,一切正常,但在测试中我总是出现错误“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>
newApp.require.js 初始化 RequireJS
require([
'app/app.require'
], function (appRequire) {
"use strict";
require.config({
baseUrl: 'app',
paths: appRequire.paths,
shim: appRequire.shim,
deps: [
'NewAppBootstrap'
]
});
});
app.require.js 带有路径和 shim 的模块/对象
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。问题开始了...
test.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
调用时:
require([
'app/app.require'
],
没有生效的RequireJS配置,也没有使用data-main
,所以默认情况下RequireJS将包含加载RequireJS的HTML页面的目录作为baseUrl
(请参阅 the documentation。)由于 index.html
位于根目录,因此 RequireJS 将您的模块名称解析为 /app/app.require.js
并且找不到它。
您可以使用完整路径解决此问题:
require([
'base/newApp/app/app.require'
],
或者如果碰巧其他代码稍后将尝试访问与 app/app.require
相同的模块,那么您应该在第一次 require
调用之前进行最小配置:
require.config({
baseUrl: '/base/newApp',
});
多次调用require.config
完全没问题。后续调用将覆盖原子值(如 baseUrl
)和可合并的边界值。 (后者的一个例子是 paths
。如果第一次调用为模块 foo
设置了一个 paths
,而第二次调用为模块 [=26] 设置了一个 paths
=],那么生成的配置对于 foo
和 bar
都将具有 paths
。)