Domanda

Ho creato un widget di jQuery UI, che dipende da alcuni altri moduli JavaScript personalizzate. Prendo questi moduli usando requirejs durante il metodo "_create" del widget. Questo in realtà funziona benissimo se, ho i miei consumatori finali definiscono la mia proprietà "Dati-principali". Tuttavia, nella situazione in cui i consumatori utilizzano i miei requirejs per conto proprio, e definendo i propri "dati-main" proprietà, questo non funziona.

Dal momento che sto usando requirejs agli script Iniettare tramite il mio widget da un server di totalmente diverso, mi imbatto in qualche problema con il normale modo di trattare con questo di requirejs.

  • In primo luogo, non è possibile utilizzare un file package.json a meno che io supporre che tutti i miei consumatori hanno un package.json che contiene precise le stesse risorse come ho. In cima a quello, ho DEV, Test e server CODICE URL da affrontare.
  • In secondo luogo non posso usare require.config per impostare il mio baseurl durante un carico sul loro server, causa si può rompere tutto ciò che stanno utilizzando per richiedono.

L'implementazione corrente che ho a lavorare richiede al consumatore di aggiungere un riferimento script per richiedere con il mio dati di posizione-principale (server esterno). Quindi aggiungere un ref script per il mio widget di (server esterno). Questo funziona perché nessun altro alla mia azienda ha mai nemmeno sentito parlare di requirejs :). Il secondo mi metto li mostra come impacchettare tutto il loro codice in JavaScript riutilizzabile moduli mia soluzione è rotto.

Voglio trovare una soluzione, mentre il consumatore finale può semplicemente fare riferimento il mio unico JavaScript del widget, che a sua volta carica tutto ciò di cui ha bisogno per funzionare.

Qualche suggerimento su come fare questo? Ho pensato di hacking la mia versione di richiedere con un data-principali statici, quindi dare per scontato che possano avere requirejs più librerie. Mi dispiacerebbe farlo ... ma non posso davvero pensare a un modo migliore.

È stato utile?

Soluzione

Ecco quello che sto per fare ...

Un paio di note:

  • Sto utilizzando il widget di jQuery UI modello di fabbrica (ma questo non è esattamente un widget)
  • Le vite codice del widget su un server remoto e consumatori unico riferimento che, non scaricarlo
  • sto usando requirejs per caricare widget di dipendenze
  • voglio la massima facilità d'uso-per lo sviluppatore che consumano

Dal momento che è necessario che la mia jQuery UI Widget caricare al più presto in modo che il consumatore ha il contesto del widget subito ($ (selector) .mywidget) ho deciso di affrontare il mio problema all'interno del metodo _create.

Questo codice installa fondamentalmente requirejs se non esiste, quindi utilizza per installare una serie di requisiti che i suddetti Widget bisogno di consumare. Questo mi permette di presumere che l'utente finale può fare riferimento la mia "widget di" sceneggiatura di URL, virare su un " Dati-requiremodule " attributo con lo stesso nome, e ottenere un elenco completo delle dipendenze remote.

 _create: function () {
   var widget = this;
   widget._establish(widget, function () {
     widget._install(widget);
   });
 },

 _getBaseURL: function (scriptId, callback) {
   var str = $('script[data-requiremodule="' + scriptId + '"]').attr('src');
   if (callback) callback(str.substring(str.search(/scripts/i), 0));
 },       

 _require: function (requirementAry, baseUrl, callback) {
   require.config({ baseUrl: baseUrl });
   require(requirementAry, function () {
     if (callback) callback();
   });
 },

 _establish: function (widget, callback) {
   if (typeof require === 'undefined') {
     widget._getBaseURL(widget._configurations.widgetName, function (baseUrl) {
       var requireUrl = baseUrl + 'scripts/require.min.js';
       baseUrl = baseUrl + 'scripts/';
       $.getScript(requireUrl, function (data, textStatus) {
         widget._require(widget._configurations.requiredLibs, baseUrl, function () { 
           callback(textStatus); 
         });
       });
     });
   }
 },

Non sto mostrando le mie "_configurations" oggetto qui ... ma si ottiene l'idea. Spero che questo aiuta a qualcun altro oltre a me:).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top