Ich möchte das jQuery-Objekt für das globale Fensterobjekt verfügbar machen, auf das in der Entwicklerkonsole im Browser zugegriffen werden kann. Jetzt habe ich in meiner Webpack-Konfiguration folgende Zeilen:
plugins: [
new webpack.ProvidePlugin({
$: 'jquery',
jQuery: 'jquery'
})
]
Diese Zeilen fügen jeder Datei in meinen Webpack-Modulen die jQuery-Definitionen hinzu. Aber wenn ich das Projekt erstelle und versuche, auf jQuery in der Entwicklerkonsole wie folgt zuzugreifen:
window.$;
window.jQuery;
es heißt, dass diese Eigenschaften undefiniert sind ...
Gibt es eine Möglichkeit, dies zu beheben?
javascript
jquery
webpack
ferbolg
quelle
quelle
this: 'window'
? Da viele Bibliotheken davon ausgehen, dassthis
Variable das Fensterobjekt istAntworten:
Sie müssen den Expose-Loader verwenden .
Sie können dies entweder tun, wenn Sie es benötigen:
oder Sie können dies in Ihrer Konfiguration tun:
UPDATE : Ab Webpack 2 müssen Sie den Expose-Loader anstelle von Expose verwenden :
quelle
ProvidePlugin
sollte hauptsächlich in Situationen verwendet werden, in denen Bibliotheken von Drittanbietern auf das Vorhandensein einer globalen Variablen angewiesen sind.{test: /jquery\.js$/, loader: 'expose?jQuery!expose?$'}
$ = require('jquery'); window.jQuery = $; window.$ = $;
? (nicht nötigexpose-loader
)module: { rules: [{ test: require.resolve('jquery'), use: [{ loader: 'expose-loader', options: 'jQuery' },{ loader: 'expose-loader', options: '$' }] }] }
. Dies ist die einzige Möglichkeit, jQuery verfügbar zu machen, und es wird die neue Syntax module.rules verwendet .Das ProvidePlugin ersetzt durch den jeweiligen Import ein Symbol in einer anderen Quelle, macht das Symbol jedoch nicht im globalen Namespace verfügbar. Ein klassisches Beispiel sind jQuery-Plugins. Die meisten von ihnen erwarten lediglich eine
jQuery
globale Definition. Mit demProvidePlugin
würden Sie sicherstellen, dass jQuery eine Abhängigkeit ist (z. B. zuvor geladen) und das AuftretenjQuery
in ihrem Code durch das Webpack-Raw-Äquivalent von ersetzt wirdrequire('jquery')
.Wenn Sie externe Skripte haben, die sich darauf verlassen, dass sich das Symbol im globalen Namespace befindet (z. B. ein extern gehostetes JS, Javascript ruft Selen auf oder einfach auf das Symbol in der Browserkonsole zugreift), möchten Sie
expose-loader
stattdessen das verwenden.Kurz gesagt: ProvidePlugin verwaltet Build-Time-Abhängigkeiten zu globalen Symbolen, während das zur
expose-loader
Laufzeit Abhängigkeiten zu globalen Symbolen verwaltet.quelle
Es sieht so aus, als ob das
window
Objekt in allen Modulen verfügbar ist.Warum nicht einfach importieren / benötigen
JQuery
und setzen:Sie müssen sicherstellen, dass dies geschieht, bevor Sie ein Modul benötigen / importieren, das verwendet wird
window.JQuery
, entweder in einem erforderlichen Modul oder in dem Modul, in dem es verwendet wird.quelle
require
nicht verwendet wirdimport
JQuery
.import
, wird möglicherweise eine Fehlermeldung angezeigt, daimport
s oben in der Datei sortiert wird und dortrequire
bleibt, wo sie abgelegt wurden. Die Ausführungsreihenfolge ändert sich also nur,import
wenn das Fenster varaivble nicht festgelegt ist.Das hat bei mir immer funktioniert. einschließlich für Webpack 3
window.$ = window.jQuery = require("jquery");
quelle
Keines der oben genannten hat bei mir funktioniert. (und ich mag die Expose-Loader-Syntax wirklich nicht). Stattdessen,
Ich habe zu webpack.config.js hinzugefügt:
Dann haben alle Module Zugriff über jQuery über $.
Sie können es dem Fenster zugänglich machen, indem Sie jedem Ihrer im Webpack gebündelten Module Folgendes hinzufügen:
quelle
Update für Webpack v2
Installieren Sie den Expose-Loader wie von Matt Derrick beschrieben:
Fügen Sie dann das folgende Snippet in Ihr ein
webpack.config.js
:(aus den Expose-Loader-Dokumenten )
quelle
window.jQuery = require('jquery');
In meinem Fall funktioniert
quelle