如何编写 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。
我正在尝试在我的 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。