2014-09-24 32 views
6

Sto cercando di refactoring una libreria che utilizza Browserify shimming alcuni moduli dal bundle utilizzando browserify-shim. Nello specifico, la libreria usa require ("codemirror") ma voglio fornire un bundle che non includa CodeMirror, ma ne userò uno fornito via CDN.Shimming dipendenze delle dipendenze con browserify-shim

Così ho browserify-shim config nella mia package.json come

"browserify-shim": { 
    "jquery": "global:jQuery", 
    "codemirror": "global:CodeMirror" 
    } 

Fin qui tutto bene. require ('jquery') e require ('codemirror') sono scomparsi dal bundle browserificato e sono stati sostituiti dallo snippet di codice previsto per estrarre jQuery e CodeMirror dall'oggetto window.

La libreria richiede anche alcuni componenti aggiuntivi CodeMirror. Ad esempio require ('codemirror/addon/hint/show-hint.js'). Va bene. Voglio questo componente aggiuntivo in bundle. Tuttavia, all'interno di questo add-on è un wrapper UMD che include require ("../../ lib/codemirror"). Browserify sta vedendo questo e sta raggruppando il CodeMirror da /node_modules/codemirror/lib/codemirror.js a causa di questo (credo). Voglio che usi window.CodeMirror come definito nello shim codemirror, ma non riesco a capirlo. Hanno provato molte varianti tra cui i seguenti:

"browserify-shim": { 
    "jquery": "global:jQuery", 
    "codemirror": "global:CodeMirror", 
    "../../lib/codemirror": "global:CodeMirror", 
    "codemirror/addon/hint/show-hint.js": { 
     "exports":null, 
     "depends":["../../lib/codemirror:CodeMirror"] 
    } 
    } 

che richiedono ("../../ lib/CodeMirror") non andrà via! Sono sicuro che mi manchi qualcosa.

Sto eseguendo questo da uno script Gulp, ma non penso che dovrebbe fare alcuna differenza. Browserify versione 3.38.1. Browserify-shim versione 3.7.0.

Qualche idea?

+0

Sembra che browserify-shim potrebbe essere stato il modo sbagliato per farlo. L'opzione browserify bundleExternal = false può risolvere il problema. Indagare ... –

+0

bundleExternal = false non è la risposta completa in quanto lascia le istruzioni 'require' iniziali in atto. Quindi browserify-shim come nel primo esempio è ancora necessario. Ma aiuta. Con questa impostazione, posso direttamente .require ('codemirror/addon/hint/show-hint.js') prima di raggruppare nello script Gulp per ottenere l'add-on, ma il requisito esterno di CodeMirror verrà lasciato fuori, sembra . –

+0

Sembra che nell'ultima versione di browserify ci sia la possibilità di applicare {global: true} alla trasformazione di browserify-shim, che farà in modo che funzioni sulle dipendenze! Questo ci permette di ridurre il bisogno ('../../ lib/codemirror') con successo. –

risposta

11

Se si aggiunge browserify-shim con {global: true}, dovrebbe essere applicato a dipendenze le dipendenze (e così via), così, che spera, dovrebbe fare quello che vuoi.

Supponendo che si sta utilizzando browserify prime nella vostra Gulpfile, invece di:

b.transform('browserify-shim'); 

fare:

b.transform({global: true}, 'browserify-shim'); 

Se stai usando gulp-browserify, io non sono sicuro se c'è un modo per specificare trasformazioni globali.

+0

Questo ha fatto il trucco per me. Grazie! – poshaughnessy

+0

Grazie! Questo ha funzionato anche per me. –

-1
{global: true} 

funziona per me ... perché non è questo un difetto?

+1

Anche se questo codice può rispondere alla domanda, fornire il contesto supplementare per _why_ e/o _how_ questo codice risponde alla domanda migliorerebbe significativamente il suo valore a lungo termine . Per favore [modifica] la tua risposta per aggiungere qualche spiegazione . –