ご存知のように、構成ファイルでRequireJSを使用する場合は、「パス」と「シム」を定義する必要があります。テスト(Karma、Jasmine)を作成するときは、RequireJSの追加の構成ファイルを作成し、同じデータを再定義する必要があります。
共通部分を抽出して動的にロードしようとしています。Angular JSアプリケーションでは、すべてが問題なく動作しますが、テストでは常にエラー「404」が発生します。しかし、始めましょう。単純な構造例:
.
|-- newApp
| |-- app
| | `-- app.require.js
| |-- newApp.require.js
| `-- index.html
`-- test
|-- test.karma.js
`-- test.require.js
index.htmlRequireJS構成ファイルをロードします
<script data-main="newApp.require.js" src="bower_components/requirejs/require.js"></script>
newApp.require.js init RequireJS
require([
'app/app.require'
], function (appRequire) {
"use strict";
require.config({
baseUrl: 'app',
paths: appRequire.paths,
shim: appRequire.shim,
deps: [
'NewAppBootstrap'
]
});
});
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にファイルします。そして問題が始まります...
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
(ドキュメントを参照)。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
次のようになります。最初の呼び出しpaths
がモジュールfoo
にaを設定し、2番目の呼び出しpaths
がモジュールbar
にaを設定する場合、結果の構成はとpaths
の両方にfoo
なりbar
ます。)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加