如何编写 NodeJS 和 Aurelia 可以使用的 ES6 class\module

How to write an ES6 class\module that can be used by NodeJS & Aurelia

我正在尝试在我的 nodeJS 后端和 Aurelia 前端之间共享一些简单的元数据 classes。我可以从我的节点 (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 之间共享的 class 模块?

在这种情况下,你最好的选择是使用 ES6 作为基础,然后使用编译器(babel 或任何你正在使用的)以你在浏览器和 node.js 服务器.

common.js 格式在 node.js 中最常用,所有格式都适合您的 Aurelia 应用程序。你最好的选择可能是将两者都编译出来(就像 this 任务一样)到 commonjs 和 amd。

然后你可以在你的浏览器中定位amd,在服务器端定位commonjs。

我想我会回答我是如何让这个工作的。由于我的服务器端节点代码目前没有被 gulp 处理,我创建了一个共享的 ES6 class 与节点 v4.X:

直接兼容
"use strict";

class SharedMetadata {

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

exports.SharedMetadata = SharedMetadata;

这个 class 可以像这样从节点使用:

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

var sharedMetadata = new SharedMetadata();

对于前端,此文件由正常的 Aurelia build\transpile 步骤处理,但该文件在 exports 语句中会出现错误。

所以我添加了另一个 gulp 构建步骤,该步骤仅在 "shared" 文件上运行 after transpile修复错误并执行 "proper" 导出的步骤:

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

这会将导出语句替换为:

_export('SharedMetadata ', SharedMetadata );

然后 class 可以像任何 "normal" Aurelia 前端一样使用 class。