Kann ich einen ES6 / 2015-Modulimport verwenden, um eine Referenz im 'globalen' Bereich festzulegen?
Habe ich diese situation, wo ich versuche zu importieren einer vorhandenen Bibliothek, die ich nenne troublesome
(mit Webpack/Babel FWIW) und es hat einen globalen Verweis auf jQuery
im es die ich bin versucht zu lösen mit Modul-syntax.
Habe ich erfolgreich importiert jquery in den "lokalen" Umfang eines Moduls über:
import jQuery from 'jquery'
also habe ich versucht:
import jQuery from 'jquery'
import 'troublesome'
aber vielleicht nicht überraschend, bekomme ich so etwas wie jQuery is not a function
trat zurück von troublesome.js
Habe ich versucht dies auch:
System.import('jquery')
.then(jQuery => {
window.jQuery = jQuery
})
import 'troublesome'
aber, es stellt sich heraus, dass System.import
ist Teil des, so genannten, 'module-loader' spec, gezogen aus dem es6/2015-Spezifikation, so dass es nicht zur Verfügung gestellt von Babel. Es ist ein poly-fillaber Webpack nicht in der Lage sein zu verwalten dynamischer Importe erfolgt über Aufrufe System.import
sowieso.
aber... wenn ich rufe, aus dem die Skript-Dateien in index.html etwa so:
<script src="https://code.jquery.com/jquery-2.1.4.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/troublesome/troublesome.js"></script>
<script src="the-rest-of-my-js.js"></script>
den Verweis auf jQuery
aufgelöst troublesome.js
und die Dinge sind gut,
aber ich würde es vorziehen, zu vermeiden, um die script-tag-route als webpack nicht zu verwalten.
Kann jemand empfehlen, eine anständige Strategie für den Umgang mit Szenarien wie diesem?
update
mit etwas Anleitung von @TN1ck, ich war schließlich in der Lage zu erkennen Webpack-centric-Lösung, mit der Importe-loader
Die Konfiguration dieser Lösung sieht wie folgt aus:
//...
module: {
loaders: [
//...
{
test: require.resolve('troublesome'),
loader: "imports?jQuery=jquery,$=jquery"
}
]
}
InformationsquelleAutor der Frage tony_k | 2015-07-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Shimmen Module ist der Weg zu gehen: http://webpack.github.io/docs/shimming-modules.html
Ich zitiere aus der Seite:
plugin ProvidePlugin
Diese plugin-Modul verfügbar ist, als variable in jedem Modul. Das Modul ist nur erforderlich, wenn Sie verwenden der variable.
Beispiel: $ und jQuery zur Verfügung, die in jedem Modul-ohne das schreiben
require("jquery")
.Verwenden Sie dies mit Ihrem webpack-config fügen Sie einfach dieses Objekt zu einem array namens plugins in der config:
InformationsquelleAutor der Antwort TN1ck
Für es6/2015 habe ich Folgendes getan.
Dann können Sie es als normalen
Hoffe, das hilft.
InformationsquelleAutor der Antwort Val
Importieren
jQuery
in Ihr Modul nicht zur Verfügung stellen für die'troublesome'
. Stattdessen könnten Sie erzeugen einen dünnen wrapper-Modul für'troublesome'
bietetjQuery
und alle anderen erforderlichen "globals".troublesome-module.js:
Dann in Ihrem code, den Sie sollten in der Lage sein, um
InformationsquelleAutor der Antwort Noah Freitas
Ich habe ein ähnliches Problem mit jspm und dygraphs. Die Art, wie ich es gelöst wurde, verwenden Sie die dynamische Belastung, wie Sie versucht, mit
System.import
aber der wichtige Teil war die Kette-Last jeweils aufeinander folgenden "Teil" mitSystem.import
wieder von innen die Versprechen onfulfillment handler (dann) nach der Einstellung der globalen namespace-variable. In meinem Fall hatte ich eigentlich mehrere import-Schritte getrennt zwischenthen
Handler.Der Grund, warum es nicht funktioniert hat mit jspm, und wahrscheinlich der Grund, warum es nicht funktioniert für Sie ist auch, dass die
import ... from ...
syntax ausgewertet wird, bevor code, und auf jeden Fall vorSystem.import
welche async.In Ihrem Fall könnte es so einfach sein wie:
Beachten Sie auch, dass die
System
Modul loader Empfehlung wurde in der letzten ES6-Spezifikation, und eine neue loader Spez erarbeitet.InformationsquelleAutor der Antwort Amit
npm install import-loader
.import 'troublesome'
mitimport 'imports?jQuery=jquery,$=jquery!troublesome
.Meiner Meinung nach, ist dies die einfachste Lösung für deine Frage. Es ist ähnlich wie die Antwort, Sie schrieb in Ihrer Frage @TN1ck, aber ohne änderung der webpack config. Für weitere Informationen, siehe: https://github.com/webpack/imports-loader
InformationsquelleAutor der Antwort thisissami
Shimmen ist in Ordnung und es gibt verschiedene Möglichkeiten der Lösung, aber nach meiner Antwort hierdas einfachste ist eigentlich, nur um wieder zu verwenden, benötigen für das laden der Bibliothek erfordert, dass der Globale Abhängigkeit - dann nur sicherstellen, dass Ihre Fenster. Abtretung vor, dass die require-Anweisung, und Sie sind beide nach Ihrer sonstigen Einfuhren, und Ihre Bestellung sollte bleiben, wie vorgesehen. Das Problem wird verursacht von Babel hissen die Importe, so dass Sie alle ausgeführt werden, bevor anderer code.
InformationsquelleAutor der Antwort Ben Logan