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 --saveconst 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
