如何通过在Meteor中导入es6类在不同的文件中正确使用它们?

时间:2015-03-31 11:08:42

标签: javascript meteor module browserify ecmascript-6

我最近发现了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默认将exportimport转换为Browserify,Meteor在页面刷新时引发require is not defined错误。在谷歌搜索问题之后,我没有找到关于如何将Browserify添加到Meteor的明确解决方案。我应该向Meteor添加一个npm包支持,添加一个nify包browserify并在我导入/导出任何内容的每个页面上手动添加到Meteor吗?或者我应该使用完全不同的方法?这个任务通常如何在Meteor中处理?谢谢!

3 个答案:

答案 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();