Отзывчивый кошмар
примечание: если вы предпочитаете учиться с помощью видео, я загрузил одно из них — оно находится внизу этой статьи.
Вы должны извинить меня за «приманочное» название этой статьи, это действительно не было моим намерением, просто в этом было что-то более элегантное, чем «Делать отзывчивые скриншоты сайта с Phantom и Nightmare».
Давным-давно я написал туториал для net-tuts о написании скрипта для создания адаптивных скриншотов с помощью Casper и PhantomJS. Вскоре после того, как это было опубликовано, @paul_irish написал об этом в Твиттере, и я уволился с работы, потому что, давайте посмотрим правде в глаза, если вы делаете или пишете что-нибудь, а Пол Айриш пишет об этом в твиттере, это только вниз.
Я не знаю, когда он был выпущен или даже как я наткнулся на него сегодня, но я увидел Nightmare.js и подумал, что сейчас самое время вернуться к этому руководству и посмотреть, смогу ли я запустить обновленную версию. Почему? Я отвечу на этот вопрос в конце этого.
Для этого я протестировал его на одном из компьютеров Macintosh, я не тестировал его на Windows, но
поскольку сегодня день Windows 10, я обновлю эту статью, как только у меня будет возможность. :)
Давайте создадим новый каталог и запустим что-нибудь.
npm init
Заставит нас работать с Package.json.
Очевидно, у вас также должны быть установлены phantomjs глобально, поэтому
npm install -g phantomjs
а затем мы можем просто установить кошмар локально в проект
npm install --save nightmare
Круто, и мы почти готовы к работе.
Итак, в предыдущем уроке я использовал system.args для получения URL-адреса, переданного из командной строки, я не уверен, почему я сделал это именно так, но на этот раз давайте просто используем
process.argv
process.argv — это массив, содержащий аргументы командной строки, первый — это узел, второй — имя исполняемого JS-файла, а любые следующие элементы массива — это то, через что мы прошли. Итак, мы хотим
var url = process.argv[2] // the third item in the array
ОК, прежде чем я начну добавлять все элементы окна просмотра и углубляться
во что-то еще, для чего мы могли бы использовать Nightmare, я обычно просто хочу убедиться, что у меня работает базовый пример — взломайте свой любимый текстовый редактор (+2 интернет-очка, если вы используете emacs)
var Nightmare = require(‘nightmare’); var url = process.argv[2]; new Nightmare() .viewport(1440, 900) //sets up our viewport .goto(url) // self explainitory .wait() // You know the internets got weight issues,wait for a bit .screenshot(‘test/weAreTesting.png’) // take a screenshot, save it here .run(function(err, nightmare){ console.log(‘Screenshot taken of : ‘ + url); });
Ладно, открывай свой терминал, давай запустим этого хулигана.
node index.js http://www.reddit.com
Надеюсь, у вас все прошло так же хорошо, как и у меня, и вы получили скриншот.
Таким образом, мы могли бы легко остановиться на этом, но давайте удостоверимся, что, как и раньше, у нас может быть ряд скриншотов с разных размеров области просмотра.
Сначала давайте добавим массив размеров области просмотра — я просто скопировал это из предыдущего урока и не стесняюсь добавлять/изменять там, где это необходимо для вашего проекта.
var viewportSizes = [ [320,480], [320,568], [600,1024], [1024,768], [1280,800], [1440,900] ]
а затем также, как и в предыдущем уроке, давайте возьмем URL-адрес, который мы делаем, и создадим каталог с соответствующим именем, используя магию RegEx.
var saveDir = url.replace(/[^a-zA-Z0–9]/gi, ‘-’).replace(/^https?-+/, ‘’);
Итак, теперь нам нужно пройтись по массиву окон просмотра и сделать скриншот каждого.
viewportSizes.forEach(function(viewport){ new Nightmare() .viewport(viewport[0], viewport[1]) .goto(url) .wait(2000) .screenshot(saveDir + ‘/’ + viewport[0] + ‘-’ + viewport[1] + ‘.png’) .run(function(err, nightmare){ console.log(‘Taken screenshot of’ + url + ‘at ‘ + viewport[0] + ‘x’ + viewport[1]); }); });
Теперь при запуске скрипта у вас должна получиться целая куча скриншотов с разными размерами области просмотра.
Мне нравится Nightmare, и у него есть много других функций, которые могли бы сделать его чем-то, что я бы часто использовал для таких вещей, как тестирование пути пользователя, делая скриншоты каждого шага. У него есть несколько других функций, но он не перегружен вещами. Определенно инструмент, который не занял бы слишком много лишнего места в моем наборе инструментов.
Вот видео, если вам так больше нравится.