html解析为DOM性能

时间:2016-04-23 22:53:36

标签: javascript meteor

此Meteor服务器代码需要在从Web获取后解析html字符串。由于许多用户可能同时使用该应用程序,因此需要一种好的方法来最小化开销和响应时间。

修改
在Pitaj的回答后编辑 代码需要将html解析为dom,以便它可以提取元素并使用它做其他事情,从而实现同步。

最好的方法是什么?感谢

这是我做的事情

myResponse = (function () {
  const parser = new DOMParser();

  const doc = (html) => {
    return parser.parseFromString(html, 'text/xml');
  };

  return {
    message: (html) => {
      return doc(html).select('span[blah..]').get(0).innerText;
    }
  }
}());

1 个答案:

答案 0 :(得分:0)

您可以使用类似的this webworker implementation for Node将其拉出到另一个线程中。

它将允许事件循环继续,因为DOM解析将在另一个进程中完成。

这就是我使用内置child_process.fork()

的方式
// main file
myResponse = {
  message: (html, callback) => { // whatever callback, this is async now
    const fork = require('child_process').fork;
    const parse = fork('./parse');
    parse.on('message', (message, data) => {
      if (message === 'ready') {
        parse.send('html', html);
      } else if (message === 'data' && data) {
        callback(null, data);
      }
    });
  },
};

// `parse.js`
process.on('message', (message, data) => {
  if (message !== 'html' || !data) {
    return process.send('Error', new Error('Failed'));
  }

  const parser = new DOMParser();

  const doc = (html) => {
    return parser.parseFromString(html, 'text/xml');
  };

  process.send('data', doc(html).select('span[blah..]').get(0).innerText);
});

process.send('ready', true);