Metodi per strutturare gli SDK JavaScript

2

Ho creato un'API REST e ho utilizzato i modelli Backbone in un paio di applicazioni diverse per comunicare con esso.

Mi piacerebbe davvero creare un singolo SDK JS che possa essere utilizzato in qualsiasi applicazione che contenga quel codice riutilizzabile.

Ho iniziato creando un npm, bower e component.json in modo che possa essere facilmente installato.

Da quello che posso raccogliere l'obiettivo è creare un singolo oggetto collegato a window per l'accesso all'interno di altre applicazioni. A quel punto, tutto viene incapsulato.

Ho un paio di domande e dubbi:

  1. C'è qualcosa che devo evitare per evitare conflitti con altre librerie?
  2. Come gestisco le dipendenze? Dovrei incapsularli o far sapere all'utente che devono aggiungerlo?
  3. Esistono metodi per strutturare gli SDK che offrono vantaggi simili, ad esempio, a MVC in un'app Web?

NOTA: se questa domanda non segue le linee guida per programmers.stackexchange.com, fornisci indicazioni su come cambiarlo anziché chiuderlo. Grazie mille.

    
posta Matt 06.05.2014 - 08:22
fonte

1 risposta

1
  1. Is there anything I need to avoid to prevent conflicts with other libraries?

La risposta semplice è forse, a seconda della situazione.

Esempio

jQuery per impostazione predefinita si aggiunge come jQuery sull'oggetto window e $ . Mentre è improbabile che un'altra libreria chiamerà se stessa jQuery (ne parleremo più avanti), il $ globale è in realtà una scorciatoia abbastanza comune.

Quello che fa jQuery è salvare le variabili $ e jQuery internamente e alla chiamata $.noConflict() ripristinerà le precedenti variabili impostate. [Riferimento]

Ecco un modo molto semplice per programmare questo:

var jQuery = function(){ return 1; };

(function()
{
    var _jQuery = jQuery;


    jQuery = function()
    {
        return 2;
    }

    jQuery.noConflict = function()
    {
        jQuery = _jQuery;
    }
})();

//Prints "2"
console.log(jQuery());

var jQuery2 = jQuery;
jQuery2.noConflict();

//Prints "1"
console.log(jQuery());

//Prints "2"
console.log(jQuery2());

Le mie domande sarebbero:

  • Vuoi utilizzare una variabile globale comune (ad esempio $ )?
  • Quali tipi di scenari vedi con le persone che lavorano con la tua libreria?

Se il tuo SDK utilizzerà una variabile globale comune e pensi che le persone potrebbero utilizzare una dozzina di librerie diverse mentre usi il tuo codice, potresti prenderlo in considerazione. Noterò che se progetti bene il tuo oggetto / funzione, non dovrebbe essere difficile aggiungere una funzionalità simile a quella che ho mostrato più avanti nel tuo progetto.

  1. How do I handle dependencies? Should I encapsulate them or let the user know they have to add it?

Di quante dipendenze pensi di aver bisogno? Le dipendenze sono abbastanza comuni (ad esempio jQuery)?

Personalmente, se ci sono una o due dipendenze, vorrei semplicemente dichiararlo in docs per il tuo SDK. Non è necessario che tu esca e tieni una copia delle tue dipendenze internamente mantenuta e testata.

La maggior parte dei plugin jQuery richiede jQuery (ovviamente) ma non lo raggruppa semplicemente perché non è necessario. Generalmente questi plug-in indicano una versione minima di jQuery che supportano / hanno testato ma non molto oltre.

Detto questo, il raggruppamento può essere utile specialmente se l'API della dipendenza non è molto stabile. C'è una libreria che ho usato chiamata Kalendae che raggruppa Moment. js . In questo caso, ho trovato abbastanza utile il pacchetto.

Ci sono degli svantaggi nel raggruppare i collegamenti al tuo primo punto, possono causare conflitti se la persona include già una particolare versione della libreria XYZ . Se fai il bundle, fallo in modo da creare il minimo disturbo per gli sviluppatori futuri.

Senza sapere quali sono le tue specifiche dipendenze, non posso davvero aiutarti a capire se nel tuo caso dovresti raggruppare o meno.

  1. Are there any methods of structuring SDKs that provide similar benefits to, say, MVC within a web app?

Non sono esattamente ciò che stai chiedendo qui in relazione alla struttura dell'SDK in MVC all'interno di un'app Web.

A seconda di ciò che fa il tuo SDK e di come le persone verrebbero probabilmente integrate con esso spiegherebbe il modo migliore per strutturarlo.

In termini di cose generali da fare:

  • Riduci al minimo le variabili globali. È possibile includere il codice in una chiusura per evitare di farlo (a seconda di come si sta fuori il tuo codice).
  • Consenti la flessibilità consentendo i callback e gli eventi. Dato che stai facendo un'API REST, potresti voler esaminare JS Promises. Ci sono molte librerie che forniscono tale funzionalità e speriamo presto, i browser forniranno questo in modo nativo. [Ulteriori informazioni su futures / promesse / ritardo in Informatica]
  • Consentire una facile configurazione / opzioni da passare alle tue funzioni. Mentre può essere utile aggiungere 20 diverse funzioni sul tuo oggetto che configurano un gruppo di impostazioni, è molto più semplice consentire all'utente di scaricare un oggetto JS in un costruttore o un'altra funzione per eseguire tutto in una volta.

Se puoi spiegare di più su quel terzo punto, potrei essere in grado di fornire una risposta migliore.

Nota

Ho detto che un'altra libreria non si chiamerebbe jQuery nello spazio globale. Mentre in genere ciò sarebbe vero, se la persona utilizza due diverse versioni di jQuery nella stessa pagina (credetemi, succede), allora si verrebbero a trovare dei problemi. Per impostazione predefinita, la chiamata di $.noConflict() risolverà solo il riferimento $ nello scope globale, tuttavia $.noConflict ha un parametro opzionale anche per fare la stessa cosa sull'oggetto jQuery .

    
risposta data 24.10.2014 - 13:08
fonte

Leggi altre domande sui tag