Chcę wystawić obiekt jQuery na globalny obiekt okna, który jest dostępny w konsoli programisty w przeglądarce. Teraz w mojej konfiguracji webpacka mam następujące linie:
plugins: [
new webpack.ProvidePlugin({
$: 'jquery',
jQuery: 'jquery'
})
]
Te wiersze dodają definicje jQuery do każdego pliku w moich modułach webpack. Ale kiedy buduję projekt i próbuję uzyskać dostęp do jQuery w konsoli programisty w następujący sposób:
window.$;
window.jQuery;
mówi, że te właściwości są niezdefiniowane ...
Czy jest sposób, aby to naprawić?
javascript
jquery
webpack
ferbolg
źródło
źródło
this: 'window'
też ustawić ? Ponieważ wiele bibliotek przyjmuje, żethis
zmienną jest obiekt WindowOdpowiedzi:
Musisz użyć expose-loader .
Możesz to zrobić, gdy tego potrzebujesz:
lub możesz to zrobić w swojej konfiguracji:
AKTUALIZACJA : Od webpacka 2 musisz użyć expose-loader zamiast expose :
źródło
ProvidePlugin
Powinny przede wszystkim stosować w sytuacjach, w których biblioteki innych firm opiera się na obecności zmiennej globalnej.{test: /jquery\.js$/, loader: 'expose?jQuery!expose?$'}
$ = require('jquery'); window.jQuery = $; window.$ = $;
? (niepotrzebneexpose-loader
)module: { rules: [{ test: require.resolve('jquery'), use: [{ loader: 'expose-loader', options: 'jQuery' },{ loader: 'expose-loader', options: '$' }] }] }
. Jest to jedyny sposób, w jaki mogłem ujawnić jQuery i używa nowej składni module.rules .ProvidePlugin zastępuje symbol w innym źródle poprzez odpowiedni import, ale nie uwidacznia symbolu w globalnej przestrzeni nazw. Klasycznym przykładem są wtyczki jQuery. Większość z nich oczekuje,
jQuery
że zostaną zdefiniowane globalnie. Dzięki temuProvidePlugin
upewnisz się, że jQuery jest zależnością (np. Załadowana wcześniej), a występowaniejQuery
w ich kodzie zostanie zastąpione surowym odpowiednikiem pakietu webpackrequire('jquery')
.Jeśli masz zewnętrzne skrypty opierające się na tym, że symbol znajduje się w globalnej przestrzeni nazw (jak powiedzmy zewnętrznie hostowany JS, wywołania JavaScript w Selenium lub po prostu uzyskując dostęp do symbolu w konsoli przeglądarki), chcesz użyć
expose-loader
zamiast tego.W skrócie: ProvidePlugin zarządza zależnościami czasu kompilacji od symboli globalnych, podczas gdy
expose-loader
zarządza zależnościami czasu wykonywania od symboli globalnych.źródło
Wygląda na to, że
window
obiekt jest widoczny we wszystkich modułach.Dlaczego nie po prostu zaimportować / wymagać
JQuery
i umieścić:Będziesz musiał upewnić się, że dzieje się to przed zażądaniem / zaimportowaniem dowolnego modułu, który używa
window.JQuery
, w wymagającym module lub w module, w którym jest używany.źródło
require
gdy nieimport
JQuery
.import
, możesz otrzymać błąd, ponieważimport
s są sortowane na początek pliku irequire
pozostają tam, gdzie zostały umieszczone. Tak więc kolejność uruchamiania zmienia się tylkoimport
wtedy, gdy zmienna okna nie jest ustawiona.To zawsze działało dla mnie. w tym dla webpacka 3
window.$ = window.jQuery = require("jquery");
źródło
Żadne z powyższych nie działało dla mnie. (i naprawdę nie podoba mi się składnia expose-loader). Zamiast,
Dodałem do webpack.config.js:
Wszystkie moduły mają dostęp poprzez jQuery poprzez $.
Możesz wyświetlić go w oknie, dodając następujące elementy do dowolnego z modułów w pakiecie webpack:
źródło
Aktualizacja dla Webpack v2
Zainstaluj program ładujący ekspozycję zgodnie z opisem Matta Derricka:
Następnie wstaw następujący fragment do swojego
webpack.config.js
:(z dokumentacji expose-loader )
źródło
window.jQuery = require('jquery');
W moim przypadku działa
źródło