phantom-worker
Dependencies
- Redis Server
Use redis to make a task queue and cache html.
Quick Start
1. Clone and Start via pm2
git clone https://github.com/kelp404/phantom-worker.git
cd phantom-worker
npm install
pm2 start process.json
2. Create a task to render the page
const device = require('device');
const phantomWorker = require('phantom-worker');
exports.baseView = function (req, res, next) {
if (device(req.headers['user-agent']).type === 'bot') {
phantomWorker.render({
url: req.protocol + '://' + req.get('host') + req.originalUrl,
isRemoveCompletedJob: true
}).then(function(content){
res.send(content);
});
return;
}
};
You also can create the task by yourself via Kue.
const device = require('device');
const kue = require('kue');
const queue = kue.createQueue({
redis: {
host: 'localhost',
port: 6379,
db: 2
}
});
exports.baseView = function (req, res, next) {
if (device(req.headers['user-agent']).type === 'bot') {
const job = queue.create('phantom-worker', {
url: req.protocol + '://' + req.get('host') + req.originalUrl
});
job.on('complete', function (content) {
job.remove();
res.send(content);
});
job.save(function(error) {
if (error) {
next(new Error(error));
}
});
return;
}
};
Config
phantom-worker use config.
You can add your config for your NODE_ENV
.
/config/production.js
module.exports = {
phantomWorker: {
name: 'phantom-worker',
isCleanAllScriptTags: true,
concurrentQuantity: 2,
contentCacheTTL: 86400,
contentCacheRedisPrefix: 'c:',
phantomArguments: [
'--load-images=no',
'--disk-cache=yes',
'--disk-cache-path=/tmp/phantom-worker'
],
readContentAfter: 0,
checkContentInterval: 200,
checkContentRetryTimes: 50,
checkContentScript: "function(){return document.getElementsByClassName('nprogress-busy').length <= 0}",
redis: {
host: 'localhost',
port: 6379,
password: '',
db: 2
}
}
};
checkContentScript
If your web use NProgress.
You can use this script to check the client site render is done.
function(){
return document.getElementsByClassName('nprogress-busy').length <= 0;
}