2016-08-08 75 views
0

Ich möchte ein "Kern" -Paket erstellen und "Modul/Plugin" -Pakete ähnlich wie accounts-facebook verwendet accounts-base in Meteor.Meteor-Paketbibliothek erstellen?

Hier ist, was ich habe momentan aber es funktioniert nicht:

packages/Projekt: Module-core/package.js:

Package.describe({ 
    name: 'project:modules-core', 
    summary: 'Core package for Modules.', 
    version: '1.0.0' 
}); 

Package.onUse(function (api) { 
    api.versionsFrom('[email protected]'); 

    api.addFiles('lib/core.js', ['client', 'server']); 

    if (api.export) { 
     api.export('HBModule'); 
    } 
}); 

packages/Projekt: Module-core/lib/core.js:

HBModule = (function() { 
    var moduleName = ""; 

    var getShareCount = (function (url) { 

    }); 

    var register = (function (name) { 
    HBModule[name] = name; 
    }); 
}()); 

packages/Projekt: facebook/package.j s:

Package.describe({ 
    name: 'project:facebook', 
    summary: 'Facebook Module.', 
    version: '1.0.0' 
}); 

Package.onUse(function(api) { 
    api.versionsFrom('[email protected]'); 

    api.use('project:modules-core', ['client', 'server']); 

    api.imply('project:modules-core', ['client', 'server']); 

    api.addFiles('lib/facebook.js', ['client', 'server']); 
}); 

packages/Projekt: facebook/lib/facebook.js:

Facebook = (function() { 
    var moduleName = "Facebook"; 

    var getShareCount = (function (url) { 
    return 22; 
    }); 
}()); 

HBModule.register('facebook'); 

Und damit ich ein TypeError: Cannot read property 'register' of undefined Fehler.

Was mache ich falsch?

Danke!

Antwort

1

Die IIFEs (sofort aufgerufene Funktionsausdrücke) geben nichts zurück, daher sind HBModule und Facebook beide undefiniert. Beim Erstellen des HBModuls müssen Sie ein Objekt mit einer register-Eigenschaft zurückgeben, die auf Ihre register-Funktion festgelegt ist.

HBModule = (function() { 
    var moduleName = ""; 

    var getShareCount = (function (url) { 

    }); 

    var register = (function (name) { 
    HBModule[name] = name; 
    }); 

    // return an object that will be assigned to HBModule 
    return { register: register }; 
}()); 

Auch sind die IIFE ist hier nicht erforderlich, da Meteor wird jede Datei sowieso wickeln, und setzen nur die Variablen, die Sie verwenden, ohne (wie HBModule) erklärt; Alle mit var deklarierten Variablen werden auf diese Datei beschränkt.

packages/Projekt: Module-core/lib/core.js:

HBModule = {}; 
var moduleName = ''; 

// assuming you want to expose the getShareCount method as well? 
HBModule.getShareCount = function (url) { 

}; 

HBModule.register = function (name) { 
    HBModule[name] = name; 
}; 

packages/Projekt: facebook/lib/facebook.js:

Facebook = {}; 
var moduleName = 'Facebook'; 

Facebook.getShareCount = function (url) { 
    return 22; 
}; 

HBModule.register('facebook'); 
+0

Das ist genial ! Vielen Dank! Noch eine Frage: Wie würde ich vorgehen, wenn die Module Standardfunktionen verwenden sollen, wenn eine nicht eingestellt ist? Wenn ich zum Beispiel keine "Facebook.getShareCount" -Funktion erstellt habe, wird stattdessen die Funktion "HBModule.getShareCount" verwendet, wenn die erste Funktion aufgerufen wird. –

+0

Danke! Es gibt eine Vielzahl von Möglichkeiten, dies zu tun; Ich würde empfehlen, "Klassen" (prototypische Vererbung) zu verwenden, da ich denke, dass es die Lesbarkeit verbessert. Ich weiß nicht, auf welcher Version von Meteor du stehst, also werde ich das Beispiel für Meteor 1.3+ schreiben: (Du kannst das Äquivalent in früheren Versionen von Meteor machen, aber es wird etwas anders geschrieben). https://gist.github.com/nathantreid/8ef9e734d52b179bee12123ef81b3065 –

+0

Oh Mann, das ist perfekt. Ich danke dir sehr! –