我最近发现了Meteor,我正在努力在新的Meteor项目中使用ES6类和导入。我想要做的是拥有一个复杂的类结构,从Meteor事件/方法/助手调用哪些方法。我已经通过编写命令$ meteor add grigio:babel
将Babel.js添加到项目中,并且它可以正常工作。
我想要实现的目标:
在server / models / article.js中:class Article {
static all() {
//returns all articles from db
}
}
在server / methods / articles.js中:
Meteor.methods({
allArticles: {
Article.all();
}
})
只需在方法文件中引发ReferenceError: Article is not defined
就足够了。所以我有三个选择:在一个文件中编写所有类,将所有类附加到全局对象或使用像Browserify这样的好模块系统。显然,第三种选择更好。
但我该怎么用? Babel默认将export
,import
转换为Browserify,Meteor在页面刷新时引发require is not defined
错误。在谷歌搜索问题之后,我没有找到关于如何将Browserify添加到Meteor的明确解决方案。我应该向Meteor添加一个npm包支持,添加一个nify包browserify并在我导入/导出任何内容的每个页面上手动添加到Meteor吗?或者我应该使用完全不同的方法?这个任务通常如何在Meteor中处理?谢谢!
答案 0 :(得分:13)
我之前正在阅读这篇文章,并在github上发现了this issue可能有所帮助。
基本上只是将类分配给一个暴露给客户端和服务器的变量(lib / both / etc取决于你的文件结构)。像这样:
Article = class Article {...}
目前似乎是最好的解决方案。
答案 1 :(得分:4)
我这样做的方法是将对象收集到各种名称空间中,例如:
// Global
Collections = {};
class Article {
static all() {
//returns all articles from db
}
}
_.extend(Collections, { Article });
然后为了避免在任何地方使用Collections.Article
,我可以在我需要访问Article
的文件中使用以下内容:
// Make `Article` available
let { Article } = Collections;
答案 2 :(得分:1)
我正在使用Meteor 1.4.1.1并且在重现您的方法时仍然存在错误。但是,现在有一些新方法可以使用es6类:
<强> 1。将您的类导出为常量(例如,用作单例对象):
class MyModuleInternalClassName {
//... class internals
}
export const PublicClassName = new MyModuleInternalClassName();
您可以通过
导入此内容import {PublicClassName} from 'path/to/PublicClassFileName.js';
<强> 2。直接导出您的课程作为模块的默认
export default class PublicClassName {
//... class internals
}
然后将其导入(与上面的一样),如下所示
import {PublicClassName} from from 'path/to/PublicClassFileName.js';
let myInstance = new PublicClassName();
<强> +++++++++++++++++++++++++++++++++ 强>
关于OP和错误的问题,您可以尝试这样的事情:
<强> Article.js 强>
class InternalArticle {
constructor(){
//setup class
}
all() {
//returns all articles from db
}
register(article){
//add article to db
}
}
export const Article = new InternalArticle();
导入并使用Singleton
import {Article} from 'path/to/Article.js';
//either register some article
Article.register(someArticle);
//or get all your articles
const allArticles = Article.all();