如何通过在Meteor中导入不同文件中的es6类来正确使用它们
How to properly use es6 classes in different files by importing them in Meteor?
我最近发现了Meteor,我很难在新的Meteor项目中使用ES6类和导入。我想做的是有一个复杂的类结构,这些方法是从Meteor事件/方法/助手中调用的。我已经通过编写命令$ meteor add grigio:babel
将Babel.js添加到该项目中,并且它工作正常。
我试图实现的目标示例:
在服务器/模型/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的包,添加一个browserfy的npm包,并在我导入/导出任何内容的每个页面上手动将其添加到Meteor?还是应该使用完全不同的方法?Meteor通常是如何处理这项任务的?非常感谢。
我之前读过这篇文章,在github上发现了这个问题,这可能会有所帮助。
本质上,只需将类分配给一个向客户端和服务器公开的变量(lib/bboth/etc取决于您的文件结构)。像这样:
Article = class Article {...}
似乎是目前最好的解决方案。
我这样做的方法是将对象收集到各种名称空间中,例如:
// Global
Collections = {};
class Article {
static all() {
//returns all articles from db
}
}
_.extend(Collections, { Article });
然后,为了避免在任何地方都使用Collections.Article
,我可以在文件中使用以下内容来访问中的Article
// Make `Article` available
let { Article } = Collections;
我使用的是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和错误的问题,你可以尝试这样的方法:
文章.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();
- ES6构造函数返回基类的实例
- 如何在下面的ES6循环中获得前面的文本
- Meteor如何接收HTTP请求
- Meteor-将选定窗体中的对象添加到集合中
- Meteor上的启动页面
- es6 相当于下划线查找位置
- Meteor方法在客户端返回null,在客户端运行的相同方法返回正确的值
- Meteor-添加用户自定义字段的方法不起作用
- Meteor忘记了密码的实现
- 链接所有<a>Meteor
- 在Meteor项目中安装并包含npm模块后出错
- Meteor JS中代码的重复使用部分
- Meteor Router数据函数被调用两次
- 如何在Javascript/ES6中的Aurelia浏览器应用程序中使用AWS S3
- 基于localStorage的Meteor激活模板
- 如何通过在Meteor中导入不同文件中的es6类来正确使用它们
- ES6/具有继承性的Meteor-Singleton模式
- ES6的箭头函数在Meteor.publish中改变了它的作用域
- ES6 angular-meteor ng-table getData函数未被调用
- 在Meteor中使用ES6导入和导出是否为时过早