Node.js kullanarak sunucu tarafında jQuery seçicileri / DOM manipülasyonu kullanmak mümkün müdür?
Node.js kullanarak sunucu tarafında jQuery seçicileri / DOM manipülasyonu kullanmak mümkün müdür?
Yanıtlar:
Güncelleme (27-Jun-18) : jsdom
Orijinal cevabın artık çalışmamasına neden olan büyük bir güncelleme var gibi görünüyor . Şimdi nasıl kullanılacağını açıklayan bu cevabı buldum jsdom
. Aşağıdaki ilgili kodu kopyaladım.
var jsdom = require("jsdom");
const { JSDOM } = jsdom;
const { window } = new JSDOM();
const { document } = (new JSDOM('')).window;
global.document = document;
var $ = jQuery = require('jquery')(window);
Not: Orijinal cevap, jsdom'u da kullanmanız gerektiğini söyleyemez.npm install jsdom
Güncelleme (2013 sonu) : Resmi jQuery ekibi jquery
npm'de paketin yönetimini devraldı:
npm install jquery
Sonra:
require("jsdom").env("", function (err, window) {
if (err) {
console.error(err);
return;
}
var $ = require("jquery")(window);
});
require("...").env is not a function
.
TypeError: require(...).env is not a function
Evet, nodeQuery adlı bir kitaplık kullanarak
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);
, express = Express.createServer();
ve TypeError: Express.createServer is not a function
herhangi bir fikir?
npm install --save express
Komut isteminde deneyin .
Yazma sırasında da korunan Cheerio var .
Sunucu için özel olarak tasarlanmış çekirdek jQuery'nin hızlı, esnek ve yalın uygulaması.
:gt(1)
Şimdi jsdom kullanarak yapabilirsiniz. Sadece örnekler dizinindeki jquery örneğine bakın.
Bu, Node.js'de basit bir tarayıcı yapmak için formülüm. Sunucu tarafında DOM manipülasyonu yapmak istemenin ana nedeni ve muhtemelen buraya gelmenizin nedeni.
İlk olarak, request
ayrıştırılacak sayfayı indirmek için kullanın . İndirme işlemi tamamlandığında, cheerio
jQuery gibi DOM işlemesine geçin ve DOM işlemeye başlayın.
Çalışma örneği:
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/');
Bu örnek, SO ana sayfasında gösterilen tüm soruları konsola yazdırır. Bu yüzden Node.js ve topluluğunu seviyorum. Bundan daha kolay olamazdı :-)
Bağımlılıkları yükleyin:
npm yükleme isteği cheerio
Ve çalıştırın (yukarıdaki komut dosyasının dosyada olduğunu varsayarak crawler.js
):
düğüm crawler.js
Bazı sayfalarda belirli bir kodlamada ingilizce olmayan içerik bulunur ve kodunu çözmeniz gerekir UTF-8
. Örneğin, Brezilya Portekizcesi'ndeki (veya latin kökenli başka bir dilde) bir sayfa büyük olasılıkla ISO-8859-1
("latin1" olarak) kodlanır . Kod çözme gerektiğinde, request
içeriği hiçbir şekilde yorumlamamayı ve bunun yerine iconv-lite
işi yapmak için kullanmamayı söylerim .
Çalışma örneği:
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/');
Çalıştırmadan önce bağımlılıkları yükleyin:
npm yükleme isteği iconv-lite cheerio
Ve son olarak:
düğüm crawler.js
Bir sonraki adım bağlantıları takip etmek olacaktır. Diyelim ki her bir üst sorudaki tüm posterleri SO'da listelemek istiyorsunuz. Öncelikle tüm sık sorulan soruları listelemeniz (yukarıdaki örnek) ve ardından ilgili kullanıcıların listesini almak için her sorunun sayfasını ayrıştırarak her bir bağlantıyı girmeniz gerekir.
Bağlantıları izlemeye başladığınızda, bir geri arama cehennemi başlayabilir. Bundan kaçınmak için bir tür vaat, gelecek veya başka bir şey kullanmalısınız. Hep tutmak asenk benim araç kemerinde bulunan. Yani, async kullanan bir tarayıcının tam örneği:
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);
});
});
});
});
Koşudan önce:
npm yükleme isteği zaman uyumsuz cheerio
Bir test yapın:
düğüm crawler.js
Örnek çıktı:
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
Ve kendi tarayıcılarınızı yapmaya başlamak için bilmeniz gereken temel bu :-)
2016'da işler çok daha kolay. konsolunuzla node.js'ye jquery yükleyin:
npm install jquery
$
node.js kodunuzdaki değişkene bağlayın (örneğin - alışkınım):
var $ = require("jquery");
şeyler yapmak:
$.ajax({
url: 'gimme_json.php',
dataType: 'json',
method: 'GET',
data: { "now" : true }
});
ayrıca node.js'ye dayandığı için gulp için de çalışır.
var $ = require("jquery"); $.ajax // undefined
(Şu an için aşağı oy verildi).
npm install jquery
ilk yaptığınızdan emin misiniz ?
> console.log(require("jquery").toString());
bana fabrika fonksiyonunu veriyor: function ( w ) { if ( !w.document ) { throw new Error( "jQuery requires a window with a document" ); } return factory( w ); }
Yukarıdaki cevabı jsdom ile kullanmak zorunda kaldım: stackoverflow.com/a/4129032/539490
Bunun cevabının şimdi evet olduğuna inanıyorum.
https://github.com/tmpvar/jsdom
var navigator = { userAgent: "node-js" };
var jQuery = require("./node-jquery").jQueryInit(window, navigator);
npm install jquery --save
#note TÜM 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);
});
jQuery modülü kullanılarak kurulabilir:
npm install jquery
Misal:
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);
});
});
JQuery'nin Node.js ** referansları:
Pencereyi yeni JSDOM API'sını kullanarak almanız gerekir.
const jsdom = require("jsdom");
const { window } = new jsdom.JSDOM(`...`);
var $ = require("jquery")(window);
...
HTML5 desteği için .JSDOM ( ) .JSDOM ("<! DOCTYPE html>") olmalıdır?
UYARI
Golo Roden'in belirttiği gibi bu çözüm doğru değil . İnsanların gerçek jQuery kodlarını bir Düğüm uygulama yapısı kullanarak çalıştırmasına yardımcı olmak için hızlı bir çözümdür, ancak jQuery hala sunucu tarafında değil istemci tarafında çalışıyor. Yanlış cevap verdiğim için özür dilerim.
Ayrıca Jade'i düğüm ile oluşturabilir ve jQuery kodunuzu içine koyabilirsiniz. Yeşim dosyasının kodu:
!!! 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();
});
Jsdom modülü harika bir araçtır. Ancak tüm sayfaları değerlendirmek ve sunucu tarafında bazı funky şeyler yapmak istiyorsanız, bunları kendi bağlamlarında çalıştırmanızı öneririz:
vm.runInContext
Bu yüzden require
/ CommonJS
sitede gibi şeyler Düğüm sürecinizi kendi başına uçurmayacaktır.
Belgeleri burada bulabilirsiniz . Şerefe!
Jsdom v10 itibariyle .env () işlevi kullanımdan kaldırılmıştır. Ben jquery gerektiren bir çok şey denedikten sonra aşağıdaki gibi yaptım:
var jsdom = require('jsdom');
const { JSDOM } = jsdom;
const { window } = new JSDOM();
const { document } = (new JSDOM('')).window;
global.document = document;
var $ = jQuery = require('jquery')(window);
Umarım bu size veya bu tür sorunlarla karşılaşan herkese yardımcı olur.
TypeError: JSDOM is not a constructor
$.each
. Ben sadece bu satırları dahil ve sonra aşağıdaki gibi yaptım: $.each(errors, function (ind,error) { res.send(error.msg);console.log(error.msg); });
Umarım bu yardımcı olur !!
Her şeyden önce yükleyin
npm install jquery -S
Yükledikten sonra aşağıdaki gibi kullanabilirsiniz
import $ from 'jquery';
window.jQuery = window.$ = $;
$(selector).hide();
Burada yazdığım tam bir eğiticiye göz atabilirsiniz: https://medium.com/fbdevclagos/how-to-use-jquery-on-node-df731bd6abc7
Bu çözümlerin hiçbiri Electron Uygulamamda bana yardımcı olmadı.
Çözümüm (geçici çözüm):
npm install jquery
Senin içinde index.js
dosyaya:
var jQuery = $ = require('jquery');
Senin içinde .js
dosyaların bu şekilde sizinki jQuery fonksiyonları yazın:
jQuery(document).ready(function() {
Evet, jQuery
ile kullanılabilir Node.js
.
Düğüm projesine jQuery eklemek için adımlar: -
npm i jquery --save
Kodlara jquery ekle
import jQuery from 'jquery';
const $ = jQuery;
Özellikle krom uzantısının projesinde node.js projelerinde jquery kullanıyorum.
örneğin, https://github.com/fxnoob/gesture-control-chrome-extension/blob/master/src/default_plugins/tab.js
Hayır. Bir tarayıcı ortamını düğüme taşımak oldukça büyük bir çaba olacaktır.
Şu anda birim testi için araştırıyorum başka bir yaklaşım, bir seçici her çağrıldığında geri aramalar sağlayan jQuery "Mock" sürümünü oluşturmaktır.
Bu şekilde jQuery eklentilerinizi DOM olmadan birim test edebilirsiniz. Kodunuzun vahşi ortamda çalışıp çalışmadığını görmek için gerçek tarayıcılarda test etmeniz gerekecek, ancak tarayıcıya özgü sorunları keşfederseniz, birim testlerinizdekileri de kolayca "taklit edebilirsiniz".
Gösterilmeye hazır olduğunda bir şeyi github.com/felixge adresine göndereceğim.
Electron'u kullanabilirsiniz , hibrit tarayıcılara ve düğümlere izin verir.
Daha önce nodejlerde canvas2d kullanmaya çalıştım, ama sonunda vazgeçtim. Varsayılan olarak nodejs tarafından desteklenmez ve kurulumu çok zordur (birçok ... bağımlı). Elektron'u kullanana kadar, önceki tüm tarayıcı kodumu, hatta WebGL'yi kolayca kullanabilir ve sonuç değerini (örn. Sonuç base64 görüntü verileri) nodejs koduna geçirebilirim.
Bildiğim kadarıyla hayır. DOM, istemci tarafı bir şeydir (jQuery, HTML'yi ayrıştırmaz, ancak DOM'yi).
İşte bazı güncel Node.js projeleri:
https://github.com/ry/node/wiki ( https://github.com/nodejs/node )
Ve SimonW'nin djangode'u çok havalı ...
Alternatif olarak Underscore.js kullanmaktır . JQuery'den sunucu tarafı istemiş olabileceğinizi sağlamalıdır.