style example attribute javascript jquery node.js atom-editor electron

javascript - example - Error no detectado: no se puede encontrar el módulo ''jquery''



title css (6)

Estoy usando Electron para hacer una aplicación de escritorio. En mi aplicación, estoy cargando un sitio externo (fuera de la aplicación Atom), digamos http://mydummysite/index.html página.

Aquí está la estructura de mi aplicación en Atom Editor :

es decir, tiene las siguientes partes:

  1. main.js
  2. package.json
  3. nodemodules>jquery (para cargar jquery)

Código fuente:

main.js:

''use strict''; var app = require(''app''); app.on(''ready'', function() { var BrowserWindow = require(''browser-window''); var win = new BrowserWindow({ width: 800, height: 600, show: false, ''node-integration'':true }); win.on(''closed'', function() { win = null; }); win.loadUrl(''http://mydummysite/index.html ''); win.show(); });

package.json:

{ "name": "my-mac-app", "version": "5.2.0", "description": "My Mac Desktop App", "main": "main.js", "scripts": { "start": "electron ." }, "author": "Me", "license": "ISC", "dependencies": { "jquery": "^2.1.4" } }

Página externa - http://mydummysite/index.html código de página:

<!DOCTYPE html> <html> <head> </head> <body> <h1>Hello World!</h1> </body> <script> var jqr=require(''jquery''); </script> </html>

Cuando ejecuto la aplicación anterior (arrastrando la carpeta de la aplicación a Electron) la página externa ( http://mydummysite/index.html ) se carga en Electron shell pero con el error

Error no detectado: no se puede encontrar el módulo ''jquery''

¿Me pueden ayudar a encontrar la causa de este problema?

Como puede ver en mi captura de pantalla de la estructura de directorios, ya instalé el módulo jquery en mi carpeta y lo hice a través del npm install jquery .

Nota: Para jugar con el comando require en JS intenté agregar require("ipc") en mi página externa http://mydummysite/index.html y estaba funcionando, así que cuál podría ser la razón con require("jquery") .

¿Agregué el módulo externo (jquery) de manera correcta en Electron?

¿Me falta alguna dependencia en package.json ?

Lo que ya he probado:

  • npm cache clean , npm install jquery (en la carpeta de mi aplicación)
  • npm install --save jquery
  • npm install jquery -g
  • npm rebuild
  • sudo npm install jquery -g
  • sudo npm install jquery
  • export NODE_PATH=/usr/local/lib/node_modules

Aquí está la captura de pantalla de la ubicación desde donde se arroja el error en module.js

¿Alguien puede sugerir por qué require("ipc") funciona y require("jquery") no?

Mi objetivo es usar jQuery con la aplicación de electrones con integración de nodos verdadera.



Instalar jquery con npm no es suficiente:

npm install --save jquery

Recupera los archivos fuente de jQuery en su proyecto. Pero debe incluir el script en su archivo html:

<!DOCTYPE html> <html> <head></head> <body> <h1>Hello World!</h1> </body> <!-- Try to load from cdn to exclude path issues. --> <script src="https://code.jquery.com/jquery-2.1.4.min.js"></script> <script> window.jQuery = window.$ = jQuery; $(document).ready(function() { console.log( "jQuery is loaded" ); }); </script> </html>


Me ocurrió el mismo problema, una solución simple es agregar esto a su archivo index.js:

app.on(''ready'', function() { var mainWindow = new BrowserWindow({ "node-integration": false }) //rest of your initialization code here. })

el problema es causado por el nodo, para obtener más información, consulte esta post

Establecer la integración de nodos en falso deshabilitará node.js en el proceso de representación, es decir, su aplicación solo puede hacer lo que hará un navegador web.



tl; dr

A diferencia de una aplicación normal de nodejs, donde tiene acceso a módulos globales (por ejemplo, ubicados en /usr/bin/node ), electron no establece automáticamente las variables de entorno NODE_PATH . Debe configurarlo manualmente en todas las rutas que contienen los módulos deseados.

Actualizar:

La respuesta a la pregunta

¿por qué require("ipc") funciona y require("jquery") no?

se encuentra en este issue , indicando que los módulos del sistema / usuario no deben incluirse en la ruta global del módulo

ya que podrían contener módulos no enviados con la aplicación y posiblemente compilados con los encabezados v8 incorrectos.

Y si observa la fuente de electrones, puede ver que los módulos internos se agregan al module.globalPaths :

# Add common/api/lib to module search paths. globalPaths.push path.resolve(__dirname, ''..'', ''api'', ''lib'')

es por eso que tiene acceso a ipc , app , etc. pero no a los módulos que ha instalado globalmente usando npm install -g .

Acabo de probarlo con la última versión electron-prebuilt con un servidor local que sirve exactamente el mismo archivo HTML que usted proporcionó y creo que sé cuál es el problema: si no agrega la ruta al directorio node_modules su aplicación en su la raíz de la aplicación a la variable NODE_PATH no va a funcionar. Entonces necesitas hacer algo como esto:

export NODE_PATH=/PATH/TO/APP/node_modules electron /PATH/TO/APP

Al exportar NODE_PATH asegúrese de proporcionar una ruta absoluta.

Actualización 2:

La respuesta al comentario:

Recibo errores de jQuery no encontrado

Se encuentra en este boleto . Básicamente, si usa el paquete npm de jQuery o hace algo como lo siguiente en sus archivos HTML dentro de electron:

<script src="https://code.jquery.com/jquery-2.1.4.min.js"></script>

Lo que obtienes es una fábrica y no el objeto jQuery real adjunto al contexto global (por ejemplo, window ). Como mencioné en una respuesta anterior (que contiene también el código fuente de jQuery)

Cuando necesita jQuery dentro de un entorno CommonJS o similar que proporciona module y module.exports , lo que obtiene es una fábrica y no el objeto jQuery real.

Ahora, para usar esa fábrica (ya sea importando el código de la CDN o si tiene el módulo npm disponible localmente) necesitaría algo como lo siguiente:

<script> window.jQuery = window.$ = require(''jquery''); </script>

He escrito un article que explica la combinación de Node + jQuery.


# assuming you have installed jquery locally instead of globally like in as npm install jquery -s # without -g flag

en lugar de require ( "jquery" ) , proporcione la ruta relativa desde el directorio fuente
require ( "./node_modules/jquery/dist/jquery.min.js" );

Intenta lo siguiente:

<script>window.$ = window.jQuery = require(''./node_modules/jquery/dist/jquery.min.js'');</script>

O

<script>var $ = jQuery = require(''./node_modules/jquery/dist/jquery.min.js'');</script>