Quiero exponer el objeto jQuery al objeto de ventana global al que se puede acceder dentro de la consola del desarrollador en el navegador. Ahora en mi configuración de paquete web tengo las siguientes líneas:
plugins: [
new webpack.ProvidePlugin({
$: 'jquery',
jQuery: 'jquery'
})
]
Estas líneas agregan las definiciones de jQuery a cada archivo en mis módulos de paquete web. Pero cuando construyo el proyecto e intento acceder a jQuery en la consola de desarrollador de esta manera:
window.$;
window.jQuery;
dice que estas propiedades no están definidas ...
¿Hay alguna forma de solucionar este problema?
javascript
jquery
webpack
Ferbolg
fuente
fuente
this: 'window'
también? Dado que muchas bibliotecas asumen que lathis
variable es el objeto WindowRespuestas:
Necesita utilizar el cargador de exposición .
Puede hacer esto cuando lo necesite:
o puede hacer esto en su configuración:
ACTUALIZACIÓN : A partir de webpack 2, debe usar expose-loader en lugar de exponer :
fuente
ProvidePlugin
debe utilizar principalmente en situaciones en las que las bibliotecas de terceros dependen de la presencia de una variable global.{test: /jquery\.js$/, loader: 'expose?jQuery!expose?$'}
$ = require('jquery'); window.jQuery = $; window.$ = $;
? (no necesitaexpose-loader
)module: { rules: [{ test: require.resolve('jquery'), use: [{ loader: 'expose-loader', options: 'jQuery' },{ loader: 'expose-loader', options: '$' }] }] }
. Esta es la única forma en que podría exponer jQuery y está usando la nueva sintaxis de module.rules .ProvidePlugin reemplaza un símbolo en otra fuente a través de la importación respectiva, pero no expone el símbolo en el espacio de nombres global. Un ejemplo clásico son los complementos de jQuery. La mayoría de ellos solo esperan
jQuery
ser definidos globalmente. Con elProvidePlugin
, se aseguraría de que jQuery sea una dependencia (por ejemplo, cargada antes) y la aparición dejQuery
en su código se reemplazará con el equivalente en bruto del paquete webrequire('jquery')
.Si tiene scripts externos que dependen de que el símbolo esté en el espacio de nombres global (como, digamos, un JS alojado externamente, llamadas de Javascript en Selenium o simplemente accediendo al símbolo en la consola del navegador), desea usar el
expose-loader
.En resumen: ProvidePlugin gestiona las dependencias de tiempo de compilación de los símbolos globales, mientras que
expose-loader
gestiona las dependencias de tiempo de ejecución de los símbolos globales.fuente
Parece que el
window
objeto está expuesto en todos los módulos.¿Por qué no solo importar / requerir
JQuery
y poner:Deberá asegurarse de que esto suceda antes de requerir / importar cualquier módulo que haga uso
window.JQuery
, ya sea en un módulo requerido o en el módulo donde se está utilizando.fuente
require
mientras noimport
JQuery
.import
, puede obtener un error, porque losimport
s se ordenan al principio del archivo y losrequire
s permanecen donde se colocaron. Por lo tanto, el orden de ejecución solo cambiaimport
cuando la variable de ventana no está configurada.Esto siempre funcionó para mí. incluido para webpack 3
window.$ = window.jQuery = require("jquery");
fuente
Ninguno de los anteriores funcionó para mí. (y realmente no me gusta la sintaxis del cargador de exposición). En lugar,
Agregué a webpack.config.js:
Que todos los módulos tengan acceso a través de jQuery a través de $.
Puede exponerlo a la ventana agregando lo siguiente a cualquiera de sus módulos incluidos en el paquete web:
fuente
Actualización para Webpack v2
Instale expose-loader como lo describe Matt Derrick:
Luego inserte el siguiente fragmento en su
webpack.config.js
:(de los documentos de expose-loader )
fuente
window.jQuery = require('jquery');
En mi caso funciona
fuente