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 步骤处理,但该文件将在 export 语句中出现错误。

因此,我添加了另一个 gulp 构建步骤,该步骤仅在修复错误并执行“正确”导出的转换步骤之后在“共享”文件上运行:

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

这将 export 语句替换为:

_export('SharedMetadata ', SharedMetadata );

然后可以像使用任何“正常”的 Aurelia 前端类一样使用该类。

于 2016-02-14T13:48:24.407 回答