1

nodeJS バックエンドと Aurelia フロントエンドの間でいくつかの単純なメタデータ クラスを共有しようとしています。ノード (v4.3) プロセスから以下を要求して使用できます。

"use strict";

class PersonMetadata {

    constructor() {
        this.relation = ["Spouse/partner", "Child", "Parent", "Other"];
    }
}

module.exports.PersonMetadata = PersonMetadata;

しかし、典型的な Aurelia フロントエンド ビルドで処理された後、ブラウザーでの読み込みに失敗します。

Error: Cannot read property 'exports' of undefined

ノードと Aurelia の間で共有できるクラスを使用してモジュールを構成するにはどうすればよいですか?

4

2 に答える 2

0

この状況での最善の策は、ES6 をベースとして使用し、コンパイラ (babel または使用しているもの) を使用して、ブラウザと node.js サーバーの両方で期待される形式でモジュールを取得することです。

common.js 形式は node.js で最も一般的に使用されており、すべての形式が Aurelia アプリに適しています。あなたの最善の策は、(このタスクのように) commonjs と amd の両方に両方をコンパイルすることです。

次に、ブラウザで amd をターゲットにし、サーバー側で commonjs をターゲットにすることができます。

于 2016-02-12T02:37:02.143 に答える
0

これをどのように機能させたかについて返信したいと思いました。サーバー側のノード コードは現在 gulp によって処理されないため、ノード v4.X と直接互換性のある共有 ES6 クラスを作成しました。

"use strict";

class SharedMetadata {

    constructor() {
        this.myOptions = ["Democrat", "Republican", "Other"];
   }
}

exports.SharedMetadata = SharedMetadata;

このクラスは、次のようにノードから使用できます。

var SharedMetadata = require('../shared/SharedMetadata').SharedMetadata;

var sharedMetadata = new SharedMetadata();

フロント エンドの場合、このファイルは通常の Aurelia の build\transpile ステップで処理されますが、エクスポート ステートメントでエラーが発生します。

そこで、エラーを修正して「適切な」エクスポートを行うトランスパイル ステップのに、「共有」ファイルでのみ実行される別の gulp ビルド ステップを追加しました。

gulp.task('transform-shared', function() {
    return gulp.src(paths.outputShared + '**/*.js')
        .pipe(replace(/exports\.(.*) = (.*);/g, "_export('$1', $2);"))
        .pipe(gulp.dest(paths.outputShared));
});

これにより、exports ステートメントが次のように置き換えられます。

_export('SharedMetadata ', SharedMetadata );

その後、このクラスは「通常の」Aurelia フロント エンド クラスと同じように使用できます。

于 2016-02-14T13:48:24.407 に答える