Наверное стоит понимать, что все эти фреймворки появились не просто так. А потому что в браузере DOM API корявое и убогое. И кривое оно, потому что такова была эволюция браузеров. Да пытаются сейчас исправить, улучшить. Но поломать легче сейчас, чем впилить что-то разумное. На сегодняшний день API очень далеко от совершенства. Поэтому мы видим изобилие фреймворков, как от корпораций, так и собственных.
Каждый из них, позволяет делать разработку легче и быстрее. Если вы попробуете сделать сайт на нативном JS, то рано и поздно, но у вас скопится огромная куча повторяемого кода, и вы изобрете собственный велосипед фреймвор, что бы легче, что бы не повторятся.
Но все эти улучшения не даются просто так. Жервой будут размер бандла, перформанс, пожирание памяти. Все то, что мы имеем сейчас.
Сможем ли мы исправить в ближайшее время ситуацию — думаю нет. Откажемся ли мы от фреймворков — нет конечно, не откажемся. Сделать API лучше, не получится. А кодить в приятных абстракциях и структурах хочется.
Так что же делать? В первую очередь думать головой и применять те инструменты, которые нужны. Искать золотую середину.
Статья и заголовок расходятся в значениях. Из заголовка, я ожидаю прочитать что-то, что поможет мне улучшить мой API сервис (application public interface). Т.е предполагается, что сервис как бы у меня уже есть и пара советов, таких, которые бы помогли бы улучшить стабильность и нагрузку, или дельные советы по REST итд, я бы нашел в статье.
Но увы, статья о банальном «starter kit». И ничего общего с API не имеет.
Рекомендую переименовать статью, типа «NodeJS Starter Kit для новичков». Это бы помогло понять о чем действительно идет речь.
Одна из причин, почему появились «arrow functions», это потеря контекста. И именно их рекомендуют использовать, как callback функции.
В вашем примере необходимо использовать:
class Person{
constructor(name){
this.name = name;
}
logName(){
console.log(this.name);
}
}
let p = new Person('Ivan');
btn.addEventListener('click', (e) => p.logName()); // нет магии, нет привязки.
Одно дело собеседование, где можно блеснуть знаниями, как это работает и что это за такой синтаксический сахар «class» в JS. И совсем другое дело, так делать в реальном проекте.
1. Фабричные функции.
В чем приимущество перед классами? Не писать new? Как делать extends? Различать по типу? И в чем проблема связываться с классом? В общем, давайте без фанатизма. Против фабричный функций ничего не имею против, но всему свое место. Не надо это лепить куда попало.
2. Прототип.
Ну ребят, ES6 не вчера же появился, и даже не позавчера. А вы продолжаете это лепить. Откройте для себя уже «class» в конце концов. Даже если вас заботит поддержка старых браузеров, то и TS и Babel давно уже могут собрать ваш код в ES5.
PS Да, классы не отменяют того, что вы должны понимать как работают прототипы под капотом и как работает наследование в JS.
7. Откройте для себя схемы и валидацию данных. Это избавит вас от ручной манипуляции. Посмотрите, к примеру, подход MongooseJS. Как там объявляются и валидируются данные.
Совет для новичков. Не стоит эти советы принимать к работе. Ознакомится — да, но не более.
Думаю, что Flutter вам стоит рассматривать как браузер. Только вместо браузера у вас Flutter приложение. И вместо веб странички вы делаете приложение на Dart/Flutter. А вот остальные коммуникации — теже самые подходы. Регистрация, авторизация (JWT), проверка входящих данных, права доступа, формирование ответа итд итд итд — все это будет тоже самое, что и для веба, ну конечно в рамках вашего приложения.
Мне конечно сложно оценить ваше приложение и его возможности. Поэтому я написал выше изходя из своего опыта.
Вам скорее всего надо для себя понять, что для вас база данных. Если вам достаточно хранить конфигурацию приложения и токены, то подойдет LocalStorage. Это обычное key:value хранилище.
Если что-то поболее, к примеру какие нибудь записки, чек листы итд, что не подразумевает больших данных и они служат только для пользователя и не для шаринга другим пользователям. Смотрим на SQLite, SQLCipher. Я больше чем на 100% что для таких вещей SQLite просто за глаза.
Ну и если подразумевается работа с данными у пользователя, не только в приложении, а и, к примеру, из веб странички. Или же это лента новостей или общий чат для пользователей или общие данные для покупателя/продавца. Здесь вам уже понадобится отдельный сервер, логика приложения и база или может быть базы данных. Но это уже другая история, как делать серверные приложения. И тут информации для нескольких книг наберется, а не для коммента здесь.
Никогда не был фанатом майкрософта. Но то что они сделали, у меня лично вызывает респект. Я очень надеюсь на вклад в Chromium сообщество от майкрософта. А еще больше рад, что IE таки умрет и больше не надо будет думать, о поддержке старых версий.
Ну и классная фишка — интерграция со своими продуктами.
Посмотрел NestJS по приведенному линку. Они используют такой же подход для написанию контроллеров, который я сделал у себя. Правда у меня это только обертка над ExpressJS. Но приятно, когда взгляды у людей совпадают :)
Не соглашусь с автором. Да, признаюсь я был таким же как автор, и с такими же взглядами. Когда появился TS я был против. Ну зачем, зачем еще какие-то надстройки? Если вы хороший разработчик, вам TS не нужен. Я действительно так думал и говорил.
Но пару лет назад я начал писать на TS, понемногу. Где-то с ошибками, где-то тупо в лоб с any. И сейчас, спустя два года, я полностью перешел на TS. На вопрос — почему, почему я кардинально изменил свои взгляды и мировозрение? Ответ прост — это просто удобно и приносит свои плоды. И сейчас я все свои проекты перевожу с JS на TS.
Самое большое удобство — это читаемость кода. Да, когда ты работаешь в команде из 10 человек. То понять код товарища — ой как сложно. И TS помогает понять и проанализировать что к чему. Следующее удобство — IDE. Приятно иметь быструю навигацию по проекту с подсказками и проверками. Поверте, для больших проектов это неоценимо.
Так же добавлю, что TS это не новый язык, это все тот же JS просто добавлено немного контроля. И это помогает держать в голове логику, а не вспоминать где какие аргументы принимает функция.
По поводу читабельности кода. Приведу контроллер со своего TS проекта. Так как, то что привел автор — фигня какая-то.
Много лет использовал axios как основную библиотеку для запросов из браузера. Но в последнем проекте решил, что тянуть огромную либу в проект только для запросов не разумно.
В итоге написал обертку class API над fetch. Все красиво завернул в async/await, плюс обработка ответа и перехват ошибок. В итоге вышло чуть более 100 строк кода на TS. Что совсем ничего, по сравнении в кодом axios.
Так что думаю, имеет смысл переходить на нативный функционал. Да, пришлось немного допилить, что бы вот совсем хорошо было. Но доработка минимальна.
PS Что касается загрузки файлов и показа прогресса. В данном кейсе пришлось написать обортку над XMLHttpRequest. Увы…
Однажды я работал в одной биллинговой конторе. Не суть имя конторы. Так вот. Софт у них был написан еще в начале 2000-х. Причем фронт был заточен только под IE. Причем, под IE 6-7 версии. На 8-ке уже глючило. Софт не маленький и за эти годы было написанно тонные кода.
Когда я пришел туда, и копнул код. Я был в ужасе. Конечно я пришел с предложением переписать код, как многие до меня. Так как оддерживать сие — боль. Да и о новых фишках можно было и не думать.
И ответ топ менеджмента — Дима, у нас нет бюджета и времени на переписание фронта. Мы не можем выделить команду на полтора два года, для этого. Да и в чем смысл для нас? Клиенты покупают, мы продаем — все овольны. Какой профит принесет переписанный фронт допустим на Реакт?
И если подумать — а профита особо и нет для клиента. Увы.
Так что не все зависит от программистов. У него свои рамки и приходится выкручиваться и саппортить ненависный IE.
Что касается полифилов. То лучше использовать webpack, который будет компилировать ваш ESNext to ES5. А уже скомпилированный бандл подключать в приложение.
По крайней мере проблему flat и Promise вы бы точно решили.
Что касается ошибки промиса, то его всегда можно поймать в «catch» и уже обработать. Показать сообщение об ошибке/сделать редирект/итд.
Что касаемо отмены промиса. То здесь работа не для промиса, а для самого реквеста. XMLHttpRequest/fetch позволяют вызвать cancel запроса. Промис, он служит для ожидания выполнения.
Я где-то выше написал, что непонимаю промисов и как они работают? Или я не знаю, что asyn/await это всего лишь сахар?
Еще раз повторю — код на промисах и код на async/await — это два разных вида написания кода. И второй вид, более простой и читабельный. Если человек написал выполнение кода с async/await, с моей точки зрения это только плюс.
Скажите, а почему на беке именно важны промисы. Вот прям так, что бы на них писать код.
Я к тому, что NodeJS давно поддерживает async/await. А для более старых версий, код всегда можно прогнать через babel и получить поддержку. А если у вас typescript, так в конфиге указали, какая поддержка ES вам нужна, и радуетесь.
Соглашусь, понимание должно быть. Но вот что бы промисы были в приоритете — для меня звучит странно.
PS Я знаю как работают промисы, даже когда-то делал полифил для IE, что бы получить поддержку в ослике. Но когда появился async/await это же как глоток свежего воздуха.
Каждый из них, позволяет делать разработку легче и быстрее. Если вы попробуете сделать сайт на нативном JS, то рано и поздно, но у вас скопится огромная куча повторяемого кода, и вы изобрете собственный
велосипедфреймвор, что бы легче, что бы не повторятся.Но все эти улучшения не даются просто так. Жервой будут размер бандла, перформанс, пожирание памяти. Все то, что мы имеем сейчас.
Сможем ли мы исправить в ближайшее время ситуацию — думаю нет. Откажемся ли мы от фреймворков — нет конечно, не откажемся. Сделать API лучше, не получится. А кодить в приятных абстракциях и структурах хочется.
Так что же делать? В первую очередь думать головой и применять те инструменты, которые нужны. Искать золотую середину.
Но увы, статья о банальном «starter kit». И ничего общего с API не имеет.
Рекомендую переименовать статью, типа «NodeJS Starter Kit для новичков». Это бы помогло понять о чем действительно идет речь.
В вашем примере необходимо использовать:
Плюс, повышается читабельность кода.
1. Фабричные функции.
В чем приимущество перед классами? Не писать new? Как делать extends? Различать по типу? И в чем проблема связываться с классом? В общем, давайте без фанатизма. Против фабричный функций ничего не имею против, но всему свое место. Не надо это лепить куда попало.
2. Прототип.
Ну ребят, ES6 не вчера же появился, и даже не позавчера. А вы продолжаете это лепить. Откройте для себя уже «class» в конце концов. Даже если вас заботит поддержка старых браузеров, то и TS и Babel давно уже могут собрать ваш код в ES5.
PS Да, классы не отменяют того, что вы должны понимать как работают прототипы под капотом и как работает наследование в JS.
7. Откройте для себя схемы и валидацию данных. Это избавит вас от ручной манипуляции. Посмотрите, к примеру, подход MongooseJS. Как там объявляются и валидируются данные.
Совет для новичков. Не стоит эти советы принимать к работе. Ознакомится — да, но не более.
— Зачем объявлять проперти объекта как строка? Это не JSON файл. Убираем строку и получаем
— Используем возможности ES6 и переписываем строку выше
— На дворе уже 2020 год можно и не использовать цепочки вызовов в промисах.
Мне конечно сложно оценить ваше приложение и его возможности. Поэтому я написал выше изходя из своего опыта.
Если что-то поболее, к примеру какие нибудь записки, чек листы итд, что не подразумевает больших данных и они служат только для пользователя и не для шаринга другим пользователям. Смотрим на SQLite, SQLCipher. Я больше чем на 100% что для таких вещей SQLite просто за глаза.
Ну и если подразумевается работа с данными у пользователя, не только в приложении, а и, к примеру, из веб странички. Или же это лента новостей или общий чат для пользователей или общие данные для покупателя/продавца. Здесь вам уже понадобится отдельный сервер, логика приложения и база или может быть базы данных. Но это уже другая история, как делать серверные приложения. И тут информации для нескольких книг наберется, а не для коммента здесь.
Удачи!
Ну и классная фишка — интерграция со своими продуктами.
Хороший подход :)
Но пару лет назад я начал писать на TS, понемногу. Где-то с ошибками, где-то тупо в лоб с any. И сейчас, спустя два года, я полностью перешел на TS. На вопрос — почему, почему я кардинально изменил свои взгляды и мировозрение? Ответ прост — это просто удобно и приносит свои плоды. И сейчас я все свои проекты перевожу с JS на TS.
Самое большое удобство — это читаемость кода. Да, когда ты работаешь в команде из 10 человек. То понять код товарища — ой как сложно. И TS помогает понять и проанализировать что к чему. Следующее удобство — IDE. Приятно иметь быструю навигацию по проекту с подсказками и проверками. Поверте, для больших проектов это неоценимо.
Так же добавлю, что TS это не новый язык, это все тот же JS просто добавлено немного контроля. И это помогает держать в голове логику, а не вспоминать где какие аргументы принимает функция.
По поводу читабельности кода. Приведу контроллер со своего TS проекта. Так как, то что привел автор — фигня какая-то.
В итоге написал обертку class API над fetch. Все красиво завернул в async/await, плюс обработка ответа и перехват ошибок. В итоге вышло чуть более 100 строк кода на TS. Что совсем ничего, по сравнении в кодом axios.
Так что думаю, имеет смысл переходить на нативный функционал. Да, пришлось немного допилить, что бы вот совсем хорошо было. Но доработка минимальна.
PS Что касается загрузки файлов и показа прогресса. В данном кейсе пришлось написать обортку над XMLHttpRequest. Увы…
Когда я пришел туда, и копнул код. Я был в ужасе. Конечно я пришел с предложением переписать код, как многие до меня. Так как оддерживать сие — боль. Да и о новых фишках можно было и не думать.
И ответ топ менеджмента — Дима, у нас нет бюджета и времени на переписание фронта. Мы не можем выделить команду на полтора два года, для этого. Да и в чем смысл для нас? Клиенты покупают, мы продаем — все овольны. Какой профит принесет переписанный фронт допустим на Реакт?
И если подумать — а профита особо и нет для клиента. Увы.
Так что не все зависит от программистов. У него свои рамки и приходится выкручиваться и саппортить ненависный IE.
По крайней мере проблему flat и Promise вы бы точно решили.
Что касаемо отмены промиса. То здесь работа не для промиса, а для самого реквеста. XMLHttpRequest/fetch позволяют вызвать cancel запроса. Промис, он служит для ожидания выполнения.
Еще раз повторю — код на промисах и код на async/await — это два разных вида написания кода. И второй вид, более простой и читабельный. Если человек написал выполнение кода с async/await, с моей точки зрения это только плюс.
Я к тому, что NodeJS давно поддерживает async/await. А для более старых версий, код всегда можно прогнать через babel и получить поддержку. А если у вас typescript, так в конфиге указали, какая поддержка ES вам нужна, и радуетесь.
Соглашусь, понимание должно быть. Но вот что бы промисы были в приоритете — для меня звучит странно.
PS Я знаю как работают промисы, даже когда-то делал полифил для IE, что бы получить поддержку в ослике. Но когда появился async/await это же как глоток свежего воздуха.