phantom-worker
v0.0.1
Published
A PhantomJS worker. Execute the Single Page Application then return html.
Downloads
2
Readme
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') {
// Render the html for bots.
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') {
// Render the html for bots.
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, // Remove all <script> in the html when it is true.
concurrentQuantity: 2, // How many PhantomJS work in the same time?
contentCacheTTL: 86400, // 24 hrs = 86400s
contentCacheRedisPrefix: 'c:',
phantomArguments: [
'--load-images=no',
'--disk-cache=yes',
'--disk-cache-path=/tmp/phantom-worker'
],
readContentAfter: 0, // minute seconds. If it is 0 checkContentScript will bee executed.
checkContentInterval: 200, // minute seconds
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;
}