javascript jquery node.js

javascript - ¿Puedo usar jQuery con Node.js?



(18)

Un simple rastreador utilizando 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 de DOM en el lado del servidor y probablemente es la razón por la que llegó aquí.

Primero, use la request para descargar la página a analizar. Cuando se complete la descarga, cheerio a cheerio y comience la manipulación de DOM al igual que con jQuery.

Ejemplo de trabajo:

var request = require(''request''), cheerio = require(''cheerio''); function parse(url) { request(url, function (error, response, body) { var $ = cheerio.load(body); $(''.question-summary .question-hyperlink'').each(function () { console.info($(this).text()); }); }) } parse(''http://stackoverflow.com/'');

Este ejemplo imprimirá en la consola todas las preguntas principales que aparecen en la página de inicio de SO. Por eso me encanta Node.js y su comunidad. No podría ser más fácil que eso :-)

Instalar dependencias:

npm instalar solicitud cheerio

Y ejecute (asumiendo que el script anterior está en el archivo crawler.js ):

nodo crawler.js

Codificación

Algunas páginas tendrán contenido que no está en inglés en una codificación determinada y deberá decodificarlo a UTF-8 . Por ejemplo, una página en portugués brasileño (o cualquier otro idioma de origen latino) probablemente se codificará en ISO-8859-1 (también conocido como "latin1"). Cuando se necesita descodificar, le digo a la request no interprete el contenido de ninguna manera y en su lugar use iconv-lite para hacer el trabajo.

Ejemplo de trabajo:

var request = require(''request''), iconv = require(''iconv-lite''), cheerio = require(''cheerio''); var PAGE_ENCODING = ''utf-8''; // change to match page encoding function parse(url) { request({ url: url, encoding: null // do not interpret content yet }, function (error, response, body) { var $ = cheerio.load(iconv.decode(body, PAGE_ENCODING)); $(''.question-summary .question-hyperlink'').each(function () { console.info($(this).text()); }); }) } parse(''http://stackoverflow.com/'');

Antes de ejecutar, instale dependencias:

npm instalar solicitud iconv-lite cheerio

Y luego, finalmente:

nodo crawler.js

Siguiendo enlaces

El siguiente paso sería seguir los enlaces. Digamos que desea enumerar todos los carteles de cada pregunta principal en SO. Primero debe listar 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, debes usar algún tipo de promesas, futuros o lo que sea. Siempre mantengo async en mi cinturón de herramientas. Entonces, aquí hay un ejemplo completo de un rastreador que usa async:

var url = require(''url''), request = require(''request''), async = require(''async''), cheerio = require(''cheerio''); var baseUrl = ''http://stackoverflow.com/''; // Gets a page and returns a callback with a $ object function getPage(url, parseFn) { request({ url: url }, function (error, response, body) { parseFn(cheerio.load(body)) }); } getPage(baseUrl, function ($) { var questions; // Get list of questions questions = $(''.question-summary .question-hyperlink'').map(function () { return { title: $(this).text(), url: url.resolve(baseUrl, $(this).attr(''href'')) }; }).get().slice(0, 5); // limit to the top 5 questions // For each question async.map(questions, function (question, questionDone) { getPage(question.url, function ($$) { // Get list of users question.users = $$(''.post-signature .user-details a'').map(function () { return $$(this).text(); }).get(); questionDone(null, question); }); }, function (err, questionsWithPosters) { // This function is called by async when all questions have been parsed questionsWithPosters.forEach(function (question) { // Prints each question along with its user list console.info(question.title); question.users.forEach(function (user) { console.info(''/t%s'', user); }); }); }); });

Antes de correr:

npm instalar solicitud asincrónica

Ejecutar una prueba:

nodo crawler.js

Salida de muestra:

Is it possible to pause a Docker image build? conradk Thomasleveil PHP Image Crop Issue Elyor Houston Molinar Add two object in rails user1670773 Makoto max Asymmetric encryption discrepancy - Android vs Java Cookie Monster Wand Maker Objective-C: Adding 10 seconds to timer in SpriteKit Christian K Rider

Y eso es lo básico que debe saber para comenzar a crear sus propios rastreadores :-)

Bibliotecas utilizadas

  • request
  • iconv-lite
  • cheerio
  • async

¿Es posible usar los selectores de jQuery / manipulación de DOM en el lado del servidor usando Node.js?


A partir de jsdom v10, la función .env () está en desuso. Lo hice como a continuación después de intentar muchas cosas para requerir jquery:

var jsdom = require(''jsdom''); const { JSDOM } = jsdom; const { window } = new JSDOM(); const { document } = (new JSDOM('''')).window; global.document = document; var $ = jQuery = require(''jquery'')(window);

Espero que esto le ayude a usted o a cualquiera que haya estado enfrentando este tipo de problemas.


Creo que la respuesta a esto es ahora sí.
https://github.com/tmpvar/jsdom

var navigator = { userAgent: "node-js" }; var jQuery = require("./node-jquery").jQueryInit(window, navigator);


El módulo https://github.com/tmpvar/jsdom es una gran herramienta. Pero si desea evaluar páginas enteras y hacer algunas cosas extrañas en el lado del servidor, sugiero ejecutarlas en su propio contexto:

vm.runInContext

Por lo tanto, cosas como require / CommonJS en el sitio no CommonJS el proceso de Node.

Puedes encontrar documentación here . ¡Aclamaciones!


El módulo jQuery se puede instalar usando:

npm install jquery

Ejemplo:

var $ = require(''jquery''); var http = require(''http''); var options = { host: ''jquery.com'', port: 80, path: ''/'' }; var html = ''''; http.get(options, function(res) { res.on(''data'', function(data) { // collect the data chunks to the variable named "html" html += data; }).on(''end'', function() { // the whole of webpage data has been collected. parsing time! var title = $(html).find(''title'').text(); console.log(title); }); });

Referencias de jQuery en Node.js **:


En 2016 las cosas son mucho más fáciles. Instala jquery en node.js con tu consola:

npm install jquery

vincúlela a la variable $ (por ejemplo, estoy acostumbrado a ella) en su código node.js:

var $ = require("jquery");

hacer cosas:

$.ajax({ url: ''gimme_json.php'', dataType: ''json'', method: ''GET'', data: { "now" : true } });

También funciona para gulp ya que está basado en node.js.


En el momento de escribir allí también se mantiene el Cheerio .

Implementación rápida, flexible y eficiente del núcleo jQuery diseñado específicamente para el servidor.


Mi código de trabajo es:

npm install jquery

y entonces:

global.jQuery = require(''jquery''); global.$ = global.jQuery;

o si la ventana está presente, entonces:

typeof window !== "undefined" ? window : this; window.jQuery = require(''jquery''); window.$ = window.jQuery;


No que yo sepa. El DOM es una cuestión del lado del cliente (jQuery no analiza el HTML, sino el DOM).

Aquí hay algunos proyectos actuales de Node.js:

http://wiki.github.com/ry/node

Y el djangode de djangode es bastante genial ...


No. Será un gran esfuerzo para portar un entorno de navegador a un nodo.

Otro enfoque, que estoy investigando actualmente para realizar pruebas unitarias, es crear la versión "simulada" de jQuery que proporciona devoluciones de llamada cada vez que se llama a un selector.

De esta manera usted podría probar sus complementos jQuery sin tener un DOM. Aún tendrá que realizar pruebas en navegadores reales para ver si su código funciona de manera salvaje, pero si descubre problemas específicos del navegador, también puede "burlarse" fácilmente de aquellos en sus pruebas unitarias.

Enviaré algo a github.com/felixge una vez que esté listo para mostrar.


Puedes usar Electron , permite browserjs híbridos y nodejs.

Antes, intenté usar canvas2d en nodejs, pero finalmente me rendí. No es compatible con el valor predeterminado de nodejs, y es demasiado difícil de instalarlo (muchas, muchas ... dependencias). Hasta que use Electron, puedo usar fácilmente todo mi código de browserjs anterior, incluso WebGL, y pasar el valor del resultado (por ejemplo, datos de la imagen base de resultado 64) al código de nodejs.


Sí, puedes usar una biblioteca que he creado nodeQuery https://github.com/tblobaum/nodeQuery

var Express = require(''express'') , dnode = require(''dnode'') , nQuery = require(''nodeQuery'') , express = Express.createServer(); var app = function ($) { $.on(''ready'', function () { // do some stuff to the dom in real-time $(''body'').append(''Hello World''); $(''body'').append(''<input type="text" />''); $(''input'').live(''click'', function () { console.log(''input clicked''); // ... }); }); }; nQuery .use(app); express .use(nQuery.middleware) .use(Express.static(__dirname + ''/public'')) .listen(3000); dnode(nQuery.middleware).listen(express);


Tienes que obtener la ventana usando la nueva API JSDOM.

const jsdom = require("jsdom"); const { window } = new jsdom.JSDOM(`...`); var $ = require("jquery")(window);


Una alternativa es usar Underscore.js . Debería proporcionar lo que podría haber deseado del lado del servidor desde JQuery.


Usando jsdom ahora puedes. Basta con mirar su ejemplo de jQuery en el directorio de ejemplos.


npm install jquery --save #note ALL LOWERCASE

npm install jsdom --save

const jsdom = require("jsdom"); const dom = new jsdom.JSDOM(`<!DOCTYPE html>`); var $ = require("jquery")(dom.window); $.getJSON(''https://api.github.com/users/nhambayi'',function(data) { console.log(data); });


ADVERTENCIA

Esta solución, como lo menciona 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 con una estructura de aplicación Node, pero no es la filosofía de Node porque jQuery todavía se está ejecutando en el lado del cliente en lugar de en el lado del servidor. Lo siento por dar una respuesta incorrecta.

También puedes renderizar Jade con nodo y poner tu código jQuery dentro. Aquí está el código del archivo de jade:

!!! 5 html(lang="en") head title Holamundo! script(type=''text/javascript'', src=''http://code.jquery.com/jquery-1.9.1.js'') body h1#headTitle Hello, World p#content This is an example of Jade. script $(''#headTitle'').click(function() { $(this).hide(); }); $(''#content'').click(function() { $(this).hide(); });


Actualización (27-jun-18) : parece que hubo una actualización importante en jsdom que hace que la respuesta original deje de funcionar. Encontré this respuesta que explica cómo usar jsdom ahora. He copiado el código correspondiente a continuación.

var jsdom = require("jsdom"); const { JSDOM } = jsdom; const { window } = new JSDOM(); const { document } = (new JSDOM('''')).window; global.document = document; var $ = jQuery = require(''jquery'')(window);

Nota: La respuesta original no menciona que necesitará instalar jsdom y usar npm install jsdom

Actualización (finales de 2013) : el equipo oficial de jQuery finalmente se hizo cargo de la gestión del paquete jquery en npm:

npm install jquery

Entonces:

require("jsdom").env("", function (err, window) { if (err) { console.error(err); return; } var $ = require("jquery")(window); });