Category: Backend

21
Сен
2020

🗄️ 4 базовых функции для работы с файлами в Node.js

В Node.js программно манипулировать файлами можно с помощью встроенного модуля fs, содержащего функции, необходимые для чтения, записи, удаления и перемещения файлов на сервере. Рассмотрим эти функции в действии.

Перед чтением инструкции убедитесь, что у вас уже установлен Node.js. Для работы с файлами используются промисы с синтаксисом async/await . Если вы незнакомы с концепцией асинхронного программирования в JavaScript, ознакомьтесь с нашим руководством.

Шаг 1. Читаем файлы с помощью readFile()

В каждом из следующих примеров мы сначала импортируем модуль fs – стандартный
Node.js модуль для работы с файлами. В первом примере мы воспользуемся функцией
readFile() – прочитаем файл, сохраним содержимое в
переменной и выведем результат в консоль.

Начнем с
настройки среды. Создадим папку
node-files для хранения проекта:

        mkdir node-files
cd node-files
    

В этой папке создадим текстовый файл greetings.txt для тестирования работы нашей программы:

        echo "hello, hola, bonjour, hallo" > greetings.txt
    

Команда echo выводит строковый аргумент в терминал, а символ > перенаправляет вывод в файл greetings.txt.

Cоздадим и
откроем в текстовом редакторе файл readFile.js. Например, с помощью
nano:

        nano readFile.js
    

Начнем с импорта внутри файла программы модуля fs:

        const fs = require('fs').promises;
    

Когда модуль fs только
создавался, основным способом написания асинхронного кода в Node.js были коллбэки. Но по мере роста популярности промисов, команда Node.js поработала и над их поддержкой в модуле fs.

Создадим асинхронную функцию для чтения файла. Такие функции начинаются с
ключевого слова async. С помощью функции можно разрешать промисы,
используя await, вместо того чтобы связывать промис с помощью метода .then().

        const fs = require('fs').promises;

async function readFile(filePath) {
  try {
    const data = await fs.readFile(filePath);
    console.log(data.toString());
  } catch (error) {
    console.error(`Got an error trying to read the file: ${error.message}`);
  }
}
    

Чтобы ловить ошибки
асинхронного чтения файлов, заключаем вызов fs.readFile() в блок
try...catch.

По умолчанию fs.readFile()
возвращает объект, который может хранить файлы любого типа. Когда журналируется
содержимое файла, все байты преобразуются в текст с помощью метода toString().

Если обнаружена ошибка
(если файл не найден или нет прав на чтение), в консоль выведется
соответствующее сообщение.

Осталось лишь вызвать функцию.

        const fs = require('fs').promises;

async function readFile(filePath) {
  try {
    const data = await fs.readFile(filePath);
    console.log(data.toString());
  } catch (error) {
    console.error(`Got an error trying to read the file: ${error.message}`);
  }
}

readFile('greetings.txt');
    

Сохраняем файл программы и выходим из редактора. Запускаем скрипт:

        node readFile.js
    

Получаем следующий результат:

        hello, hola, bonjour, hallo
    

Шаг 2. Запись файлов с помощью writeFile()

Создадим другой программный файл writeFile.js:

        nano writeFile.js
    

В этом примере мы напишем две функции: первая будет создавать CSV-файл, а вторая –
добавлять в него данные.

Вставим в файл следующий код:

        const fs = require('fs').promises;

async function openFile() {
  try {
    const csvHeaders = 'name,quantity,price'
    await fs.writeFile('groceries.csv', csvHeaders);
  } catch (error) {
    console.error(`Got an error trying to write to a file: ${error.message}`);
  }
}
    

Сначала функция openFile() создает
переменную csvHeaders, содержащую заголовки столбцов CSV-файла, а затем использует
функцию fs.writeFile() для создания файла и записи в него данных. Первый аргумент –
путь к файлу. Поскольку мы указали только имя, Node.js создаст файл в том же
каталоге, в котором мы выполняем код. Второй аргумент – записываемые данные. Создадим еще одну функцию для добавления данных в конец файла:

        const fs = require('fs').promises;

async function openFile() {
  try {
    const csvHeaders = 'name,quantity,price'
    await fs.writeFile('groceries.csv', csvHeaders);
  } catch (error) {
    console.error(`Got an error trying to write to a file: ${error.message}`);
  }
}

async function addGroceryItem(name, quantity, price) {
  try {
    const csvLine = `\n${name},${quantity},${price}`
    await fs.writeFile('groceries.csv', csvLine, { flag: 'a' });
  } catch (error) {
    console.error(`Got an error trying to write to a file: ${error.message}`);
  }
}
    

Асинхронная функция
addGroceryItem() принимает три аргумента: название товара, сумму и цену за
единицу. Эти аргументы используются с шаблонным литеральным синтаксисом для
формирования переменной csvLine, записываемой в файл.

Затем, как и в функции openFile(), используется
метод writeFile(), но на этот раз есть третий
аргумент: объект JavaScript c ключом flag и значением 'a' . Так мы сообщаем Node.js, что данные нужно добавить в конец файла. По умолчанию флаг имеет значение 'w', при котором создается новый файл,
если он не существует, иначе файл перезаписывается. Вы можете узнать больше о
флагах файловой системы в
документации Node.js.

Для завершения скрипта
добавим в конец файла программы следующие строки:

        (async function () {
  await openFile();
  await addGroceryItem('eggs', 12, 1.50);
  await addGroceryItem('nutella', 1, 4);
})();
    

Запускаем код:

        node writeFile.js
    

В текущем каталоге будет создан новый файл groceries.csv.

        cat groceries.csv
    

Содержимое файла groceries.csv следующее:

        name,quantity,price
eggs,12,1.5
nutella,1,4
    

Вызов openFile() создал
новый файл и добавил заголовки столбцов. Последующие вызовы
addGroceryItem() добавляют две строки с данными.

Шаг 3. Удаление файлов с помощью unlink()

На этом шаге мы научимся удалять файлы с помощью функции unlink() модуля fs и напишем Node.js скрипт для
удаления groceries.csv, созданного на предыдущем шаге.
Создадим новый программный файл deleteFile.js:

        nano deleteFile.js
    

Напишем в программном файле код, создающий
асинхронную функцию deleteFile(), которая принимает путь к файлу в
качестве аргумента и передает его функции fs.unlink(), чтобы та удалила файл из файловой системы:

        const fs = require('fs').promises;

async function deleteFile(filePath) {
  try {
    await fs.unlink(filePath);
    console.log(`Deleted ${filePath}`);
  } catch (error) {
    console.error(`Got an error trying to delete the file: ${error.message}`);
  }
}

deleteFile('groceries.csv');
    
Обратите внимание
Когда вы удаляете файл с помощью функции unlink(), он не отправляется в recycle.bin или корзину, а навсегда удаляется из файловой системы. Это действие необратимо.

Сохраняем файл и запускаем код:

        node deleteFile.js
    

На выходе получаем следующее:

        Deleted groceries.csv
    

Чтобы убедиться, что
файла больше нет, используем команду ls:

        ls
deleteFile.js   greetings.txt   readFile.js     writeFile.js
    

Шаг 4. Перемещение файлов с помощью rename()

Напоследок рассмотрим функцию перемещения. Перед тем как начать, создадим папку test-data, в которую будем перемещать файл:

        mkdir test-data
    

Скопируем файл:

        cp greetings.txt greetings-2.txt
    

Откроем для
редактирования программный файл:

        nano moveFile.js
    

Создадим функцию
moveFile(), вызывающую rename(). В ней необходимо указать путь к местоположению
исходного и целевого файлов.

        const fs = require('fs').promises;

async function moveFile(source, destination) {
  try {
    await fs.rename(source, destination);
    console.log(`Moved file from ${source} to ${destination}`);
  } catch (error) {
    console.error(`Got an error trying to move the file: ${error.message}`);
  }
}

moveFile('greetings-2.txt', 'test-data/salutations.txt');
    

Функция rename() может переместить файл в другую папку, переименовать файл в текущем каталоге или сделать и то, и другое одновременно, как в нашем коде.

Сохраним и запустим код:

        node moveFile.js
    

В ответ получаем следующее:

        Moved file from greetings-2.txt to test-data/salutations.txt
    

Подтвердим успех
операции:

        ls
deleteFile.js   greetings.txt   moveFile.js     readFile.js     test-data       writeFile.js
    

Заключение

Мы изучили функции управления файлами с помощью Node.js. Сначала загрузили содержимое файла функцией readFile(). Затем создали новый файл и добавили в него данные с помощью writeFile(), удалили файл с unlink(), а затем переместили и переименовали файл посредством rename().

С помощью функций модуля fs разработчики могут контролировать использование файлов в программах Node.js. Кстати, у нас есть и другие полезные материалы по теме Node.js:

15
Сен
2020

🌐 Кто такой Web Developer: гайд по профессии

Веб-разработка – популярная, но отнюдь не простая область IT. В этой статье детально рассмотрим профессию веб-разработчика и опишем путь от новичка до востребованного специалиста.

Для построения новостного сайта, браузерной игры или сервиса видеоконференций требуются разные компетенции, однако базовые технологии одни и те же. Данный материал подготовлен при поддержке факультета веб-разработки онлайн-университета GeekBrains, где происходит освоение соответствующих компетенций.

Базовые технологии

Веб-разработку разделяют на frontend и backend. Frontend отвечает за работу на стороне клиента, корректное отображение веб-страниц на разных типах устройств. Backend всё, что происходит на стороне сервера: вычисления, работа с базами данных, взаимодействие с другими сервисами.

Под Web Developer обычно понимают программиста, который умеет работать и на стороне клиента, и на стороне сервера. Универсального программиста, который может сделать проект с нуля, разбирается в базах данных, конфигурировании сервера, безопасности, называют Full Stack Web Developer. Более узких специалистов – Backend Web Developer и Frontend Web Developer.

Базовые технологии Frontend

HTML – язык разметки страниц, костяк веб-страницы. С помощью HTML мы подключаем JS-скрипты и CSS-стили и определяем элементы страницы: текст, заголовки, поля ввода информации, переключатели и кнопки.

CSS – язык описания стилей элементов, с помощью которого добиваются качественного отображения страницы.

JavaScript – скриптовый язык, который служит для придания страницам динамики. За счет JavaScript элементы реагируют на действия пользователя. JavaScript также взаимодействует с бэкэндом. При усложнении логики и росте кодовой базы лучше использовать не чистый JavaScript, а фреймворки, о которых мы расскажем позже.

Базовые технологии Backend

На стороне сервера может использоваться множество технологий и различных языков программирования. Рассмотрим самые востребованные из них.

PHP. 4500 вакансий по России. Самый популярный язык программирования на стороне сервера: 80% сайтов и сервисов в Интернете написаны на PHP. Язык обладает большим сообществом, огромным количеством готовых библиотек, фреймворков, учебных материалов и руководств. Если вы делаете первые шаги в профессии веб-разработчика, рекомендуем начать с PHP. Язык легок в освоении, используется не только в любительских, но и больших профессиональных проектах: Facebook, VK, Wikipedia, BlaBlaCar. Средняя зарплата 200 000 руб. (здесь и далее зарплаты указаны до вычета НДФЛ).

Java. 2200 вакансий по России. Популярный язык программирования, но с высоким порогом входа. Применяется в средних и крупных проектах. С помощью Java-фреймворка Spring создаются высокопроизводительные, масштабируемые и безопасные приложения. Средняя зарплата 250 000 руб.

Python. 1800 вакансий по России. Язык с низким порогом входа. Дружелюбное комьюнити и развитая документация, пошаговые руководства и видеоуроки позволят быстро прояснить любой вопрос. Наиболее зрелая и популярная технология – фреймворк Django. Python применяют в проектах любого размера, на нем частично написаны такие сервисы, как YouTube, Google Search, Instagram и Spotify. Средняя зарплата 160 000 руб.

Node.js. 1500 вакансий по России. Технология Node.js позволяет строить высоконагруженные, легко масштабируемые решения при помощи языка JavaScript. Если вы уже имеете опыт во фронтенд-разработке, то сможете быстро начать программировать на Node.js. Технологию применяют в проектах, где важна одновременная обработка большого количества запросов. Активно используется компаниями Paypal, Yahoo! и eBay. Средняя зарплата 205 000 руб.

ASP.NET. 1300 вакансий по России. Если вы уже знаете язык C#, то вам подойдет фреймворк ASP.NET. Свои преимущества фреймворк полностью раскрывает только при работе в инфраструктуре Microsoft. Технологию используют Starbucks и StackOverflow. Средняя зарплата 160 000 руб.

Язык/технология Зарплата, тыс. руб Количество вакансий (на 15.09.20) Популярность на GitHub (среди перечисленных технологий) Популярность на StackOverflow, %
PHP 200 4500 3 26.2
Java 250 2200 2 40.2
Python 160 1808 1 44.1
Node.JS 205 1456 4 24.5
ASP.NET 160 1314 5 18.7

Источник статистики по StackOverflow, источник статистики GitHub, статистика по вакансиям взята с hh.ru, статистика по зарплатам предоставлена компанией Hays

Общие технологии продвинутого уровня

Развертывание инфраструктуры

Веб-разработчик должен уметь разворачивать инфраструктуру для полноценной работы своего веб-приложения. Такими компонентами являются:

  • веб-сервер (например, Nginx или Apache);
  • серверная операционная система: веб-приложения редко работают на Windows или MacOS, отраслевым стандартом является Linux;
  • интерпретатор языка нужной версии – в зависимости от того, какие новые функции языка необходимо использовать или какую версию требует фреймворк;
  • база данных (например, MySQL или PostgreSQL).

Книги по теме:

Тестирование

В любой сколько-нибудь сложной системе появляются ошибки. Изменение в конфигурации и обновление ПО на сервере также может вызвать проблемы. Найти их и устранить помогает тестирование. Рекомендуем начать разбираться с юнит-тестирования, в котором для каждого нетривиального метода или функции пишется свой тест.

Книги по теме:

Наши статьи по теме:

Системы контроля версий

Сложное веб-приложение невозможно за приемлемое время написать одному человеку: для этого необходима команда специалистов, которые разделяют между собой обязанности и ведут распределенную кодовую базу. Для этого используются системы контроля версий, самой распространенной из которых является Git. Знание GIt гарантированно потребуется при трудоустройстве веб-девелопером.

Наши статьи по теме:

Пакетные менеджеры

Вокруг каждого языка программирования и фреймворка сформировалась инфраструктура: библиотеки, расширения, пакеты. Зачем писать собственный http-клиент, если существует хорошо отлаженный пакет с нужным функционалом? Так, в PHP используется composer, в Java – Gradle, в JavaScript и Node.Js – npm, в Python – pip.

Продвинутый Frontend

Представим, что вы изучили синтаксис выбранного языка и его основные концепции. Теперь нужно выбрать фреймворк – каркас приложения, который задает архитектурные правила и содержит основные части веб-приложения.

Frontend-фреймворки развиваются очень быстро, каждый месяц появляются новые фреймворки и библиотеки. Не нужно пытаться узнать все, достаточно выбрать одну из наиболее популярных технологий, например, React, Vue или Angular.

Фреймворк Количество вакансий Репозиториев на GitHub Популярность StackOverflow, % Уровень сложности Зависимостей в npm
React 4 280 73 458 35.9 ⭐⭐ 48 718
Angular 2 364 20 142 25.1 ⭐⭐⭐ 13 579
Vue 2 021 21 776 17.3 21 575

Источник статистики по StackOverflow, источник статистики GitHub, статистика по вакансиям взята с hh.ru

Продвинутый Backend

Backend-фреймворки менее разнообразны – обычно есть 1-2 лидера, которые занимают существенную часть рынка, а остальные либо узко специализированы, либо технологически отстают от лидеров. Для PHP такими фреймворками являются Symfony и Laravel, для Java – Spring и JSF, для Python – Django, Pyramid и Flask, для Node.JS – Express.JS, Meteor.JS и Koa.JS.

Ниже представлена сравнительная таблица оценки популярности PHP-фреймворков.

Фреймворк Установок через composer Зависимых проектов Популярность на GitHub Количество вакансий
Laravel 104 726 623 9 548 22 048 1 085
Symfony 52 561 771 3 971 23 880 819
Phalcon 29 504 2 10 232 47
CodeIgniter 773 857 65 18 071 52
Yii 10 393 997 11 540 217 890
CakePHP 6 027 870 1 649 8 234 10
Slim Framework 13 410 045 1 329 10 723 19
Lumen 535 795 53 6 900 45

Данные по количеству вакансий указаны по данным сервиса hh.ru, остальные данные взяты с сервиса packagist.org.

Продвинутый Web Developer: паттерны проектирования

Независимо от типа разработки, кроме знания технических деталей, потребуется и понимание паттернов общих, устоявшихся методов проектирования информационных систем. Без этого любой современный фреймворк покажется набором магических конструкций.

Книги по паттернам:

Наши публикации о паттернах:

Практическое освоение технологий

Книги, документация и курсы дадут теорию, закрепить которую можно только с помощью практики. Приобрести навыки можно различными способами.

Домашние проекты

Самые простой способ получить реальный опыт – придумать и развить нужный самому себе проект. Отличным началом может стать собственный редактор заметок или список дел. Примеры идей и практическую пользу от их реализации мы рассматривали в статье о проектах выходного дня.

Ресурсы с задачами для программистов

Опыта проектной разработки от решения задачей вы не получите, однако глубже узнаете выбранный язык программирования и специфические алгоритмы, которые понадобятся в работе.

Присоединяйтесь к проектам на GitHub

Выберите интересный проект и вносите в него полезные правки, исправляйте ошибки, пишите дополнения к интересующим вас библиотекам или фреймворкам. Это поможет не только развить технические навыки, но и даст понимание практики командной разработки и знакомств в сфере IT. Активный аккаунт на GitHub выгодно выделит вас среди других кандидатов на роль веб-программиста. Вы всегда можете показать, в какие проекты вы отправляли код, и сами примеры кода.

Заключение

Веб-программирование – сложная, но интересная область. Безусловно, можно стать веб-разработчиком и своими силами, но есть и более легкие решения. Например, вы можете пройти курс факультета веб-разработки онлайн-университета GeekBrains. Информация в курсе хорошо структурирована, с вами будет работать личный наставник, а портфолио пополнится 4 актуальными проектами.

Вы узнаете, как профессионально верстать, используя HTML и CSS, научитесь программировать на JavaScript (в том числе используя React). На стороне сервера вы освоите PHP (Laravel) и Node.js (фреймворк Express). Не будут обойдены вниманием базы данных (MySQL) и операционная система Linux. Всё сразу в одном месте. Отличный вариант, чтобы стать настоящим веб-разработчиком за приемлемое время.

27
Авг
2020

Посоветуйте сферу разработки [закрыт]

Нужен совет от опытных людей – в какой сфере развиваться дальше:
имею год коммерческого опыта на С++. Учусь на заочном(it специальность провинциального вуза, бакалавриат). И вот думаю, что дальше. Хочется в дальнейшем проектировать крупные…

24
Авг
2020

Что нужно изучать backend разработчику?

Я начал изучать язык программирования Python и двинулся глубже. Изучал фреймворки и наткнулся на Django, изучаю его и он мне понравился. Суть вопроса в том что, можно ли с помощью Django произвести или работать с Backend ?
У меня просто пу…

09
Авг
2020

портфолио для backend

куда можно выкладывать свой опыт для backend программиста? я о портфолио, есть ли сайты специально заточенные под портфолио для программистов? русскоязычные или англо?
К примеру для дизайнеров есть кучу площадок behance, dribbble, clipping…

08
Авг
2020

Почему письмо с сервера (через php код) то приходит ко мне на почту, то нет?

Я хочу отправлять письма с каким-то текстом с сервера (хостинг и домен на reg.ru) себе на почту. Код ниже. Самое странное – это тот факт, что письмо то приходит на почту, то нет. Никак не пойму, от чего это может зависеть. Если у Вас есть …

08
Авг
2020

Не могу получит доступ к django сайту на gogole cloud сервере

всем привет. У меня сервер на google cloud типа N1 в зоне uscentral1a. Намигрировал джанго проект, Установил все нужное на сервере, сконфигурировал settings.py(AllowedHosts, StaticRoot) и запустил runserver на 0.0.0.0:8000, попитлася получ…

29
Июл
2020

Как в PHP просканировать папку и все подпапки и взять файлы с расширением html?

Мне нужно просканировать изначальную папку и все её подпапки и подпапки подпапок и брать файлы только с расширением html.
Этот мой скрипт сканирует только самую верхнюю папку, а подпапки – нет.
<?php

header(‘Content-Type: application/…

17
Июл
2020

Как работают бэкенд и фронтенд части принцип

Есть заготовка проекта на vue js там весь фронт.
Нужно создать бекенд на node js (который, по-сути не будет в самом себе хранить данные, а будет их получать по реализованному апи от отдельной машины с БД).
Как правильно должно происходить…

17
Июл
2020

Знание фронтэнда о доступных действиях в бэкенде (rest api)

Приложение работает через rest. Интересует: как фронтэнду заранее можно знать (не делая запрос) доступно ли текущему пользователю действие по некоему эндпоинту? Т.е. у фронта должна быть возможность сделать проверку на доступ не делая прям…

17
Июл
2020

Как фронтэнду заранее узнать о доступных действиях в бэкенде?

Приложение работает через rest. Интересует: как фронтэнду заранее можно знать (не делая запрос) доступно ли текущему пользователю действие по некоему эндпоинту? Т.е. у фронта должна быть возможность сделать проверку на доступ не делая прям…

17
Июл
2020

подскажите как правильнее и лучше протестировать eventEmitter на количество слушателей

У меня есть функция которая подключает слушателей к событиям, количество слушателей зависит от количества приходящих пакетов в эту функцию
Суть теста в том чтобы удостовериться в том что количество пакетов равно количеству слушателей
Тест …

09
Июл
2020

PHP фрейморк для новичка в 2020

Я начинаю изучать PHP.
Подскажите, пожалуйста, какой фреймворк лучше выбрать новичку, чтобы он в нем можно было реально разобраться и он востребован или не было бы проблем с переходом на другой фреймворк?
Желательно с основными плюсами и м…

08
Июл
2020

REST API в качестве backend

Хочу сделать мини соц сеть
Правильно ли если так делать:
Написать фронтенд на Vue js, NUXT А в качестве backend использовать api в качестве обработки данных, вывод постов, лайков, и т.д
Или как можно комбинировать Vue с backend, напишите с…

11
Июн
2020

⏳ 10 способов ускорить загрузку вашего сайта

Веб-проект, над которым вы работаете, стал медленнее загружаться? Рассказываем о десятке моментов, на которые стоит обратить внимание, чтобы сократить время загрузки страниц.

Существует множество причин, почему у пользователей может медленно загружаться сайт. Следуя лучшим практикам, можно, по крайней мере, смягчить проблему, убедившись, что мы сделали всё возможное.

1. Используйте CDN

CDN (Content Delivery Network) – географически распределённая сетевая инфраструктура, которая оптимизирует доставку контента конечным пользователям, давая доступ к сотням серверов по всему миру, размещающих копию
вашего сайта.

Если вы уже используете CDN, проверьте,
правильно ли вы настроили кэширование. Проблемы с кэшем могут привести к тому,
что CDN будет запрашивать ресурс у вашего сервера, а это противоречит
цели использования этой инфраструктуры.

2. Включите gzip-сжатие

В некоторых CDN gzip-сжатие можно включить флажком Enable
compression
. Сжатие файлов обеспечит более быструю загрузку контента пользователями сайта.

3. Используйте оптимизацию изображений

Уменьшайте все изображения, которые не потеряют в качестве и не будут масштабироваться
Уменьшайте все изображения, которые не потеряют в качестве и не будут масштабироваться

Распространённая причина долгой загрузки страниц – избыточное качество изображений или выбор неподходящего формата. Можно уменьшить количество пикселей по каждой из сторон и применить сжатие изображений. Прогресс не стоит на месте – обратите внимание на формат сжатия изображений WebP.

Если у вас сайт на WordPress, можно использовать плагины, которые уменьшат размер автоматически в процессе загрузки.

4. Уменьшите количество
запросов, совершаемых страницей

Сократите число запросов, необходимых для загрузки верхней части страницы. Есть два способа:

  • уменьшить количество запросов, удалив то, что не влияет на работу сайта;
  • отложить загрузку низкоприоритетного контента, используя функцию ленивой загрузки.

5. Избегайте
перенаправлений


Редиректы значительно
замедляют работу сайта. Чтобы не держать специальный поддомен для
мобильных пользователей, используйте адаптивный CSS.

Некоторые редиректы
неизбежны, например, www -> root domain или root domain -> www, но
основная часть трафика не должна поступать через перенаправления.

6. Сократите время до первого байта

Время до первого байта (TTFB) –
это время, которое браузер тратит на ожидание данных с сервера после отправки запроса на ресурс.

На этот показатель влияют два параметра:

  1. Время, потраченное на сервере.
  2. Время, потраченное на отправку данных.

Первый параметр можно уменьшить, оптимизировав работу на стороне сервера: запросы к базам данных, вызовы API, балансировку нагрузки и т. д..

О втором параметре мы уже поговорили – на него мы можем повлиять, используя CDN.

7. Решите вопрос блокировки рендеринга JavaScript

Внешние скрипты часто блокируют загрузку страницы до
тех пор, пока не выполнятся
сами. Этот эффект можно смягчить, пометив внешние скрипты директивой async:

        https://example.com/external.js
    

Можно отложить
загрузку сценариев до тех пор, пока пользователь не начнёт совершать
активные действия:

        window.addEventListener(
  'scroll',
  () =>
    setTimeout(() => {
      //insert marketing snippets here
    }, 1000),
  { once: true }
);
    

8. Минимизируйте CSS и JavaScript


Минимизация подразумевает
использование инструментов для удаления пробелов, символов перевода строки и
сокращения длины имён переменных. Как правило, это делается автоматически в рамках
процесса сборки. Есть специальные инструменты: например,
UglifyJS для JavaScript или cssnano для CSS.

9. Удалите
неиспользуемый код CSS и JavaScript

Чем больше проект, тем больше вероятность, что какой-то код стал неактуальным. И лучший способ его минимизировать и сократить время загрузки – просто удалить ненужный код.

Начиная с Chrome 59, в Chrome DevTools
можно анализировать использование JavaScript и CSS.
Для этого откройте DevTools, перейдите во вкладку Console, нажмите на три точки и
откройте Coverage. При нажатии кнопки со значком перезагрузки будет проведен аудит использования CSS и JavaScript. Помеченные красным блоки кода загружаются, но не используются.

Аудит использования CSS и JS
Аудит использования CSS и JS
Примечание
Об использовании средств DevTools для ускорения загрузки сайта читайте в нашем подробном мануале «Ускоряем загрузку сайта с помощью Chrome DevTools».

10. Регулярно
отслеживайте скорость загрузки сайта

Если вы возьмете за
правило обращать внимание на проверку скорости загрузки, это станет гораздо меньшей проблемой.

Есть бесплатные
инструменты для мониторинга скорости, например,
WebPageTest и Google Lighthouse. Но нужно не забывать запускать их до и после внесения изменений. Для автоматизации запуска GoogleLighthouse можно использовать PerfBeacon.

Заключение

Несомненно, скорость
сайта – важный параметр. Важно следить за этим показателем и вносить по мере необходимости изменения в структуру веб-проекта.
Но кроме скорости сайта поисковые системы оценивает полезность контента – в погоне за улучшением производительности сайта не забывайте о его наполнении.

Другие материалы по теме

08
Июн
2020

javascript для backend разработчика

Всех приветствую, сразу прошу прощения за расплывчатый вопрос.

Хочу стать бекенд разработчиком, доучился до уровня кривого сайта на Django/Bootstrap. Перехожу к изучению Django Rest Framework ибо углубляться в стоковый Django можно очень …

03
Июн
2020

Почему когда делают переход по URL с GET параметром, то в начало адреса добавляется приставка /public. Laravel

Такая проблема. Есть кнопка на сайте, а к ней добавлен GET параметр. Когда я нажимаю перейти то осуществляется переход, но к адресу добавляется /public. Если убрать GET параметр и оставить ссылку, то все хорошо и ссылка стандартная.

Так в…

28
Май
2020

Почему cURL возвращает NULL?

Помогите, пожалуйста, разобраться в проблеме. Отказывается работать cURL. Раньше работал, сейчас по неизвестной мне причине возвращает ответ NULL.

$curl = curl_init();
curl_setopt($curl, CURLOPT_AUTOREFERER, TRUE);
curl_setopt($curl, CURL…

26
Май
2020

Безопасная загрузка изображений в веб-приложении на Django

🖼️ 💾 Почти в любом веб-приложении есть необходимость принимать от пользователей картинки. В Django это можно делать лаконично и безопасно, используя ImageField и Pillow.

Загрузка изображений в
Django

3411d48a-91e2-4b1b-8d23-b701155f3593В Django есть два поля, позволяющих загружать картинки: FileField и ImageField. Второй вариант – специализированная версия FileField, использующая подтверждение от библиотеки Pillow, что файл является изображением.

dcf6fa4c-fcb2-4441-97ca-a7102649a58cНачнем с
создания моделей. Создадим файл models.py и поместим в него следующее содержимое:

models.py
            from django.db import models

class Image(models.Model):
    title = models.CharField(max_length=200)
    image = models.ImageField(upload_to='images')

    def __str__(self):
        return self.title
        

0ba04c44-3fdc-4eda-b4e4-a7750d38f502Переменная image – это
поле ImageField, которое работает с API хранилища, который обеспечивает способ
хранения/извлечения, а также чтения/записи файлов.

5a38b4c6-df6e-45e9-908c-c7481e611bbaПараметр upload_to
указывает путь, где будут храниться изображения. Для этой модели он будет соответствовать MEDIA_ROOT/images/

64094f69-8bc4-4e98-a12b-addaedfb2649Также возможна
установка динамических путей для изображений:

            image = models.ImageField(upload_to='users/%Y/%m/%d/', blank=True)
        

babb3c17-94c7-4b60-9ee6-e3ee8b02b3ccЭто позволит хранить
изображения в каталогах вида MEDIA_ROOT/users/2020/05/26.

1f77f8b1-eecc-425b-87ce-8c0173639338Установим Pillow, выполнив следующую команду:

            pip install Pillow
        

aa7d5d86-8f11-4550-aa7e-9199ab4124ffЧтобы Django
обслуживал медиафайлы, загруженные пользователями, добавим следующие настройки
в файл settings.py вашего проекта:

            # Основной url для управления медиафайлами
MEDIA_URL = '/media/'

# Путь хранения картинок
MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')
        

330875b3-4003-4fd1-ace7-ffa6f40a70baMEDIA_URL – это
URL-адрес, который будет обслуживать медиафайлы, а MEDIA_ROOT – это путь к
корневому каталогу, в котором хранятся файлы.

ad33a632-b4bb-41a2-958b-42cf044d9367Добавим следующий код
в urls.py:

urls.py
            from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    path('admin/', admin.site.urls),
    ...]
if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL,
                          document_root=settings.MEDIA_ROOT)
        

2234025d-7599-43d3-b003-8cccee895b3aТеперь нам нужно создать форму
для модели изображения. В файл forms.py добавим следующий код:

forms.py
            from django import forms
from .models import Image


class ImageForm(forms.ModelForm):
    class Meta:
        model = Image
        fields = ('title', 'image')
        

68f12e0c-5b94-4ef5-8275-037610e36726Это создаст форму с
полями title и image, которые будут отображаться в шаблонах. А сейчас создадим
шаблон для загрузки файлов. В index.html внесем следующее:

            <form method="post" enctype="multipart/form-data">
  {% csrf_token %}
   {{ form.as_p }}
  <button type="submit">Upload</button>
</form>

{% if img_obj %}
  <h3>Succesfully uploaded : {{img_obj.title}}</h3>
  <img src="{{ img_obj.image.url}}" alt="connect" style="max-height:300px">
{% endif %}
        

2a8dfb39-55b7-4438-a3f8-e55a209a7399Включение свойства enctype для формы обеспечивает правильное прикрепление загруженного файла к запросу.

753ed0d4-88fa-4d51-b539-49ff7c23455bНапишем обработчик формы в views.py:

            from django.shortcuts import render
from .forms import ImageForm


def image_upload_view(request):
    """Process images uploaded by users"""
    if request.method == 'POST':
        form = ImageForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            # Get the current instance object to display in the template
            img_obj = form.instance
            return render(request, 'index.html', {'form': form, 'img_obj': img_obj})
    else:
        form = ImageForm()
    return render(request, 'index.html', {'form': form})
        

ef51f263-dc45-4576-81c1-e450c638dcf1Django делает всю
работу сам, а мы просто прогоняем форму через валидацию и сохраняем ее при
успешной загрузке файла. Теперь, когда обработчик готов, сопоставим все
с URL-адресом в urls.py:

            urlpatterns = [
    ......
    path('upload/', views.image_upload_view)
    ......
]
        

038a29b9-408f-4259-baaa-9036db34326aСохраним файлы,
запустим сервер и проверим работу программы.


Заключение

75ddcc17-ed61-402b-9365-691684711a8dМы рассмотрели
простейший вариант безопасной загрузки картинки на сервер с помощью Django.
Вариант прост в реализации и понятен не только для специалистов с опытом. Удачи
в обучении.