为了使我的代码工作,我不得不改变cheerio的一些核心function,我怎么能坚持它在我的模块?

我创build一个“networking爬虫”的学习目的,我不得不改变一些cheerioJS核心funcionality使我的代码工作,这里是发生了什么事情:

index.js:

var request = require('request'); var cheerio = require('cheerio'); module.exports.findWordInURL = function(url, word) { request(url, function(error, response, body) { if (!error && response.statusCode == 200) { $ = cheerio.load(body); texto = []; retorno = []; b = $('body').text().toLowerCase(); c = b.replace(/\s+/g, ' '); texto = c.split("¬"); for (var i = texto.length - 1; i >= 0; i--) { if (texto[i].search(word) !== -1) { retorno.push("+" + texto[i] + "+"); } } console.log(retorno); } else { console.log(error); } }); }; 

它只工作,因为我已经改变了“$()。text()”函数来适应我的需要:

来自cheerio lib的static.js,看看里面的变化>>> <<<:

 /** * $.text(dom) */ exports.text = function(elems) { if (!elems) return ''; var ret = '', len = elems.length, elem; for (var i = 0; i < len; i++) { elem = elems[i]; if (elem.type === 'text') ret += elem.data >>>+ "¬"<<<; else if (elem.children && elem.type !== 'comment') { ret += exports.text(elem.children); } } return ret; }; 

然后,当我在另一个.js文件中调用它时,它按预期工作:

teste.js:

 var webCrawler = require('./index'); webCrawler.findWordInURL("http://www.estadao.com.br/","temer"); 

节点teste.js: 在这里输入图像说明

我怎么能让我的模块去NPM这个修改的cheerio,或者至less如果有人在git上克隆它,当他通过npm安装它时,接受这个修改的cheerio?


方法1

你可以避免修改原始的cheerio,把你修改过的cheerio.text函数(不知道是否是cheerio.text,检查)放在你自己的index.js本身中:

index.js

 var request = require('request'); var cheerio = require('cheerio'); cheerio.text = function(elems) { if (!elems) return ''; var ret = '', len = elems.length, elem; for (var i = 0; i < len; i++) { elem = elems[i]; if (elem.type === 'text') ret += elem.data >>>+ "¬"<<<; else if (elem.children && elem.type !== 'comment') { ret += exports.text(elem.children); } } return ret; }; 

这样至less我们所有的npm install相同的Cheerio,并得到你修改的function,如果我们使用你的应用程序


方法2

如果你似乎无法做的方法1,你总是可以将你使用的模块分叉到你的Github,在这种情况下https://github.com/cheeriojs/cheerio

然后你可以随意修改,推送到你的Github,然后在你自己的package.json

 "cheerio": "github.com/<YOURNAME>/cheerio"; 

当然,如果您认为您的编辑有助于改进整个模块,那么您可以在原始模块上创build问题/ PR。

正如@vtange用户所说:

哦。 那么,你可以分叉github.com/cheeriojs/cheerio,编辑它,如你所愿,把它推到你自己的github acct然后通过“cheerio”链接在package.json:“github.com/(YOURNAME)/ cheerio” 。

有效! NPM安装,从我的git安装分叉的版本!