2016-04-23 102 views
0

此流星服務器代碼需要從網站獲取它後解析html字符串。由於許多用戶可能一次使用該應用程序,因此需要一個好方法來儘量減少開銷和響應時間。html解析爲DOM性能

編輯
由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; 
    } 
    } 
}()); 

回答

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); 
+0

請看看我的編輯,將您的解決方案破解密碼即是像回調? –

+0

是的,這使得它是異步的。這個想法是在分叉進程中完成所有的DOM解析和數據檢索,並只將所需的數據返回給主進程。 – PitaJ

+0

我剛剛注意到DOMParser在服務器上是未定義的。什麼是流星的方式來解析HTML到服務器上的DOM? Thx –