Tìm kiếm trang web

javascript - Tôi có thể sử dụng jQuery với Node.js không?


Có thể sử dụng các bộ chọn jQuery/các thao tác DOM trên phía server bằng Node.js không?

Câu trả lời #1

Vâng. Trước tiên, hãy cài đặt các phụ thuộc

npm install jquery jsdom

thì

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

var $ = jQuery = require('jquery')(window);

Xem câu trả lời này.

Câu trả lời #2

Vâng, bạn có thể, sử dụng một thư viện mà tôi đã tạo có tên là 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);

Câu trả lời số 3

Tại thời điểm viết, cũng có Cheerio được duy trì.

Triển khai cốt lõi của jQuery nhanh, linh hoạt và gọn nhẹ, được thiết kế đặc biệt cho máy chủ.

Câu trả lời #4

Một trình thu thập dữ liệu đơn giản sử dụng Cheerio

Đây là công thức của tôi để tạo một trình thu thập dữ liệu đơn giản trong Node.js. Đây là lý do chính khiến tôi muốn thực hiện thao tác DOM phía máy chủ và có lẽ cũng là lý do bạn đến đây.

Trước tiên, sử dụng request để tải trang cần phân tích. Khi việc tải xong, xử lý nó bằng cheerio và bắt đầu thao tác với DOM giống như khi sử dụng jQuery.

Ví dụ minh họa:

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/');

Ví dụ này sẽ in ra console tất cả các câu hỏi hàng đầu hiển thị trên trang chủ của SO. Đây là lý do tại sao tôi yêu Node.js và cộng đồng của nó. Không thể dễ dàng hơn thế này :-)

Cài đặt các phụ thuộc:

npm cài đặt request cheerio

Và chạy (giả sử script ở trên nằm trong file crawler.js):

node crawler.js

Mã hóa

Một số trang sẽ có nội dung không phải tiếng Anh với một mã hóa nhất định và bạn sẽ cần giải mã nó sang UTF-8. Ví dụ, một trang bằng tiếng Bồ Đào Nha Brazil (hoặc bất kỳ ngôn ngữ nào có nguồn gốc Latin) có khả năng được mã hóa bằng ISO-8859-1 (còn gọi là "latin1"). Khi cần giải mã, tôi nói với request không được diễn giải nội dung theo bất kỳ cách nào mà thay vào đó sử dụng iconv-lite để thực hiện công việc đó.

Ví dụ minh họa:

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/');

Trước khi chạy, cài đặt các phụ thuộc:

npm cài đặt request iconv-lite cheerio

Và cuối cùng:

node crawler.js

Theo các liên kết

Bước tiếp theo sẽ là theo các liên kết. Giả sử bạn muốn liệt kê tất cả các người đăng bài từ mỗi câu hỏi hàng đầu trên SO. Bạn phải liệt kê tất cả các câu hỏi hàng đầu trước (ví dụ bên trên) và sau đó vào từng liên kết, phân tích trang của mỗi câu hỏi để lấy danh sách các người dùng tham gia.

Khi bạn bắt đầu theo các liên kết, một địa ngục callback có thể bắt đầu. Để tránh điều đó, bạn nên sử dụng một số loại promises, futures hoặc bất cứ thứ gì. Tôi luôn giữ async trong bộ công cụ của mình. Vì vậy, đây là một ví dụ đầy đủ về một crawler sử dụng 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);
            });
        });
    });
});

Trước khi chạy:

npm cài đặt request async cheerio

Chạy một bài kiểm tra:

node crawler.js

Ví dụ kết quả:

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

Và đó là những kiến thức cơ bản bạn nên biết để bắt đầu tạo trình thu thập dữ liệu của riêng bạn :-)

Các thư viện đã sử dụng

  • yêu cầu
  • iconv-lite
  • tạm biệt
  • bất đồng bộ

Câu trả lời số 5

vào năm 2016 mọi thứ dễ dàng hơn nhiều. cài đặt jquery cho node.js bằng console của bạn:

npm install jquery

ràng buộc nó với biến $ (ví dụ - tôi đã quen với nó) trong mã node.js của bạn:

var $ = require("jquery");

làm việc gì đó:

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

cũng hoạt động cho gulp vì nó dựa trên node.js.

Câu trả lời số 6

Tôi tin câu trả lời cho điều này bây giờ là có.
https://github.com/tmpvar/jsdom

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

Câu trả lời số 7

npm install jquery --save #lưu ý TẤT CẢ CHỮ THƯỜNG

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);
});

Câu trả lời số 8

Mô-đun jQuery có thể được cài đặt bằng cách sử dụng:

npm install jquery

Ví dụ :

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);
 });
});

Tham khảo jQuery trong Node.js** :

  • http://quaintous.com/2015/07/31/jqery-node-mystery/
  • http://www.hacksparrow.com/jquery-with-node-js.html

Bài viết liên quan