2015-03-31 11 views
7

Ho scoperto di recente Meteor e sto lottando con l'utilizzo delle classi ES6 e le importazioni in un nuovo progetto Meteor. Quello che voglio fare è avere una struttura complessa di classi, i quali metodi vengono chiamati dagli eventi/metodi/helper di Meteor. Ho aggiunto Babel.js al progetto scrivendo un comando $ meteor add grigio:babel e funziona correttamente.Come utilizzare correttamente le classi es6 in file diversi importandoli in Meteor?

esempio di quello che sto cercando di realizzare:

nel server/modelli/article.js:

class Article { 
    static all() { 
    //returns all articles from db 
    } 
} 

nel server/metodi/articles.js:

Meteor.methods({ 
    allArticles: { 
    Article.all(); 
    } 
}) 

Having ciò solleva ReferenceError: Article is not defined in un file di metodi, che è adeguato. Quindi ho tre opzioni: scrivere tutte le classi in un file, aggiungere tutte le classi a un oggetto globale o utilizzare un buon sistema di moduli come Browserify. Ovviamente, la terza opzione è migliore.

Ma come si usa? Babel converte export, import in Browserify per impostazione predefinita e Meteor solleva un errore require is not defined all'aggiornamento della pagina. Dopo aver cercato su Google il problema, non ho trovato una soluzione chiara su come aggiungere Browserify a Meteor. Dovrei aggiungere un pacchetto npm per il supporto a Meteor, aggiungere un pacchetto npm di browserify e aggiungerlo manualmente a Meteor in ogni pagina in cui importare/esportare qualcosa? O dovrei usare un approccio completamente diverso? Come viene generalmente gestita questa attività in Meteor? Grazie!

+0

utilizzare l'estensione .es6 invece di .js di qualsiasi file che contengono il codice ECMAScript ES6 2015. Questo ha corretto un ReferenceError simile per me. Se funziona per te, aggiungerò questo commento come risposta. –

risposta

13

Stavo leggendo su questo in precedenza e ho trovato this issue su github che può aiutare.

essenzialmente solo assegnare la classe a una variabile che è esposto sia al client e server (lib/sia/etc dipende dal vostro struttura del file). Così:

Article = class Article {...} 

Sembra essere la soluzione migliore al momento.

+2

Sfortunatamente l'uso mostra semplicemente l'articolo in uno spazio dei nomi globale, che porta all'inquinamento dello spazio dei nomi. Quindi, se vado su un percorso globale, preferirei usare un namespace, come 'website.Article = class Article {...}' – cbrwizard

+0

Infatti. Ancora non è una soluzione irragionevole, potrebbe essere sufficiente per un lungo periodo di tempo. –

+0

Meteor 1.2 lo supporterà. ["Sostituiremo il sistema di creazione dei nomi di Meteor, pre-ES15, con moduli ES15 splendenti e moderni."] (Http://info.meteor.com/blog/whats-coming-in-meteor-12-and-beyond) – corvid

4

Il mio modo di fare questo è quello di raccogliere gli oggetti insieme in vari spazi dei nomi, ad esempio:

// Global 
Collections = {}; 
class Article { 
    static all() { 
    //returns all articles from db 
    } 
} 

_.extend(Collections, { Article }); 

Poi, per evitare di dover utilizzare Collections.Article ovunque posso utilizzare il seguente nel file ho bisogno di accesso Article in:

// Make `Article` available 
let { Article } = Collections; 
+0

non è sicuro di seguire il let {Article} = Collections, ti preoccupi di espandere un po'? –

+0

Sicuro. È un compito di destrutturazione di oggetti - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment –

1

sto usando Meteor 1.4.1.1 e l'errore rimane, non riproducibili se il vostro approccio. Tuttavia, ci sono alcuni nuovi modi per utilizzare le classi ES6 ora:

1. Esportare la classe come una costante (ad esempio per l'uso come un oggetto Singleton):

class MyModuleInternalClassName { 
    //... class internals 
} 
export const PublicClassName = new MyModuleInternalClassName(); 

È possibile importare questo uno via

import {PublicClassName} from 'path/to/PublicClassFileName.js'; 

2.Esportare la classe direttamente come del modulo predefinito

export default class PublicClassName { 
    //... class internals 
} 

e quindi importarlo (come con la sopra uno) come il seguente

import {PublicClassName} from from 'path/to/PublicClassFileName.js'; 
let myInstance = new PublicClassName(); 

++++++++++++ +++++++++++++++++++++

quanto riguarda la questione del PO e l'errore, si può provare qualcosa di simile:

Article.js

class InternalArticle { 
    constructor(){ 
    //setup class 
    } 

    all() { 
    //returns all articles from db 
    } 
    register(article){ 
    //add article to db 
    } 
} 
export const Article = new InternalArticle(); 

importazione e utilizzare il Singleton

import {Article} from 'path/to/Article.js'; 

//either register some article 
Article.register(someArticle); 


//or get all your articles 
const allArticles = Article.all(); 
+0

Ciò causa ancora 'MyClass è undefined' per me ... – afkatja

+0

Come lo si importa ? – Jankapunkt

+0

@afkatja Ho migliorato la mia risposta. Questo ti aiuta con il tuo problema? Forse altrimenti dovresti creare una nuova domanda su SO. – Jankapunkt

Problemi correlati