为了使我的代码正常工作,我必须更改 cheerio 的一些核心功能,我如何才能将它保留在我的模块中?

To make my code work I had to alter some core functionality of cheerio, how can I persist it in my module?

我创建了一个 "web crawler" 用于学习目的,我不得不更改一些 cheerioJS 核心功能以使我的代码工作,这是发生的事情:

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()”函数以满足我的需要:

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

/**
 * $.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:

如何让我的模块使用这个修改后的 cheerio 进入 NPM,或者至少如果有人在 git 上克隆它,当他通过 npm install 安装时收到这个修改后的 cheerio?


方法一

您可以通过将修改后的 cheerio.text 函数(不确定它是否是 cheerio.text,检查)放在您自己的 index.js 本身中来避免完全修改原始的 cheerio:

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

这样至少我们都 npm install 相同的 Cheerio 并且如果我们使用您的应用程序就可以获得您修改后的功能


方法二

如果您似乎无法执行方法 1,您可以随时将正在使用的模块分叉到 Github,在本例中为 https://github.com/cheeriojs/cheerio

然后你随便修改,push到你的Github,然后在你自己的package.json:

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

当然,如果您认为您的编辑有助于改进整体模块,那么您可以在原始模块上制作一个issue/PR。

正如用户@vtange 所说:

Oh. Well, you could then fork github.com/cheeriojs/cheerio, edit it as you wish, push it to your own github acct then link it in package.json via "cheerio": "github.com/(YOURNAME)/cheerio".

成功了! NPM 安装,从我的 git!

安装了分叉版本