Electron: jQuery no está definido
Problema: mientras desarrolla con Electron, cuando intenta utilizar cualquier complemento JS que requiera jQuery, el complemento no encuentra jQuery, incluso si carga en la ruta correcta usando etiquetas de secuencia de comandos.
Por ejemplo,
<body>
<p id="click-me">Click me!</p>
...
<script src="node_modules/jquery/dist/jquery.min.js"></script> //jQuery should be loaded now
<script>$("#click-me").click(() => {alert("Clicked")});</script>
</body>
Ejecutar este código anterior no funcionaría. De hecho, abra DevTools, vaya a la vista Consola y haga clic en el <p>
elemento. Deberías ver eso function $ is not defined
o algo por el estilo.
Una solución mejor y más genérica en mi opinión:
<!-- Insert this line above script imports -->
<script>if (typeof module === 'object') {window.module = module; module = undefined;}</script>
<!-- normal script imports etc -->
<script src="scripts/jquery.min.js"></script>
<script src="scripts/vendor.js"></script>
<!-- Insert this line after script imports -->
<script>if (window.module) module = window.module;</script>
Beneficios
- Funciona tanto para navegador como para electron con el mismo código.
- Soluciona problemas para TODAS las bibliotecas de terceros (no solo jQuery) sin tener que especificar cada una
- Script Build / Pack Friendly (es decir, Grunt / Gulp todos los scripts en seller.js)
- NO requiere
node-integration
ser falso
fuente aquí
Como se ve en https://github.com/atom/electron/issues/254 , el problema se debe a este código:
if ( typeof module === "object" && typeof module.exports === "object" ) {
// set jQuery in `module`
} else {
// set jQuery in `window`
}
El código jQuery "ve" que se está ejecutando en un entorno CommonJS y lo ignora window
.
La solución es realmente fácil , en lugar de cargar jQuery <script src="...">
, deberías cargar así:
<script>window.$ = window.jQuery = require('./path/to/jquery');</script>
Nota: el punto antes de la ruta es obligatorio , ya que indica que es el directorio actual. Además, recuerda cargar jQuery antes de cargar cualquier otro complemento que dependa de él .