Saya ingin mengekspos objek jQuery ke objek jendela global yang dapat diakses di dalam konsol pengembang di browser. Sekarang di konfigurasi webpack saya, saya memiliki baris berikut:
plugins: [
new webpack.ProvidePlugin({
$: 'jquery',
jQuery: 'jquery'
})
]
Baris-baris ini menambahkan definisi jQuery ke setiap file di modul webpack saya. Tetapi ketika saya membangun proyek dan mencoba mengakses jQuery di konsol pengembang seperti ini:
window.$;
window.jQuery;
dikatakan bahwa properti ini tidak ditentukan ...
Apakah ada cara untuk memperbaikinya?
javascript
jquery
webpack
ferbolg.dll
sumber
sumber
this: 'window'
juga? Karena banyak perpustakaan menganggapthis
variabel sebagai objek JendelaJawaban:
Anda perlu menggunakan expose-loader .
Anda dapat melakukan ini saat Anda membutuhkannya:
atau Anda dapat melakukan ini di konfigurasi Anda:
UPDATE : Pada webpack 2, Anda perlu menggunakan expose-loader daripada expose :
sumber
ProvidePlugin
terutama harus digunakan dalam situasi di mana pustaka pihak ketiga bergantung pada keberadaan variabel global.{test: /jquery\.js$/, loader: 'expose?jQuery!expose?$'}
$ = require('jquery'); window.jQuery = $; window.$ = $;
? (tidak perluexpose-loader
)module: { rules: [{ test: require.resolve('jquery'), use: [{ loader: 'expose-loader', options: 'jQuery' },{ loader: 'expose-loader', options: '$' }] }] }
. Ini adalah satu-satunya cara agar jQuery terekspos dan menggunakan sintaks module.rules yang baru .ProvidPlugin menggantikan simbol di sumber lain melalui impor masing-masing, tetapi tidak mengekspos simbol di namespace global. Contoh klasik adalah plugin jQuery. Kebanyakan dari mereka hanya berharap
jQuery
untuk didefinisikan secara global. DenganProvidePlugin
Anda akan memastikan bahwa jQuery adalah dependensi (misalnya dimuat sebelumnya) dan kemunculanjQuery
dalam kode mereka akan diganti dengan webpack mentah yang setararequire('jquery')
.Jika Anda memiliki skrip eksternal yang mengandalkan simbol untuk berada di namespace global (seperti misalnya JS yang dihosting secara eksternal, panggilan Javascript di Selenium atau hanya mengakses simbol di konsol browser), Anda ingin menggunakan
expose-loader
gantinya.Singkatnya: ProvidPlugin mengelola dependensi waktu build ke simbol global, sedangkan dependensi waktu proses ke simbol global
expose-loader
dikelola.sumber
Sepertinya
window
objek diekspos di semua modul.Mengapa tidak hanya mengimpor / membutuhkan
JQuery
dan memasukkan:Anda perlu memastikan bahwa ini terjadi sebelum meminta / mengimpor modul apa pun yang digunakan
window.JQuery
, baik di modul yang memerlukan atau di modul tempat modul itu digunakan.sumber
require
saat tidakimport
JQuery
.import
, Anda mungkin mendapatkan kesalahan, karenaimport
s disortir ke atas file, danrequire
tetap di tempat mereka diletakkan. Jadi run-order hanya berubahimport
jika jendela varaivble tidak disetel.Ini selalu berhasil untuk saya. termasuk untuk webpack 3
window.$ = window.jQuery = require("jquery");
sumber
Semua hal di atas tidak berhasil untuk saya. (dan saya benar-benar tidak suka sintaks expose-loader). Sebagai gantinya,
Saya menambahkan ke webpack.config.js:
Dari semua modul memiliki akses melalui jQuery melalui $.
Anda dapat mengeksposnya ke jendela dengan menambahkan berikut ini ke salah satu modul Anda yang dipaketkan oleh webpack:
sumber
Pembaruan untuk Webpack v2
Instal expose-loader seperti yang dijelaskan oleh Matt Derrick:
Kemudian masukkan cuplikan berikut di Anda
webpack.config.js
:(dari dokumen expose-loader )
sumber
window.jQuery = require('jquery');
Dalam kasus saya berhasil
sumber