簡體   English   中英

如何通過在Meteor中導入es6類在不同的文件中正確使用它們?

[英]How to properly use es6 classes in different files by importing them in Meteor?

我最近發現了Meteor,我正在努力在新的Meteor項目中使用ES6類和導入。 我想要做的是擁有一個復雜的類結構,從Meteor事件/方法/助手調用哪些方法。 我通過編寫命令$ meteor add grigio:babel添加到項目中,並且它正常工作。

我想要實現的例子:

在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在方法文件中ReferenceError: Article is not defined ,這是足夠的。 所以我有三個選擇:在一個文件中編寫所有類,將所有類附加到全局對象或使用像Browserify這樣的好模塊系統。 顯然,第三種選擇更好。

但是我該如何使用呢? Babel默認將exportimport轉換為Browserify,並且Meteor在頁面刷新時引發require is not defined error。 在谷歌搜索問題之后,我沒有找到關於如何將Browserify添加到Meteor的明確解決方案。 我應該向Meteor添加一個npm包支持,添加一個nify包browserify並在我導入/導出任何內容的每個頁面上手動添加到Meteor嗎? 或者我應該使用完全不同的方法? 這個任務通常如何在Meteor中處理? 謝謝!

我之前正在閱讀這篇文章,並在github上發現這個問題可能有所幫助。

基本上只是將類分配給一個暴露給客戶端和服務器的變量(lib / both / 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和錯誤的問題,你可以嘗試這樣的事情:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM