2013-10-21 22 views
6

In un notebook IPython, ci si aspetterebbe che il codice seguente causi il caricamento rapido di Raphael.js nello spazio dei nomi globale.Come caricare Raphael all'interno del notebook IPython, evitando alcuni problemi dovuti a require.js?

from IPython.display import Javascript 

raphael_url = "https://cdnjs.cloudflare.com/ajax/libs/raphael/2.1.0/raphael-min.js" 
Javascript('alert(Raphael);', lib=[raphael_url]) 

Tuttavia, non funziona nelle versioni recenti di IPython che utilizzano require.js. Risulta, Raphael.js, che IPython carica utilizzando jQuery.getScript(), riconosce la presenza di require.js e come tale non si inserisce nello spazio dei nomi globale. Infatti, se si esegue per la prima volta il codice javascript rimuovendo l'oggetto , Raphael non si rende più conto che require.js è presente e si inserisce nello spazio dei nomi globale come vorrei. In altre parole, il codice precedente funziona dopo aver eseguito il seguente:

Javascript('window.define = undefined;') 

Così, l'unico modo in cui sono in grado di ottenere Raphael per caricare all'interno di una versione recente di IPython notebook è di eliminare (o messo da parte) window.define.

Dopo aver identificato il problema, non ho familiarità con require.js per sapere quale parte del software sta agendo contro il protocollo. Raphael sta usando un modo scadente di test per l'esistenza di require.js? Se IPython utilizza direttamente require.js invece di jQuery.getScript() quando carica le librerie javascript fornite dall'utente? O c'è un modo in cui l'utente dovrebbe abbracciare require.js, che mi darà l'oggetto Raphael senza bisogno di alcun hack speciale? (Se la risposta all'ultima domanda è sì, c'è un modo per supportare anche le versioni precedenti del notebook IPython, che non usano require.js?)

risposta

4

La prima parte della mia risposta non piacerà a te, ma il caricamento e il requisito della libreria javascript nell'app per IPython-notebook-web non è stato ancora risolto, quindi per ora suggerirei di non creare molto sulla base del presupposto che è possibile caricare la libreria in questo modo e fare affidamento più su custom.js per adesso.

Detto questo, se raphael non è nello spazio dei nomi globale richiede è abbastanza intelligente per memorizzarlo nella cache e darvi un riferimento. Poi nel richiamata si può semplicemente assegnare a un globale:

require ([ 'Raphael'], la funzione (Raph) { window.raphael = raph; })

O qualcosa del genere dovrebbe fare il trucco.

+0

In realtà, anche caricando raphael.js attraverso i risultati di '$ .getScript()' in ReferenceError: eve non è definito. Sembra che Raphael si aspetti che 'eve' sia nello spazio dei nomi globale, ma non è collocato lì da eve (che fa anche parte di raphael.js) se require.js è presente. –

+0

Allora non ne ho idea. Fa parola se caricato manualmente nella pagina con 'require'? se è così, pubblica uno snippet di JS che invece di usare 'lib =' kw. – Matt

+0

Ho provato a caricare con 'require', ma senza fortuna. Il comando corrente che sto usando (su una riga) è 'Javascript (" require.config ({paths: {Raphael: 'https://cdnjs.cloudflare.com/ajax/libs/raphael/2.1.0/raphael-min .js '}}); require ([' Raphael '], function (raph) {window.Raphael = raph;}); ")' –