2015-04-16 4 views
6

scoped Nach den browserify-shim docs, können Sie angeben, welche Globals browserify-Shim aus Ihrem alten Module aussetzen muss durch die folgende Syntax in Ihrem package.json mit:browserify-Shim nicht implizite Globals exportieren, wenn sie var

{ 
    "browserify-shim": { 
     "legacyModule": "myVar" 
    } 
} 

ich mag die Legacy-Modul über require('legacyModule') und window.myVar zugänglich sein.

Aus meiner Erfahrung, wenn das nicht-Commonjs Modul I zu Shim versuchen verwendet window.myVar = x oder nur myVar = x wird das Modul weltweit ausgesetzt und sind über require() als erwartet.

jedoch, wenn das Legacy-Modul var myVar = x verwendet, das ist, was das Problem verursacht, wenn das Modul dann über require('legacyModule') und nicht über window.myVar nur zugänglich ist.

Die browserify-shim documentation besagt, dass:

Zusätzlich übernimmt er die folgenden realen Grenzfälle:

  • Module, die eine var foo = ... auf der Skriptebene deklarieren nur und annehmen, dass es auf die beigefügten wird window Objekt. Denn der einzige Weg, den sie jemals führen werden, ist im globalen Kontext - "ahem, ... NEIN ?!"
+0

Sie sind derjenigediejenigedasjenige, Legacy-Module mit browserify Bündelung? Wenn nicht, wie werden sie in Ihre Seite integriert? – JMM

+0

Ja, sie werden mit Browserify gebündelt. –

+0

Was genau möchten Sie tun ?: A) Nur in der Lage zu sein ('LegacyModule') 'in Ihren browserifizierten Modulen, oder B) auch auf' window.myVar' zugreifen zu können? – JMM

Antwort

5

Als @EvanDull vorgeschlagen, glaube ich browserify-Shim kann eigentlich nicht ausgelegt werden, dass die Art und Weise zu arbeiten und die Dokumentation fehlt Klarheit darauf. Im Debugging, die ich getan habe, habe es nicht scheint, dass browserify-Shim ausgelegt ist eine globale Variable gesetzt, wenn es „Griffe“ var foo = .... Wo die Dokumentation sagt, es behandelt, dass ich glaube, es heißt, es behandelt sie nicht bereits auf das globale Objekt gesetzt wird, und es wird den Wert dieser Variablen für Commonjs noch exportieren, zum Beispiel var foo = ...; module.exports = foo;, so dass es require() ‚d sein kann. Während Sie es var foo = ...; window.foo = module.exports = foo; tun mögen Und natürlich, da es nicht tut und browserify hüllt den Legacy-Code in einer Funktion, schafft var foo eine lokale Variable nur.

Es gibt eine Reihe von möglichen Abhilfen Sie in der Lage sein können, jetzt nutzen:

  • Wenn Sie nichts dagegen haben, die Legacy-Skripte bearbeiten, können Sie nur die var löschen und das sollte sich darum kümmern .

  • Sie könnten die Legacy-Skripts über separate <script> Tags abrufen, anstatt sie zu bündeln.

  • Sie könnten eine browserify-Transformation verwenden, um eine zusätzliche Zuweisung global.myVar = myVar am Ende des Legacy-Skripts hinzuzufügen. Dazu müssten Sie die Transformation für jedes spezifische Skript anpassen, für das Sie sie benötigen.

  • Sie könnten die erste Datei in Ihrem Paket enthält ein Skript, das wie etwas tut machen:

    [['legacyModule, 'myVar'], ...].forEach(function (mod) { 
        window[mod[1]] = require(mod[0]); 
    }); 
    
+1

Danke für Ihre Antwort. Ich stelle fest, dass alle browsergesteuerten Module in Funktionen eingepackt sind, aber nach meinem Verständnis ist das Problem des Exports von Globalen aus Legacy-Bibliotheken (und das Definieren ihrer Abhängigkeiten) der einzige Grund, warum browserify-shim existiert. Ich weiß, dass es hacky Wege gibt, dieses Problem anzugehen (d. H. Var-Anweisung zu entfernen oder explizit zum Fenster hinzuzufügen), aber für mich scheint das den Zweck der browserify-shim-Bibliothek weitgehend zu besiegen. –

+0

Beachten Sie auch die Dokumentation zu browserify-shim: "Darüber hinaus behandelt browserify-shim die folgenden praktischen Randfälle: Module, die einfach eine var foo = ... auf der Skriptebene deklarieren und annehmen, dass sie an das Fensterobjekt angehängt wird Da die einzige Art und Weise, in der sie jemals ausgeführt werden, im globalen Kontext ist - 'ahem, ... NEIN ?!' ... "(Zitat aus der Dokumentation). In ihrem Beispiel verweisen sie auf eine Variable, die mit dem Schlüsselwort var definiert ist: var foo = ...; –

+0

@Brian ah, guter Punkt. Kannst du eine Minimalreproduktion wie http://plnr.co/ oder GitHub posten? Wo sind die Legacy-Skripte im Dateisystem gespeichert? – JMM

Verwandte Themen