javascript - ejemplo - innerhtml jquery
Exponga jQuery a un objeto de ventana real con Webpack (7)
Quiero exponer el objeto jQuery al objeto de la ventana global que es accesible dentro de la consola del desarrollador en el navegador. Ahora en mi configuración webpack 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 del desarrollador de esta manera:
window.$;
window.jQuery;
dice que estas propiedades no están definidas ...
¿Hay alguna manera de arreglar esto?
En mi caso funciona
{ test: require.resolve("jquery"), loader: "expose?$!expose?jQuery" }
Esto siempre funcionó para mí.
incluido para la
window.$ = window.jQuery = require("jquery");
paquete web 3.
window.$ = window.jQuery = require("jquery");
Nada de lo anterior funcionó para mí. (y realmente no me gusta la sintaxis de expose-loader). En lugar,
Agregué a webpack.config.js:
var webpack = require(''webpack'');
module.exports = {
plugins: [
new webpack.ProvidePlugin({
$: ''jquery'',
})
]
}
Que todos los módulos tienen 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 webpack:
window.$ = window.jQuery = $
Necesita usar el expose-loader .
npm install expose-loader --save-dev
Puede hacer esto cuando lo requiera:
require("expose?$!jquery");
o puedes hacer esto en tu configuración:
loaders: [
{ test: require.resolve(''jquery''), loader: ''expose?jQuery!expose?$'' }
]
ACTUALIZACIÓN : a partir de webpack 2, debe usar expose-loader en lugar de exponer :
module: {
rules: [{
test: require.resolve(''jquery''),
use: [{
loader: ''expose-loader'',
options: ''$''
}]
}]
}
Parece que el objeto de la
window
está expuesto en todos los módulos.
¿Por qué no solo importar / requerir
JQuery
y poner:
window.$ = window.JQuery = JQuery;
Deberá asegurarse de que esto suceda antes de requerir / importar cualquier módulo que utilice
window.JQuery
, ya sea en un módulo requerido o en el módulo donde se está utilizando.
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 espera que
jQuery
se defina globalmente.
Con
ProvidePlugin
, se aseguraría de que jQuery sea una dependencia (por ejemplo, cargada antes) y la aparición de
jQuery
en su código se reemplazaría con el equivalente bruto de webpack de
require(''jquery'')
.
Si tiene scripts externos que dependen del símbolo para estar en el espacio de nombres global (como digamos un JS alojado externamente, Javascript llama a Selenium o simplemente accede al símbolo en la consola del navegador), en su lugar, desea usar el
expose-loader
.
En resumen: ProvidePlugin gestiona las dependencias en tiempo de construcción de los símbolos globales, mientras que el
expose-loader
gestiona las dependencias de tiempo de ejecución de los símbolos globales.
Actualización para Webpack v2
Instale expose-loader como lo describe Matt Derrick:
npm install expose-loader --save-dev
Luego inserte el siguiente fragmento en su
webpack.config.js
:
module.exports = {
entry: {
// ...
},
output: {
// ...
},
module: {
loaders: [
{ test: require.resolve("jquery"), loader: "expose-loader?$!expose-loader?jQuery" }
]
}
};
(de los documentos de expose-loader )