Я написал сценарий, который делает 3 снимка экрана данной страницы, упаковывает их в zip-архив и затем отправляет на указанный адрес электронной почты. Я постарался сделать код максимально понятным и читабельным, поэтому все в отдельных функциях. Интересно, можно ли улучшить приведенный ниже код на основе лучших практик? Есть ли смысл использовать классы?
const webshot = require("node-webshot");
const nodemailer = require("nodemailer");
const AdmZip = require("adm-zip");
const fs = require("fs");
const resolutions = {
desktop: {
width: 1920,
height: 1080,
},
tablet: {
width: 768,
height: 1024,
},
mobile: {
width: 320,
height: 480,
},
};
const nodemailerData = {
userEmail: {
service: "gmail",
auth: {
user: "yourAdressemail.com",
pass: "yourPassword",
},
},
mailOptions: {
from: "yourAdressEmail@gmail.com",
to: "someAdressEmail@gmail.com",
subject: "Sending Email using Node.js",
attachments: [
{
filename: "supername.zip",
path: "./zip_files/supername.zip",
},
],
},
};
const setOptions = (screenSize) => {
return {
screenSize,
shotSize: {
width: "window",
//change line below to height: "window" if you want to trim the page to the specified height
height: "all",
},
userAgent:
"Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_2 like Mac OS X; en-us)" +
" AppleWebKit/531.21.20 (KHTML, like Gecko) Mobile/7B298g",
};
};
const setFileName = (url = site, mediaSize = null) => {
const domain = new URL(url).hostname.replace("www.", "");
const fileName = `./screenshots/${domain}-${mediaSize.width}x${mediaSize.height}.jpg`;
return fileName;
};
const takeScreenshot = async (url) => {
resolutionsArray = Object.values(resolutions);
let screenshotsLeft = resolutionsArray.length;
return new Promise((resolve) => {
resolutionsArray.forEach((mediaSize) => {
webshot(
url,
setFileName(url, mediaSize),
setOptions(mediaSize),
(err) => {
if (!err) {
console.log("screenshot taken!");
screenshotsLeft--;
}
if (screenshotsLeft == 0) resolve(url);
}
);
});
});
};
const makeZip = async (url) => {
const zip = new AdmZip();
fs.readdirSync("./screenshots").forEach((file) => {
zip.addLocalFile(`./screenshots/${file}`);
//comment out the method below to avoid deleting screensohts from ./screenshots after save into zip
fs.unlink(`./screenshots/${file}`, function (err) {
if (err) throw err;
});
});
return new Promise((resolve) => {
zip.writeZip(`./zip_files/supername.zip`);
console.log("zip maked!");
resolve(url);
});
};
const sendEmail = () => {
const mail = nodemailer.createTransport(nodemailerData.userEmail);
return new Promise((resolve, reject) => {
mail.sendMail(nodemailerData.mailOptions, (err, info) => {
if (err) {
reject(err);
} else {
console.log("Email sent: " + info.response);
resolve("mail sended!");
}
});
});
};
module.exports = { takeScreenshot, makeZip, sendEmail };