¿Es posible usar selectores jQuery / manipulación DOM en el lado del servidor usando Node.js?
javascript
jquery
node.js
Juan
fuente
fuente
Respuestas:
Actualización (27-jun-18) : Parece que hubo una actualización importante
jsdom
que hace que la respuesta original ya no funcione. Encontré esta respuesta que explica cómo usarjsdom
ahora. Copié el código relevante a continuación.Nota: La respuesta original no menciona que también necesitará instalar jsdom usando
npm install jsdom
Actualización (finales de 2013) : el equipo oficial de jQuery finalmente se hizo cargo de la administración del
jquery
paquete en npm:Entonces:fuente
require("...").env is not a function
.TypeError: require(...).env is not a function
Sí, puedes, usando una biblioteca que creé llamada nodeQuery
fuente
, express = Express.createServer();
yTypeError: Express.createServer is not a function
alguna idea?npm install --save express
en su símbolo del sistema.Al momento de escribir también existe el Cheerio mantenido .
fuente
:gt(1)
Usando jsdom ahora puedes. Simplemente mire su ejemplo de jquery en el directorio de ejemplos.
fuente
Un rastreador simple que usa Cheerio
Esta es mi fórmula para hacer un rastreador simple en Node.js. Es la razón principal para querer hacer la manipulación DOM en el lado del servidor y probablemente es la razón por la que llegó aquí.
Primero, use
request
para descargar la página a analizar. Cuando se complete la descarga, manipúlelacheerio
y comience a manipular DOM al igual que con jQuery.Ejemplo de trabajo:
Este ejemplo imprimirá en la consola todas las preguntas principales que se muestran en la página de inicio de SO. Es por eso que amo a Node.js y su comunidad. No podría ser más fácil que eso :-)
Instalar dependencias:
Y ejecute (suponiendo que el script anterior esté en el archivo
crawler.js
):Codificación
Algunas páginas tendrán contenido que no esté en inglés en una determinada codificación y deberá decodificarlo
UTF-8
. Por ejemplo, una página en portugués brasileño (o cualquier otro idioma de origen latino) probablemente se codificará enISO-8859-1
(también conocido como "latin1"). Cuando se necesita decodificación, le digo querequest
no interprete el contenido de ninguna manera y en su lugar lo usoiconv-lite
para hacer el trabajo.Ejemplo de trabajo:
Antes de ejecutar, instale dependencias:
Y luego finalmente:
Enlaces siguientes
El siguiente paso sería seguir los enlaces. Digamos que desea enumerar todos los carteles de cada pregunta principal en SO. Primero debe enumerar todas las preguntas principales (ejemplo anterior) y luego ingresar cada enlace, analizando la página de cada pregunta para obtener la lista de usuarios involucrados.
Cuando comienzas a seguir enlaces, puede comenzar un infierno de devolución de llamada . Para evitar eso, debe usar algún tipo de promesas, futuros o lo que sea. Siempre mantengo asíncrono en mi cinturón de herramientas. Entonces, aquí hay un ejemplo completo de un rastreador que usa asíncrono:
Antes de correr:
Ejecute una prueba:
Salida de muestra:
Y eso es lo básico que debes saber para comenzar a hacer tus propios rastreadores :-)
Bibliotecas utilizadas
fuente
en 2016 las cosas son mucho más fáciles. instale jquery a node.js con su consola:
vincúlelo a la variable
$
(por ejemplo, estoy acostumbrado) en su código node.js:hacer cosas:
también funciona para tragar, ya que se basa en node.js.
fuente
var $ = require("jquery"); $.ajax // undefined
(Votado por el momento).npm install jquery
primero?> console.log(require("jquery").toString());
me da la función de fábrica:function ( w ) { if ( !w.document ) { throw new Error( "jQuery requires a window with a document" ); } return factory( w ); }
tuve que usar la respuesta anterior con jsdom: stackoverflow.com/a/4129032/539490Creo que la respuesta a esto es ahora sí.
https://github.com/tmpvar/jsdom
fuente
npm install jquery --save
#note TODAS LAS MINÚSCULASnpm install jsdom --save
fuente
El módulo jQuery se puede instalar usando:
Ejemplo:
Referencias de jQuery en Node.js **:
fuente
Debe obtener la ventana utilizando la nueva API JSDOM.
fuente
...
) debe ser .JSDOM ("<! DOCTYPE html>") para soporte HTML5?ADVERTENCIA
Esta solución, como mencionó Golo Roden, no es correcta . Es solo una solución rápida para ayudar a las personas a tener su código jQuery real ejecutándose usando una estructura de aplicación Node, pero no es una filosofía Node porque jQuery todavía se ejecuta en el lado del cliente en lugar del lado del servidor. Lo siento por dar una respuesta incorrecta.
También puede renderizar Jade con nodo y poner su código jQuery dentro. Aquí está el código del archivo jade:
fuente
Mi código de trabajo es:
y entonces:
o si la ventana está presente, entonces:
fuente
El módulo jsdom es una gran herramienta. Pero si desea evaluar páginas enteras y hacer algunas cosas funky en el lado del servidor, sugiero ejecutarlas en su propio contexto:
Así que cosas como
require
/CommonJS
en el sitio no arruinarán su proceso de Nodo en sí.Puede encontrar documentación aquí . ¡Salud!
fuente
A partir de jsdom v10, la función .env () está en desuso. Lo hice como a continuación después de probar muchas cosas para requerir jquery:
Espero que esto te ayude a ti o a cualquiera que haya enfrentado este tipo de problemas.
fuente
TypeError: JSDOM is not a constructor
$.each
. Solo incluí estas líneas y luego lo hice a continuación: ¡$.each(errors, function (ind,error) { res.send(error.msg);console.log(error.msg); });
Espero que esto ayude!Primero que nada, instálalo
Después de instalarlo, puede usarlo de la siguiente manera
Puede consultar un tutorial completo que escribí aquí: https://medium.com/fbdevclagos/how-to-use-jquery-on-node-df731bd6abc7
fuente
Ninguna de estas soluciones me ha ayudado en mi aplicación Electron.
Mi solución (solución alternativa):
En tu
index.js
archivo:En sus
.js
archivos, escriba las funciones de jQuery de esta manera:fuente
Sí,
jQuery
se puede usar conNode.js
.Pasos para incluir jQuery en el proyecto de nodo: -
npm i jquery --save
Incluir jquery en códigosYo uso jquery en proyectos node.js todo el tiempo específicamente en el proyecto de extensión de Chrome.
por ejemplo, https://github.com/fxnoob/gesture-control-chrome-extension/blob/master/src/default_plugins/tab.js
fuente
No. Será un gran esfuerzo portar un entorno de navegador al nodo.
Otro enfoque, que actualmente estoy investigando para pruebas unitarias, es crear una versión "simulada" de jQuery que proporcione devoluciones de llamada cada vez que se llame a un selector.
De esta manera, podría probar sus complementos jQuery sin tener un DOM. Todavía tendrá que probar en navegadores reales para ver si su código funciona en la naturaleza, pero si descubre problemas específicos del navegador, también puede "burlarse" de ellos en las pruebas de su unidad.
Enviaré algo a github.com/felixge una vez que esté listo para mostrar.
fuente
Puede usar Electron , permite navegadores híbridos y nodos.
Antes, traté de usar canvas2d en nodejs, pero finalmente me di por vencido. No es compatible con el valor predeterminado de nodejs, y es demasiado difícil de instalar (muchas, muchas ... dependencias). Hasta que use Electron, puedo usar fácilmente todo mi código de navegador anterior, incluso WebGL, y pasar el valor del resultado (por ejemplo, datos de imagen de resultado base64) al código de nodo.
fuente
No que yo sepa. El DOM es una cosa del lado del cliente (jQuery no analiza el HTML, sino el DOM).
Aquí hay algunos proyectos actuales de Node.js:
https://github.com/ry/node/wiki ( https://github.com/nodejs/node )
Y el djangode de SimonW es bastante genial ...
fuente
Una alternativa es usar Underscore.js . Debería proporcionar lo que podría haber deseado del lado del servidor de JQuery.
fuente