2015-03-16 4 views
75

Ich möchte jQuery-Objekt zu dem globalen Fensterobjekt verfügbar machen, das in der Entwicklerkonsole im Browser zugänglich ist. Jetzt in meinem webpack Config Ich habe folgende Zeilen:Expose jQuery zu echten Window-Objekt mit Webpack

plugins: [ 
       new webpack.ProvidePlugin({ 
        $: 'jquery', 
        jQuery: 'jquery' 
       }) 
      ] 

Diese Linien fügen Sie die jQuery-Definitionen für jede Datei in meinem webpack Module. Aber wenn ich das Projekt erstellen und versuchen jQuery in Entwickler-Konsole wie folgt zugreifen:

window.$; 
window.jQuery; 

es sagt, dass diese Eigenschaften nicht definiert sind ...

Gibt es eine Möglichkeit, dies zu beheben?

+1

Kann ich '' 'this: 'window'''' auch einstellen? Da viele Bibliotheken davon ausgehen, dass '' '' diese '' 'Variable das Window-Objekt ist –

Antwort

106

Sie müssen die expose-loader verwenden.

npm install expose-loader --save-dev 

Entweder können dies tun, wenn Sie es benötigen:

require("expose?$!jquery"); 

oder Sie können dies in der Config tun:

loaders: [ 
    { test: require.resolve('jquery'), loader: 'expose?jQuery!expose?$' } 
] 

UPDATE: Ab webpack 2, Sie muss verwendet werden expose-loader statt aussetzen:

+8

Das' ProvidePlugin' sollte hauptsächlich in Situationen verwendet werden, in denen Bibliotheken von Drittanbietern auf das Vorhandensein einer globalen Variablen angewiesen sind. –

+0

Ich machte die falsche Annahme, dass die Frage das Bereitstellen-Plugin für "faule" Zwecke verwendete, die ich online gesehen habe, aber Sie sind richtig :) –

+0

@MattDerrick, danke, es funktionierte in meinem Fall. – ferbolg

47

Das ProvidePlugin ersetzt ein Symbol in einer anderen Quelle durch den entsprechenden Import, stellt jedoch das Symbol im globalen Namespace nicht zur Verfügung. Ein klassisches Beispiel sind jQuery-Plugins. Die meisten von ihnen erwarten nur, dass jQuery global definiert wird. Mit der ProvidePlugin würden Sie sicherstellen, dass jQuery eine Abhängigkeit ist (z. B. zuvor geladen) und das Auftreten von jQuery in ihrem Code durch das Webpack-Rohequivalent von require('jquery') ersetzt würde.

Wenn externe Skripts darauf angewiesen sind, dass sich das Symbol im globalen Namespace befindet (z. B. ein extern gehosteter JS, Javascript in Selenium aufruft oder einfach auf das Symbol in der Browserkonsole zugreift), verwenden Sie stattdessen expose-loader.

Kurz gesagt: ProvidePlugin verwaltet Build-Time-Abhängigkeiten zu globalen Symbolen, während expose-loader Laufzeitabhängigkeiten zu globalen Symbolen verwaltet.

+1

Danke für die Erklärung – Foton

2

In meinem Fall arbeitet

{ test: require.resolve("jquery"), loader: "expose?$!expose?jQuery" } 
21

Sieht aus wie das window Objekt in allen Modulen ausgesetzt ist.

Warum nicht nur Import/erfordern JQuery und setzen:

window.$ = window.JQuery = JQuery; 

in Ihrem Einstiegspunkt-Modul?

+0

Einfachste Lösung, ohne eine neue Abhängigkeit hinzuzufügen. Vielen Dank! – fatihpense

+0

Das wird nicht funktionieren, wenn andere verschachtelte Module die Variable verwenden, nur 'nicht definiert' – aboutqx

+2

Nun, es funktioniert, wenn 'require' verwendet wird, während nicht' import' – aboutqx

1

Update für Webpack v2

expose-loader installieren, wie von Matt Derrick beschrieben:

npm install expose-loader --save-dev 

Dann das folgende Snippet eingefügt in Ihrem webpack.config.js:

module.exports = { 
    entry: { 
     // ... 
    }, 
    output: { 
     // ... 
    }, 
    module: { 
     loaders: [ 
       { test: require.resolve("jquery"), loader: "expose-loader?$!expose-loader?jQuery" } 
     ] 
    } 
}; 

(vom expose-loader docs)

2

Das hat immer für mich funktioniert. einschließlich für webpack 3window.$ = window.jQuery = require("jquery");