JSON Web Token
Методов авторизации и аутентификации есть много, но в последнее время большинство из них основывается на JWT.
JSON Web Token — это созданная в определенном формате base64 строка. JWT считается одним из самых безопасных и удобных форматов для передачи токенов и небольшого набора пользовательских данных с запросом.
Особенность такого формата токена в первую очередь заключается в удобстве. JWT — полностью самодостаточная единица информации. Все необходимые для идентификации данные можно хранить в самом токене, в блоке с полезной нагрузкой.
Каждый токен доступа состоит из трёх основных частей:
— Заголовок, в котором определяется информация о самом токене
— Полезная нагрузка — JSON объект, куда записываются все данные, необходимые для авторизации
— Подпись — ключ, который, пусть и не позволит зашифровать сам токен, зато дает возможность валидировать токен на изменения.
Части токена разделяются точками.
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJwcm9nd2F5IiwiaWF0IjoxNjg4MDMzMzI1LCJleHAiOjE3MTk1NjkzMjUsImF1ZCI6Ind3dy5wcm9nd2F5LmNvbSIsInN1YiI6InByb2d3YXkiLCJuYW1lIjoiRGVuaXMiLCJzdXJuYW1lIjoiUHV0bm92IiwiZW1haWwiOiJwcm9nd2F5QGVtYWlsLmNvbSIsInJvbGUiOiJBRE1JTiJ9.BTdcnNwZBfAHEmZEwf2P7s724Q1sZ60N2dHVRXhGtHI
{
"name": "Denis",
"surname": "Putnov",
"email": "progway@email.com",
"role": "ADMIN"
}
base64
, поэтому декодировать его сможет любой желающий. Именованный и неименованный экспорт
Начнем с того, что экспорт бывает разный — именованный и неименованный.
Именованный экспорт — это использование ключевого слова export
перед каждой сущностью или при использовании «паттерна» export list
, когда все экспортируемые сущности перечисляются в одном месте файла:
// именованный экспорт
export const a = 1
// export list
const c = 3
const d = 4
const f = 5
export {
c,
d,
f
}
export default
:// стандартный экспорт
const b = 2
export default b
import {
Status,
getUser,
render as renderFunction
} from './file'
import React from 'react'
import React, { useState, useMemo } from 'react'
import Angular from 'react' // абсолютно валидно
import { Status as UserStatus } from './file'
export default
является инструментом, использование которого только усложнит поиск чего-либо по коду и его отладку.export default
можно отнести то, что такие сущности индексируются статическими анализаторами медленнее и сложнее, что в больших проектах может повлечь за собой проблемы с линтингом.export default
до минимума, предпочитая именованный экспорт и импорт. Использовать export default
валидно только для интеграции вашего кода с уже готовыми решениями, например, это может быть React.lazy
и React.memo
, которые работают только с export default
по умолчанию. У меня есть удобный хак как это обойти, но это тема для отдельного поста.Что такое SSL и TLS
Не так давно я разбирал разницу между HTTP и HTTPS и в этом посте были затронуты SSL и TLS, но я так и не раскрыл до конца что это такое. Исправляюсь.
SSL и TLS — это протоколы шифрования данных транспортного уровня по модели OSI. Оба этих протокола выполняют одну и ту же функцию — обеспечение безопасности передачи данных между клиентом и сервером в сети.
Безопасность обеспечивается путём обмена ключами шифрования между клиентом и сервером. Клиент всегда первым инициализирует процесс обмена ключами, запрашивая сертификат сервера.
Сертификат — это набор информации о сервере, а именно:
— домен
— публичный ключ сервера
— серийный номер сертификата
— название организации, которая выдала сертификат
— цифровая подпись
Клиент получает сертификат сервера и генерирует свой случайный ключ шифрования и отправляет его обратно также в зашифрованном виде.
публичный ключ сервера + сегенерированный ключ = ключ, отправляемый обратно
Модель OSI без задротства
Без задротства, потому что углубленно информация о модели OSI вряд ли понадобится вообще хоть кому-то в Front-End’e, тем более джунам. Но всё же, как и со всем остальным — знать точно полезно.
Модель OSI — Open Systems Interconnection — модель, которая создана для всеобщего упрощения и стандартизации обмена данными между различными компьютерами и системами.
Появилась она из-за того, что в момент активного развития сети, каждый производитель использовал собственные протоколы и собственную архитектуру сети в целом, что в конечном итоге приводило к огромной неразберихе.
Модель OSI помогает решить эту проблему, обеспечивая совместимость всех компьютеров, независимо от их комплектующих и программной части.
Сама модель разделяет процесс передачи данных на семь отдельных уровней, каждый из которых выполняет конкретные функции. То есть достаточно сложный процесс передачи данных разделяется на семь уровней поменьше.
Что действительно интересно, так это невероятный уровень абстракции и представление модели в целом. Уровни разделены таким образом, что каждый из них можно протестировать независимо от других, а каждый слой соединён с последующим через свой конкретный интерфейс, что даёт возможность применить любую реализацию в рамках одного слоя.
Ещё интересно знать, что большинство разработчиков работают с моделью OSI на прикладном уровне, например, работая с HTTP, который как раз на этом уровне и расположен.
И это в целом всё, что начинающему разработчику необходимо знать про OSI. Есть куда более важные темы на современном рынке, на изучение которых стоит тратить время.
Модель OSI — это супер интересно и полезно, но для большинства собеседований углубленные знания темы не актуальны, а жаль. Хотя, если вам интересно погрузиться в тему и на это есть время, то крайне рекомендую, отличное чтиво)
#web #data #theory
В общих словах о Serverless Environment
Serverless Environment (он же Serverless Architecture) — это подход, в котором разработка программного обеспечения концентрируется вокруг бизнес-логики приложения. Разработчикам больше не нужно заниматься логикой менеджмента инфраструктуры, а можно сконцентрироваться на написании функциональности, максимально прямо направленной на пользователя и бизнес. Управление же инфраструктурой возьмёт на себя облачный провайдер.
В этом контексте, облачный провайдер, — это компания посредник, которая возьмёт на себя ответственность по управлению и масштабированию используемых серверов. Разработчики же платят только за использование ресурсов, что делает эту модель экономически более выгодной. Вместо того чтобы думать о серверах, разработчик может сосредоточиться на разработке приложения и его функциональности.
Подобные услуги предлагает множество облачных провайдеров, но самые популярные из них — AWS Lambda, Azure Functions и Google Cloud Functions. В СНГ регионе же, самыми крупными провайдерами будут Yandex Cloud и Selectel.
Никто за упоминания не заплатил, а жаль..)
#web #useful #theory #principles
Что такое SPA?
SPA — Single Page Application — это такое приложение, весь контент которого может быть доступен с единственной его страницы. В рамках одной страницы пользователь взаимодействует с динамически обновляемым контентом без перезагрузки страницы. JavaScript просто меняет вёрстку, из-за чего создаётся ощущение переходов.
В основном, SPA популярны из-за возможности создавать по настоящему интерактивные интерфейсы. Почти любое действие на странице сразу же позволит пользователю увидеть его результат, будь то появившийся текст, окно, изменившаяся страница или лоадер.
Такой подход позволяет реализовать более плавную, в некоторых случаях, почти бесшовную навигацию. Связано это с тем, что зачастую достаточно перерисовать лишь небольшую часть приложения, оставив всё остальное как есть. Например, можно перерисовать лишь контент одной из вкладок, а навигацию, футер и другие элементы страницы не трогать.
Также в рамках SPA можно создавать более сложные и многоуровневые интерфейсы, что в современных реалиях применяется очень активно. Почти все современные web-приложения так или иначе являются SPA приложениями. Как пример, Figma, GitHub, Spotify, Slack, Trello, VK, YouTube и другие.
Основным же минусом SPA является то, что пользователь, зачастую, загружает разметку с сервера лишь единожды, и эта разметка максимально базовая. Всё остальное приложение строится на клиенте посредством возможностей JavaScript, а это медленнее.
Правило простое: для отображения статического контента лучше использовать, например, статическую генерацию, и рендерить всю вёрстку при билде приложения. Для интерактивных приложений лучше использовать SPA или его производные.
#web #theory
Что такое AJAX
До появления этой технологии, все обновления на странице могли быть видны только после её перезагрузки в браузере. Зачастую просто из-за того, что динамики на сайтах было мало, и все страницы сайта хранились на сервере и отдавались как обычная статика. Но со временем web-приложения становились всё более интерактивными и динамичными.
AJAX — Asynchronous JavaScript and XML — технология, которая решает проблему частой перезагрузки страницы, позволяет выполнять все запросы и реагировать на них асинхронно из JavaScript кода.
Самым явным примером приложений, которые стали в принципе возможными, после внедрения AJAX — сервисы гугла.
Благодаря асинхронным запросам у нас есть, например, Google Maps или Gmail, работу которых без асинхронных обработчиков представить крайне сложно. Пользователь может увидеть обновленные данные сразу же после своего действия и выполнения запроса, что даёт лучший пользовательский опыт и расширяет возможности web-приложений.
В современном мире часто используют fetch
или что-то вроде axios
, но изначально AJAX стал возможен из-за реализации в языке объекта XMLHttpRequest
. Типичный запрос выглядит вот так:
// создаем запрос
var xhr = new XMLHttpRequest();
// инициализируем
xhr.open("GET", "https://...", true);
// обрабатываем ответ
xhr.onload = function() {
if (xhr.status === 200) {
var data = JSON.parse(xhr.responseText);
console.log(data);
}
};
// отправляем
xhr.send();
Аутентификация и авторизация
Понятия, которые достаточно часто путают из-за созвучности и кажущегося сходства значения. Но на самом деле это не совсем так и важно разобраться в чём же разница.
Аутентификация — процесс, который позволяет системе идентифицировать пользователя. Обычно это ввод пары логина и пароля, номер телефона и код доступа из смс, отпечатки пальцев, лица и так далее. Это способ определить, что с системой работает не аноним, а конкретный Иван Иванов.
Авторизация — процесс, который всегда идёт после аутентификации, и определяет роли и права доступа для пользователя. Например, в одном приложении может быть разный набор функций для обычных пользователей, менеджеров, администраторов. Процесс авторизации определяет имеет ли Иван Иванов доступ к функциям администратора на основе его роли.
Если ещё раз кратко, то аутентификация определяет с кем конкретно работает система, а авторизация — что этот конкретный пользователь может.
И на этом, кстати, всё. Это достаточно простое понятие 🙂
Спасибо за прочтение, это важно для меня ❤️
#useful #web #theory
Искренне о важном
Я думаю многие заметили, что этот канал уже давно не пополнялся записками сумасшедшего. Я как-то выходил за связь, в попытке восстановить в себе привычку писать, но у меня не получилось, это стоит открыто признать)
На данный момент у меня готово некоторое количество постов наперед и я планирую запускать канал снова. Сделать всё чуть более серьезно и методично. Зарекаться о постоянном выходе постов тут не в моих силах, хотя очень хотелось бы, но я просто не хочу давать несдерживаемых обещаний. Даже не для читателя скорее, а для себя. Я уверен, что больше половины актуальных подписчиков откроют канал и в ту же секунду закроют его, а некоторые и отпишутся после напоминания о его существовании, но меня это не особо волнует.
С момента выхода последнего поста, я чуть ли не каждый день думал о канале и об утерянных возможностях, связанных с ним. Но, в своё оправдание скажу, что я просто выгорел. Мне не хватило мотивации продолжать, потому что в какой-то момент моя жизнь превратилась в 16-ти часовую работу семь дней в неделю и я был готов жертвовать чем угодно. Мне оказалось слишком тяжело совмещать постоянную работу, образование, пет-проекты, менторинг, учёбу в ВУЗе и кучу других активностей, поэтому канал попал под горячую руку с целью сохранить всё остальное. Так расставились приоритеты.
Канал пришлось исключить из повседневной жизни просто из-за того, что он мне ничего не приносит. Размер его слишком мал, чтобы быть частью личного бренда. Рекламу я не публикую. А с читателями удаётся пообщаться так редко, что эмоциональной отдачи мне не хватает. Поэтому если вы реально читаете это, напишите мне, пожалуйста)
За этот перерыв мне удалось многое обдумать, многое потерять, изменить и приобрести, но уверенности в стабильной активности канала точно нет.
И всё же, я не зря терял время. У меня появился новый опыт и куча новых знаний. Контента накопилось столько, что уже сейчас заготовленных постов должно хватить как минимум на 2 месяца. Подход к каналу я кардинально изменил и оптимизировал настолько, насколько сейчас способен. Даже удалось делегировать какие-то активности и теперь над этим каналом буду стараться не я один, чему я несказанно рад. На конечном контенте это не должно сказаться, зато времени от написания поста до его публикации должно проходить гораздо меньше.
За время моего отсутствия, с канала ушла чуть ли не половина подписчиков. Вполне справедливо. Но мне приятно видеть, что ещё многие остаются. Скорее всего, большинство просто забыли о существовании этой части мой души в сети. Но спасибо вам за ожидание и за прочтение этого поста. Эта фраза после каждого поста, типа «Это важно для меня» — это не просто красивая концовка. Правда важно, спасибо.
#blog
Как только будет время
Постов нет 158 дней, я не против ставить новые рекорды.
Канал не то чтобы заброшен, но времени на него нет, это правда.
Последний пост вышел 7 октября 2021 года, в момент, когда я устраивался на работу. Думал, что устроюсь и возобновлю посты, но времени не хватало и до сих пор не хватает совершенно. В одно и то же время мне пришлось работать, учиться в вузе, продолжать учиться программированию и, хотя бы раз в неделю, жить. Оказалось, что это не так просто.
С момента прекращения выхода постов, из канала ушло почти 100 человек. Это нормально, потому что мертвые чаты тоже нужно чистить. И классно, что ушли не все. Согласно аналитике канала, 99.1% подписчиков было в сети в последние сутки, и просмотры на постах растут каждый день, так что я надеюсь, что вы не просто забыли о существовании этого канала.
Будет ли что-то дальше? Конечно будет. Не совсем понимаю когда и как, но я часто думаю о том, в каком формате мне было бы удобно продолжить писать. Есть несколько идей, я постараюсь разобраться в них как можно быстрее. Мне нравится писать. Ты можешь написать мне какой контент для тебя актуален в личку или сделай это анонимно через гугл формы. Если у тебя есть подобные мысли, то мне было бы очень интересно их почитать или послушать.
Забавно, что постов после перерывов было так много, что можно вводить отдельный хэштег.
Что такое БЭМ
БЭМ — методология разработки, созданная в Яндексе. Это компонентный подход написания HTML и CSS, который подразумевает разделение интерфейса на независимые блоки.
Вообще, БЭМ, — это далеко не единственная методология разработки, но на данный момент она, наверное, самая модная в рамках СНГ. Часто знание БЭМ требуется даже от джунов.
Описывать сам БЭМ я не буду, да это и не имеет смысла. На официальном сайте есть очень классное руководство, я не напишу лучше.
Разберёмся, скорее, почему БЭМ и действительно ли нужно его учить.
И моё субъективное мнение заключается в том, что учить нужно. Там всё равно ничего сложного, а знать для общего круга полезно, тем более что это знание, как минимум, делает вас конкурентным на рынке труда.
Я использую БЭМ и люблю его. Мне нравится этот подход разбиения на составляющие, потому что во многом это упрощает понимание кода и упрощает его поддержку. Так же, что важно, код становится переиспользуемым. Многие блоки проще перемещать со страницы на страницу или дублировать на одной странице, приходится писать меньше кода.
В моём опыте использования не было ничего плохого, что было бы связанно с БЭМ, поэтому всем советую.
На этом всё. Спасибо за прочтение, это важно для меня ❤️
#web #theory #useful
Откуда методы у примитивов
В JavaScript, как и в других языках, есть примитивы, подробнее тут, но что это в целом такое? Когда мы записываем конструкцию типа:
const year = 2021
Number
, String
...year.toString()
new Number(year).toString()
Что такое нечистый объект
Информации нет в интернете, кстати. Не знаю почему, но видел этот вопрос только на тестовом собеседовании, а вот в интернете ответа просто нет. Эксклюзив, получается 🙂
Итак, понятие "нечистый объект" появляется в контексте клонирования объекта. Нечистым объектом называется тот объект, который внутри себя содержит ссылки на себя же.
Пример:
const obj = {
foo: 1,
bar: obj
}
или
const obj = {
foo: 1,
bar: {
obj.x
},
x: obj.bar
}
Оператор объединения с null '??'
Относительно новая замена оператору ||
в быту разработчика. Рассмотрим вот такую ситуацию:
С сервера приходит адрес пользователя, который может быть null
либо undefined
. В таком случае, обработать этот кейс можно так:
const state = (json.city !== null && json.city !== undefined) ? json.city : "default"
const state = json.city ?? "default"
??
возвращает первый аргумент, если он не null/undefined
, иначе второй. В этой ситуации это однозначно спасает ситуацию и делает код более читаемым.??
можно использовать ||
. А вот и нет. Такая ситуация:json
есть поле score
. Оно либо ноль, либо null/undefined
.// json.score = 0
json.score || 1000 // 1000
json.score ?? 1000 // 0
??
работает только с null
и undefined
, а ||
также обрабатывает falsy-значения. Логические операторы JavaScript
В JavaScript, как и во многих других языках, есть логические операторы для объединения различных условий. В этом посте закрепим эту тему, рассмотрим как они применяются и изучим некоторые нюансы.
Не будем опускаться до всяких базовых вещей типа записи комплексных условий. Но для галочки запишу пример:
if (x > 0 && (y === 2 || y === 7)) {
doSomething()
}
&&, ||, !
boolean
быстро можно, используя двойное отрицание.let name = "Denis"
let age
let obj = { age }
!!name // true
!!age // false
!!obj // true
||
возвращает первое истинное значение.const name = "Denis" || "Max" || undefined
// name = "Denis"
&&
возвращает первое ложное значение.const age = 20 && '' && null
// age = ''
||
и &&
можно использовать вместо if
.let x, y
true && (x = 2)
true || (y = 10)
// x = 2
// y = undefined
Обратная связь
Друзья, я ещё раз хочу напомнить, что вы можете поделиться своими идеями для постов. Моя личка открыта и я рад пообщаться с каждым.
Если вам кажется, что я сделал ошибку или в канале чего-то не хватает — обязательно пишите. Да и вообще, это может быть что угодно:
— идеи для постов
— опыт и вопросы с собеседований
— критика
— ваше виденье канала
— вопросы и консультации
У меня нет цели что-либо навязать или продать, я готов рассмотреть любое ваше обращение полностью бесплатно. Не стоит думать, что это какая-то гениальная замануха на деньги — это не так)
Спасибо за ваш интерес к проекту. Будем на связи!
Личка — @denisputnov
TypeScript или JavaScript: что приоритетнее?
Есть много адептов и хейтеров TypeScript, в этом вопросе всё не так однозначно, просто выскажу своё мнение.
Я тащу TypeScript в любой проект, где у меня есть такая возможность, и категорически против использования чистого JavaScript без типов. Однако, есть случаи, где это просто необходимо, и использование TS только усложняет вашу жизнь.
Для меня TypeScript решает множество проблем, я его невероятно люблю и стараюсь погружаться в него всё глубже, а всё потому что разработка с ним для меня становится в разы более приятным занятием, чем без него. Код на TypeScript более читаемый, в него можно быстрее погрузиться и внести изменения, а приложения, написанные на нём, потенциально ловят гораздо меньше багов.
Также очень нравятся дополнительные типизируемые сущности в языке в лице типов и интерфейсов. Они позволяют понять что делает тот или иной код, порой, даже без чтения самого кода. Мы можем взглянуть на интерфейсы ввода/вывода данных и примерно понять что происходит в конкретной функции, что упростит её чтение и понимание в дальнейшем, если остается такая необходимость. То есть типы, помимо очевидной пользы в плане стабильности кода, несут и дополнительную функцию — документация кода.
Но у TypeScript есть и недостатки. Для меня главным недостатком является то, что компилятор TypeScript может быть неоптимален. Команда разработчиков старается быстро править все нюансы, но пару раз точно я ловил кейсы, где проблема производительности решалась изменением расширения файла на .js
, а значит, что никто не защищен от подобных казусов.
Мой вывод заключается в том, что если TypeScript и ужасен, как об этом некоторые говорят, то чистый JavaScript для меня ещё страшнее. Я себя, по крайней мере на данный момент, больше отношу к адептам TS, нежели к его противникам.
Если говорить с точки зрения рынка, то современную фронтенд разработку без TypeScript мне представить не получается. За последние годы, навык разработчиков «Знание TypeScript» перешёл из категории «Желательно» в категорию «Обязательно» и очень плотно там закрепился. Прогнозов на обратный процесс пока точно не будет. Есть ощущение, что TypeScript с нами на очень долго.
Поэтому если вы хотите быть максимально конкурентноспособным на рынке, то стоит признать, что TypeScript — стандарт. Если вы начинающий разработчик, то придётся смириться с тем, что TypeScript придётся выучить.
Ну а вообще, учить нужно не языки, а программирование. Всех благ.
#web #typescript #javascript
Коротко о том что такое SEO
SEO — Search Engine Optimization — свойство web-ресурса, которое описывает его оптимизацию для выдачи в поиске при запросе поисковыми роботами поисковых систем, типа Google или Yandex. Слишком много слова поиск.
Чем лучше SEO, тем чаще сайт будет появляться в выдаче. Чем чаще он будет появляться, тем больше посетителей. Посетители = деньги. Поэтому это важно.
Но так это задумывалось изначально. Сейчас это понятие имеет гораздо более широкий смысл. Например, пререндеринг контента для ссылок в социальных сетях, когда появляется красивый предварительный просмотр с заголовком страницы, описанием и изображением — это тоже SEO. Это лишь один из примеров.
И из этого стоит сделать вывод, что SEO сейчас — это свойство web-ресурса, которое определяет его доступность извне.
Описываются такие параметры ресурса в основном в мета-тегах, но стоит помнить, что семантическая верстка — тоже часть SEO, так как используемые теги напрямую влияют на выдачу.
Вот основные примеры как это может выглядеть:
<meta name="description" content="описание вашей страницы">
<meta name="keywords" content="ключевые слова">
<meta name="author" content="имя автора">
Адаптивная и отзывчивая вёрстка
Вёрстку под разные устройства можно грубо разделить на два вида. Вёрстка бывает либо адаптивная, либо отзывчивая.
Оба подхода решают одну и ту же задачу — качественного и удобного отображения контента страницы на разных экранах одинаково хорошо. Контент сайта должен быть доступен пользователю вне зависимости от того, пользуется он ноутбуком, планшетом или смартфоном.
Адаптивная вёрстка — та вёрстка, где для каждого из типов устройств существует собственный макет. В основном, используются фиксированные размеры элементов, а переходы между «устройствами» при изменении размеров окна браузер выглядят рвано, поскольку происходят скачками от запроса к запросу.
Создаются опорные точки при помощи запросов в CSS, выглядит это примерно так:
.block {
display: grid;
}
@media (max-width: 768px) {
/* стили для экранов шириной до 768px */
.block {
grid-template-columns: 1fr;
}
}
@media (min-width: 768px) and (max-width: 1024px) {
/* для ширины экрана от 768px до 1024px */
.block {
grid-template-columns: repeat(1, 3fr);
}
}
@media (min-width: 1024px) {
/* для ширины экрана более 1024px */
.block {
grid-template-columns: repeat(1, 6fr);
}
}
HTTP и HTTPS
HTTP и HTTPS — это протоколы передачи данных в сети. Основная разница между ними заключается в безопасности.
HTTP передает данные в открытом виде. Это означает, что любой может перехватить и прочитать передаваемую информацию. Это делает HTTP небезопасным для передачи конфиденциальных данных, таких как логин и пароль, данные кредитных карт и т. д.
HTTPS же обеспечивает шифрование данных, используя протоколы безопасности, такие как SSL и TLS.
По сути, HTTPS — это ровно тот же HTTP, который поверх ещё и зашифрован при использовании дополнительных протоколов шифрования. В HTTPS все данные шифруются перед отправкой и расшифровываются только на стороне получателя.
При этом, HTTPS обеспечивает аутентификацию не только клиента, но и сервера, что позволяет пользователю убедиться в том, что он общается именно с тем сервером, который он ожидает.
Таким образом достигается достаточный уровень безопасности для передачи чувствительных данных, например, данных о банковской карте для очередной покупки в сети.
#web #theory
Что такое PWA?
PWA — Progressive Web Application — это веб-приложение, которое использует современные веб-технологии для создания приложения, которое может работать как настольное приложение. Оно может быть установлено на устройство пользователя и иметь доступ к некоторым функциям устройства.
PWA приложения имеют возможность:
— Работать в офлайн режиме
— Работать в фоновом режиме
— Отправлять нативные уведомления на устройство
— Получать доступ в геолокации, камере, микрофону, контактам, файловой системе устройства, различным сенсорам (таким, как, например, гироскоп)
Также важной особенностью PWA приложений является скорость их работы, загрузки, и в целом более качественный пользовательский опыт, поскольку в таком подходе у разработчиков есть чуть больше инструментов для грамотного кеширования. Из-за этого приложение, обычно, грузится быстрее и делает это за сравнительно меньший использованный трафик при вторичных и последующих загрузках.
PWA приложения прекрасно подходят для кейсов, когда важна работа офлайн. Более того, PWA приложения, при должном качестве разработки, могут заменить обычные десктопные приложениями и быть мультиплатформенными. То есть, приложение можно будет скачать и установить через браузер на любом плюс минус современном гаджете под управлением любой не совсем допотопной операционной системы. Это может быть полезно, когда, например, ограничен бюджет на разработку и хочется получить максимально широкое решение.
#web #theory
Big O notation
Каждый алгоритм можно оценить по времени и по памяти. При этом, не совсем понятно, как объективно составить эту оценку. Для решения этого вопроса существует O notation.
Это серьезный математически термин, который позволяет установить порядки сравнения поведения функций.
Когда речь идёт об оценке алгоритма по времени, то интересующая нас функция — отношение количества данных к времени выполнения алгоритма. При оценке по памяти — отношение количества данных к объёму занимаемой памяти, соответственно.
Рассмотрим примеры некоторых оценок по сложности:
— Константная сложность O(1)
Константная сложность по времени гласит «Вне зависимости от объема данных, скорость выполнения неизменна»
В коде это, например, обращение к объекту по ключу. Вне зависимости от размера объекта, значение по ключу доступно с константной сложностью.
— Линейная сложность O(n)
Алгоритм линейной сложности по времени — такой алгоритм, время выполнения которого прямо пропорционально объёму данных. Например, это метод reduce
[1, 2, 3, 4].reduce((acc, cur) => acc + cur, 0)
reduce
, но примененный уже не для массива, а для матрицы, то есть это работа цикла внутри другого цикла.matrix.reduce((acc, cur) =>
acc + cur.reduce((acc, cur) => acc + cur, 0), 0)
const countElements = (arr) => {
const counts = {}
for (let i = 0; i < arr.length; i++) {
const key = arr[i]
if (counts[key]) {
counts[key] += 1
} else {
counts[key] = 1
}
}
return counts
}
counts
может расти прямо пропорционально длине массива, потому что каждого из элементов массива может быть представлен в единственном экземпляре. Размер входных параметров при оценке по памяти не учитывается.Что такое полифилы и зачем они нужны
Одна из главных проблем web-разработки — скорость поддержки инструментов. И речь не об обновлении фреймворков или библиотек, а об обновлении браузеров.
Достаточно долгое время многим разработчикам в кошмарах снился прекрасный и ужасный Internet Explorer, что в последнее время, к слову, закончилось (зато теперь у нас есть Safari).
Браузеры не одинаковы. Большинство из них работают на хромиуме, но всё же единого стандартного решения нет, из-за чего какие-то функции, например, JavaScript, поддерживаются в одних браузера, но не поддерживаются в других или работают иначе.
Весь этот ужас усугубляется тем, что некоторые пользователи отключают автоматические обновления и используют давно неактуальные версии браузеров.
Так ли всё ужасно? Не совсем.
Есть автоматизированные инструменты поддержки, и относительно длительное время существует прекрасный концепт полифилов.
Полифил — это код, который, используя старые возможности языка, эмулирует новые, перезаписывая прототип.
Пример полифила для метода some
:
if (!Array.prototype.some) {
Array.prototype.some = function(callback) {
for (var i = 0; i < this.length; i++) {
if (callback(this[i], i, this)) {
return true;
}
}
return false;
};
}
some
нет, мы добавим собственную его реализацию.Babel
позволяет вам написать код, использующий новые возможности JavaScript
, и затем автоматически транспиллировать его в код, который будет работать на старых версиях браузера. Что со мной произошло вообще
Под хэштегом #blog хочу рассказать что со мной произошло за эти 158 дней с момента последнего поста.
Я не терял время просто так, не пропил его, не потратил на 100 уровней в какой-то игре, а, как мне кажется, потратил его с пользой для себя.
— Работа, конечно же
Я устроился как Junior Software Engineer в NetCracker на стеке React, TypeScript, Redux, работаю я уже 5 месяцев. За это время мой кругозор и скилл, как мне кажется, увеличились кратно. Забавно, что в эту компанию не берут джунов с рынка без внутренних курсов. Для меня сделали исключение, это приятно.
— Пет-проекты
Я много работал помимо основной работы. Моё кладбище заброшенных проектов больше, чем у гугла, кстати. Но хотя бы один проект я довел до какого-то логического конца, им я поделюсь чуть позже, ведь туда можно даже контрибьютить. Раньше я думал, что без пет-проектов учиться просто нереально сложно. Сейчас я понимаю, что это не сложно, это просто невозможно. Если вы до сих пор сидите в ловушке гайдов на ютубе, то лучшее, что вы можете сделать — закрыть гайд и создать новый репозиторий на GitHub.
— Курсы The Rolling Scopes Community
Начались вчера. Курсы, по сути, от EPAM, хоть им и очень хочется отвязаться от имени компании. Пока что для уровня Junior, а позже перезачислюсь на уровень Middle. В этом я, кажется, уже уверен. Курсы для меня сейчас — просто способ пробежаться по основам, обменяться опытом с разработчиками ниже и выше уровня, чем я. Начались они крайне спонтанно, как, в целом, и всё лучшее в моей жизни.
— Doka
Open Source Front-End документация на русском языке. Я не пишу в канал, но накидываю заготовки туда. В целом, контрибьютить туда максимально просто, так что думаю, что в ближайшее время я появлюсь в авторах и там.
Думаю, что это основные вехи за последнее время. Есть ещё что рассказать, но это уже не так значимо.
И прочтение для меня правда важно, спасибо.
Шпаргалка по пинципам ООП.
Один из самых частовстречающихся вопросов по ООП с собеседований. Разберёмся в этой теме кратко, такого ответа чаще всего хватит интервьюеру.
1. Наследование.
Наследование — механизм, который позволяет описать новый класс на основе существующего, то есть родительского. При этом свойства и функциональность родительского класса заимствуются новым классом.
В первую очередь это используется для переиспользования уже написанного кода, что должно упростить и ускорить разработку. Классы строятся друг на друге, что выстраивает чёткую иерархию.
2. Абстрация.
Абстрация — выделение главного. Суть заключается в выделении только самого главного и абстрагировании от незначительного. Например, у класса Auto
мы создадим поля, например, fuel
, mark
, age
, engine
, а от поля lightsColor
абстрагируемся, так как для нашей задачи это не важно.
3. Инкапсуляция.
Это скрытие чего либо, ограничения доступа к данным и к возможности их изменения. Как пример — код от учетной записи. Если записать его на листочке и повесить его на монитор, то любой «пользователь», севший за компьютер, получит к ней доступ и сможет поменять пароль. Так же для пользователя выглядят публичные переменные класса.
Инкапсуляция же сделает данные недоступными извне либо только для изменения, либо для любых операция в целом.
4. Полиморфизм.
Полиморфизм — возможность работать с разными типами данных, не зависимо от этого, получая подобный результат. Чтобы лучше понять о чем речь, рассмотрим такой код:
class Person {
say() {
console.log("I'm nobody")
}
}
class Programmer extends Person {
say() {
console.log("I'm programmer")
}
}
class Director extends Person {
say() {
console.log("I'm director")
}
}
Person
, Programmer
и Director
, одинаковый интерфейс взаимодействия. При том, что они имеют разные типы, поведение подобное. Это и есть смысл полиморфизма. Абсолютный и относительный путь
Два понятия из мира файловых систем. Сейчас разберемся что это такое.
Абсолютный путь — полный путь до файла в файловой системе.
Windows:
C:\Program Files\Internet Explorer\iexplorer.exe
UNIX:
/Users/denisputnov
/Users/denisputnov
. Чтобы зайти в папку рабочего стола я могу написать cd ./Desktop
или cd Desktop
. Тут я использую относительный путь. Или могу использовать абсолютный и записать команду как cd /Users/denisputnov/Desktop
Какой объект называется итерабельным
Сегодня поговорим о том какой объект называется итерабельным, а именно, какой объект можно проитерировать при помощи цикла for..of
.
У любого итерабельного объекта в JavaScript присутствует специальный ключ [Symbol.Iterator]
. По этому ключу доступен генератор, который предоставляет для итерации значения. Подробнее о работе генераторов я расскажу в другой раз.
Следовательно, чтобы сделать объект неитерабельным, необходимо удалить это свойство.
И в целом на этом всё. Спасибо за прочтение, это важно для меня ❤️
#web #theory #javascript
Что такое Spread и Rest операторы и в чём их отличие
Итак, Rest оператор — это оператор, который позволяет собрать лишние аргументы. Сразу на примере:
function foo(a, b, ...manyMoreArgs) {
console.log("a", a);
console.log("b", b);
console.log("manyMoreArgs", manyMoreArgs);
}
foo(1, 2, 3, 4, 5, 6);
// a, 1
// b, 2
// manyMoreArgs, [3, 4, 5, 6]
const arr1 = [1, 2]
const arr2 = [4, 5]
const arr3 = [...arr1, 3, ...arr2]
// arr3, [1, 2, 3, 4, 5]
(...)
. Отсюда сделаем замечание, что:Преобразование строки в число
Хочу, кстати, рассказать об интересном и неявном способе преобразовать строку в число в JavaScript. Речь идет о плюсике. Об обычном плюсике, да. Выглядит это так:
const string = "20"
const num = +string
const num2 = 10 + +string
// num = 20
// num2 = 30, не ошибка
Кстати, про 500 человек на канале я так ничего и не написал...
...Но видимо настало время, ведь более крутой картинки на этот случай я не найду.
Вот так выглядит 547 человеков пауков. Спасибо восьмилапым товарищам за эту цифорку✨
#blog