Sto tentando di caricare la libreria Highcharts utilizzando uno shim in RequireJS. Tuttavia, quando carica Highcharts, genera un'eccezione perché non può accedere ai metodi jQuery da cui dipende.Caricamento Highcharts tramite shim utilizzando RequireJS e mantenimento della dipendenza jQuery
L'richiedono configurazione assomiglia così:
require.config({
baseUrl: "js",
shim: {
'libs/highcharts/highcharts.src.js': {
deps: ['jquery'],
exports: function(jQuery)
{
this.HighchartsAdapter = jQuery;
return this.Highcharts;
}
}
}
});
L'eccezione che viene generata è:
Uncaught TypeError: undefined is not a function
ed è con riferimento a questa linea:
dataLabels: merge(defaultLabelOptions, {
La questione è la chiamata merge
, che alla fine si associa a jQuery (o qualche altro adattatore che Highch supporti artistici; ma sto usando solo jQuery).
Non sono sicuro di come assicurarsi che Highcharts abbia accesso a jQuery utilizzando RequireJS e shim.
Qualcuno ha mai utilizzato RequireJS e Highcharts in precedenza? Immagino che il problema non sia specifico per i grafici highcharts, ma qualsiasi libreria che abbia altri tipi di dipendenze.
Grazie in anticipo per qualsiasi consiglio o punto nella direzione corretta!
Per aggiungere ulteriore contesto, nella speranza che qualcuno che abbia familiarità con require.js o spessori sarà in grado di aiutare, senza dover essere troppo intimamente familiare con Highcharts, ecco qualche fonte che imposta questo metodo merge
in Highcharts
var globalAdapter = win.HighchartsAdapter,
adapter = globalAdapter || {},
// Utility functions. If the HighchartsAdapter is not defined,
// adapter is an empty object
// and all the utility functions will be null. In that case they are
// populated by the
// default adapters below.
// {snipped code}
merge = adapter.merge
// {snipped code}
if (!globalAdapter && win.jQuery) {
var jQ = win.jQuery;
// {snipped code}
merge = function() {
var args = arguments;
return jQ.extend(true, null, args[0], args[1], args[2], args[3]);
};
// {snipped code}
}
l'oggetto win
è un riferimento istituito per window
all'inizio dello script. Quindi, pensavo che l'aggiunta di window.jQuery = jQuery;
al metodo di esportazione sullo shim avrebbe comportato l'estrazione dei riferimenti jQuery da diagrammi elevati; ma non è stato così.
Ancora una volta, qualsiasi intuizione, informazioni, consigli o suggerimenti sarebbero apprezzati a questo punto - Sono completamente a corto di perdite e comincio a chiedermi se valga la pena provare a implementare e il sistema di pacchetti AMD nel browser javascript.
Dopo aver accettato la risposta da pabera seguito ho ritenuto opportuno aggiornare la mia domanda a riflettere su come la sua risposta ha aiutato la mia soluzione (anche se, è fondamentalmente la sua risposta).
RequireJS utilizza "percorsi" per trovare librerie che non sono supportate da "AMD" e le carica nella pagina. l'oggetto "shim" consente di definire le dipendenze per le librerie definite nei percorsi. Le dipendenze devono essere caricate prima che requirejs proverà a caricare lo script dipendente.
La proprietà exports fornisce un meccanismo per indicare a requirejs come determinare se la libreria è stata caricata. Per librerie di base, come jQuery, spina dorsale, socketio, ecc tutti esportano una parte variabile livello di finestra (Backbone
, io
, jQuery
e $
, ecc). Fornisci semplicemente tale nome di variabile come proprietà exports
e requirejs sarà in grado di determinare quando viene caricata la lib.
Una volta terminate le definizioni, è possibile utilizzare la funzione requirejs
'define
come previsto.
Ecco il mio esempio require.config
oggetto:
require.config({
baseUrl: "/js/",
paths: {
jquery: 'jquery',
socketio: 'http://localhost:8000/socket.io/socket.io', //for loading the socket.io client library
highcharts: 'libs/highcharts/highcharts.src',
underscore: 'libs/underscore',
backbone: 'libs/backbone'
},
shim: {
jquery: {
exports: 'jQuery'
},
socketio: {
exports: 'io'
},
underscore: {
exports: '_'
},
backbone: {
deps: ['jquery', 'underscore'],
exports: 'Backbone'
},
highcharts: {
deps: ['jquery'],
exports: 'Highcharts'
}
}
});
Come pabera accennato prima, questo è per la versione Require.JS
2.0.1
.
Spero che qualcuno ne approfitti; So che la strada mi ha bloccato per un po '; quindi spero che ti abbiamo impedito di sbattere la testa nello stesso punto nel muro che abbiamo fatto, postando questo.
Darò uno scatto e vedrò cosa mi viene in mente; Grazie per la risposta! –
Io uso 'require.js 2.0.1', nel caso sia importante. Buona fortuna – pabera
Ho cambiato l'uso del normale require.js (invece di w/jquery) e ho usato lo shim jQuery, con la spiegazione/esempio di percorsi/shim. dopo aver letto la documentazione ancora una volta, ora capisco cosa sta succedendo - grazie mille! –