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

Что такое «фреймворк»?


Если попытаться дать определение JavaScript-фреймворка, не вдаваясь в детали, то окажется, что это — инструмент, который можно использовать для разработки сложных веб-приложений, в частности — одностраничных приложений (Single Page Application, SPA).

В былые времена такие приложения создавали, полагаясь на возможности чистого JavaScript и библиотеки jQuery. Но, с ростом сложности фронтенд-приложений, начали появляться и соответствующие инструменты, облегчающие жизнь программистов. Например — это React, Angular и Vue.

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

  • Синхронизация состояния и визуального представления приложения.
  • Маршрутизация.
  • Система шаблонов.
  • Компоненты, подходящие для повторного использования.

Необходимы ли фреймворки современному разработчику?


Ответ на вопрос, вынесенный в заголовок этого раздела, зависит от того, как относиться к идее «необходимости» фреймворков. Уверен, многие могут сказать о том, что фронтенд-фреймворки не являются необходимыми в наборе инструментов веб-разработчика, и никогда необходимыми не были. Хотя бесспорно то, что это — весьма полезные инструменты.

Собственно говоря, наш вопрос можно переформулировать так: «Являются ли фреймворки чем-то вроде «современной библиотеки jQuery»? Можно ли решать задачи, на решение которых они направлены, другими средствами, например такими, которые появились в распоряжении программистов в ходе развития браузерных API»?


jQuery

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

Для того чтобы исследовать эту идею, я разработал одностраничное приложение, используя только JavaScript, стандартные веб-компоненты и бандлер Parcel. В процессе работы я столкнулся с некоторыми проблемами и сложностями, глядя на которые особенно чётко начинаешь видеть сильные стороны современных JS-фреймворков.

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

Обзор экспериментального приложения


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


Домашняя страница приложения


Страница создания записи о рецепте

Веб-компоненты


Создание веб-компонентов — занятие несложное. В частности, речь идёт о создании класса, расширяющего HTMLElement (или HTMLParagraphElement, и так далее) и о последующем использовании этого класса для описания собственного элемента.

Кроме того, при работе с веб-компонентами можно использовать хуки их жизненного цикла, такие, как connectedCallback, disconnectedCallback, attributeChangedCallback.

Вот код компонента recipe-item, который предназначен для вывода рецептов в списке.

import template from './recipe.html'
import DATA_SERVICE from '../../utils/data'
export default class Recipe extends HTMLElement {
  constructor () {
    // подключаем теневую DOM, инициализируем приватное свойство recipe и DATA_SERVICE()
    super()
    this._shadowRoot = this.attachShadow({ mode: 'open' })
    this._recipe = null
    this.ds = new DATA_SERVICE()
  }
  connectedCallback () {
    // устанавливаем в качестве html-содержимого импортированный шаблон
    this._shadowRoot.innerHTML = template
    // прикрепляем метод delete к соответствующей кнопке
    this._shadowRoot
      .querySelector('.delete')
      .addEventListener('click', () => this._delete())
  }
  _render (title) {
    // задаём заголовок рецепта и текст кнопки, позволяющей отметить рецепт
    this._shadowRoot.querySelector('.recipe-title').innerHTML = title
    this._shadowRoot.querySelector('.favorite').innerHTML = this._recipe
      .favorite
      ? 'Unfavorite'
      : 'Favorite'
  }
  _delete () {
    // удаление рецепта или вывод сообщения об ошибке
    try {
      await this.ds.deleteRecipe(this._recipe.id)
    } catch (e) {
      console.error(e)
      alert(
        'Sorry, there was a problem deleting the recipe. Please, try again.'
      )
    }
  }
  get recipe () {
    // геттер для рецепта
    return this._recipe
  }
  set recipe (recipe = {}) {
    // сеттер для рецепта, вызывающий метод render
    this._recipe = recipe
    this._render(this._recipe.title)
  }
}

window.customElements.define('recipe-item', Recipe)

Маршрутизация


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

Изначально я, для организации навигации в приложении, использовал npm-пакет Vanilla JS Router. Но, с использованием API History, совсем несложно реализовать собственный маршрутизатор, на который придётся что-то около 100 строк кода. Обратите внимание на то, что в этом примере не реализовано что-то действительно сложное, наподобие средств ограничения доступа к определённым маршрутам (route guard).

import './components/error/error'
import content404 from './components/404/404.html'
import DATA_SERVICE from './utils/data'
const ds = new DATA_SERVICE()
// получаем элемент, содержащий SPA
const $el = document.getElementById('app')

// объявляем маршруты
const home = async () => {
  await import('./components/recipe/recipe')
  await import('./components/recipe-list/recipe-list')
  await import('./components/modal/modal.js')
  $el.innerHTML = `<recipe-list></recipe-list>`
}

const create = async () => {
  await import('./components/create-recipe/create-recipe')
  $el.innerHTML = `<create-recipe></create-recipe>`
}

const edit = async () => {
  await import('./components/edit-recipe/edit-recipe')
  $el.innerHTML = `<edit-recipe></edit-recipe>`
}

const error404 = async () => {
  $el.innerHTML = content404
}

// установление соответствия маршрутов и путей
// получение рецепта по id для создания маршрута редактирования рецепта
const routes = {
  '/': home,
  '/create': create,
  '/error': error404,
  '/edit': async function (params) {
    const id = params.get('id')
    const recipe = await ds.getRecipe(id)
    await edit()
    $el.querySelector('edit-recipe').recipe = recipe
  }
}

// по событию onpopstate получить параметры из URL и передать их маршруту
// если нужного маршрута найти не удаётся - использовать маршрут /error
window.onpopstate = async () => {
  const url = new URL(
    window.location.pathname + window.location.search,
    window.location.origin
  )
  if (routes[window.location.pathname]) {
    await routes[window.location.pathname](url.searchParams)
  } else routes['/error']()
}
// добавление маршрута в историю браузера
let onNavItemClick = async pathName => {
  const url = new URL(pathName, window.location.origin)
  const params = url.searchParams
  if (routes[url.pathname]) {
    window.history.pushState({}, pathName, window.location.origin + pathName)
    await routes[url.pathname](params)
  } else {
    window.history.pushState({}, '404', window.location.origin + '/404')
    routes['/error']()
  }
}

// установка подходящего маршрута при загрузке и перезагрузке страницы
;(async () => {
  const url = new URL(
    window.location.pathname + window.location.search,
    window.location.origin
  )
  if (routes[window.location.pathname]) {
    await routes[window.location.pathname](url.searchParams)
  } else routes['/error']()
})()

// экспорт маршрутов и метода onNavItemClick()
const router = {
  onNavItemClick,
  routes
}
export { router }

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

Сравнение разработки с использованием JS и фреймворков


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

Минусы отказа от фреймворков


?Проблемы стандартизации


Спецификации веб-компонентов, с одной стороны, существуют уже довольно давно, а с другой, всё ещё развиваются. Так, веб-компоненты были представлены Алексом Расселом на мероприятии Fronteers Conference 2011. Однако серьёзная работа в направлении их поддержки и развития ведётся только в последние год или два. В результате в спецификациях всё ещё царит беспорядок. Например, технология HTML-импортов уже неактуальна, хотя о ней пишут в документации и в различных публикациях.

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


Имеется не особенно много решений для тестирования стандартных веб-компонентов. Так, существуют некоторые многообещающие инструменты — вроде skatejs ssr или web-component-tester. Но эти инструменты предназначены для применения с соответствующими библиотеками. В результате у того, кто хочет пользоваться веб-компонентами, возникают определённые сложности.

?Синхронизация интерфейса и состояния приложения



Конструкции querySelector()

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

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

?Технология Shadow DOM


Я всё ещё сомневаюсь в технологии Shadow DOM. С одной стороны мне нравится идея инкапсуляции. Это — адекватный паттерн проектирования, упрощающий управление стилями и облегчающий работу программиста. Но, с другой стороны, его использование сопряжено со сложностями, в том случае, если нужно, чтобы что-то выходило бы за границы инкапсулированных сущностей. Например, это касается применения общих стилей. Вопрос о том, как их использовать правильно, всё ещё открыт.

?Работа с DOM


Фреймворки и библиотеки вроде Angular и React отчасти обязаны своей притягательностью тем, что они значительно упрощают работу с DOM. А именно, они отлично показывают себя при выводе и обновлении элементов. Вот что говорится об этом в блоге Angular University: «Angular напрямую генерирует структуры данных DOM, а не работает, создавая HTML-код и потом передавая его браузеру для последующей обработки».

Angular, например, в отличие от jQuery, напрямую генерирует структуры данных DOM. Делается это вместо того, чтобы передавать браузеру HTML-код, который, перед попаданием в DOM, должен быть разобран. Такой подход отличается более высокой производительностью, так как благодаря его использованию устраняется шаг разбора HTML-кода. Технология Virtual DOM также весьма полезна, так как она позволяет отказаться от повторного рендеринга всего содержимого страницы, выполняемого каждый раз при обновлении неких элементов.

Минусы отказа от фреймворков в пользу обычного JS мы рассмотрели. Теперь поговорим о плюсах.

Плюсы отказа от фреймворков


?Размеры пакетов приложений


Пакет готового веб-приложения, разработанного на чистом JS, может оказаться (обратите внимание на слово «может») гораздо меньше, чем пакет аналогичного приложения, созданного с применением фреймворков. Например, пакет нашего готового экспериментального приложения, реализующего множество возможностей, в три раза меньше чем пакет пустого Angular-приложения.


Пакет пустого Angular-приложения


Пакет приложения, разработанного без использования фреймворков

?Использование фреймворков и понимание технологий


Если вы разрабатывали веб-приложения исключительно с использованием неких фреймворков и их CLI, для того, чтобы создать приложение без вспомогательных инструментов, вам придётся очень постараться. Создание проектов без фреймворков позволяет изучить базовые технологии, инструменты и паттерны проектирования, которые лежат в основе современной веб-разработки. Эти знания, в любом случае, будете ли вы, приобретя их, пользоваться фреймворками, или не будете, окажутся полезными.

?Производительность


То, что делается в недрах фреймворков и библиотек, позволяет получать замечательные результаты. Но за всё надо платить. В данном случае цена удобства — производительность. При этом, с ростом размера приложения, основанного на некоем фреймворке, может расти и нагрузка на систему, создаваемая вспомогательными механизмами, отвечающими за работу такого приложения. Систему нагружают ненужные операции по обновлению страниц, избыточные прослушиватели событий, глубокое сравнение объектов, без которого можно обойтись, неоправданно масштабные манипуляции с DOM. Избавиться от всего этого можно просто сделав всё своими силами.

Тут хочется отметить, что команды разработчиков React и Angular, очевидно, знают о подобных проблемах. Поэтому они уделяют немалое внимание оптимизации своих проектов. Например, речь идёт о чём-то вроде использования в React метода shouldUpdate() или о стратегии обнаружения изменений onPush в Angular.

?Простота решений и проблема использования чужого кода


Использование в собственных проектах чужого кода — это всегда риск. Если речь идёт о хорошо протестированных и многократно испытанных на практике фреймворках, то этот риск снижается. Но он существует всегда. Если вы можете позволить себе писать код самостоятельно, идёт ли речь о независимом программисте, или о команде, вы можете снизить этот риск. К тому же, так вы будете превосходно ориентироваться в коде собственных проектов.

Некоторые заметки и интересные наблюдения


Мне очень понравилось работать с Parcel. Когда я искал выходы из сложных ситуаций, я чувствовал себя ограниченным немного сильнее, чем при работе с Webpack, но я выяснил, что, по большей части, заявление о том, что Parcel не нуждается в настройке, отражает истинное положение дел.

Ранее я был склонен считать React, Vue и Angular средствами для решения одних и тех же задач. Поэтому я называл их все «фреймворками». Однако теперь мне ясно, почему React правильнее называть «библиотекой», а Vue — «прогрессивным фреймворком».

Почему я не воспользовался Stencil или Polymer? Дело в том, что я, при работе над рассматриваемым здесь проектом, стремился к тому, чтобы не использовать какие-либо пакеты, библиотеки или фреймворки. Правда, это не относится к средствам сборки проектов. Мне хотелось на собственном опыте увидеть то, что способны предложить современному разработчику чистые веб-стандарты.

Я уверен, что существует множество подходов к разработке SPA или фронтенд-приложений без использования фреймворков или библиотек. Здесь я рассказал о том, как испробовал один из них, но он ни в коем случае не ограничивает возможности тех, кто хочет создавать приложения с минимальным использованием чужого кода.

Базовые технологии или фреймворки?


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

Если ваш проект дорос до такого уровня, то вам нужно будет решить — стоит ли вкладывать время в создание системы, реализующей те же возможности, что и некий фреймворк или некая библиотека. Такие вот «переломные моменты» могут возникать на разных этапах жизни проекта. Это зависит от количества времени, которое есть у программиста или команды, и от объёма финансирования разработки. Но надо отметить, что фреймворки, если применять их правильно и уместно, отлично показывают себя в деле разработки веб-проектов.

Таким образом, можно говорить о том, что, с течением времени, большую часть того, что делают с помощью фреймворков, вероятно, легче будет сделать с помощью более мелких библиотек или вообще без вспомогательных инструментов. Например — взгляните на моё приложение. В то же время, если большие фреймворки смогут гибко реагировать на происходящее, они смогут измениться, адаптироваться и не потерять актуальности в будущем. Если нет — то они, с развитием базовых веб-технологий, могут, как сегодня jQuery, лишиться большей части своей привлекательности.

Итоги


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

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

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

Комментарии (164)


  1. staticlab
    11.02.2019 13:17
    +6

    К сожалению, приведённый пример с веб-компонентами не учитывает тот факт, что уже в небольшом приложении сразу же встанет вопрос об управлении состоянием, асинхронных операциях и т.п. Здесь нужны вспомогательные технологии, подобные redux, rxjs, mobx, vuex. В итоге получится некоторый глубоко кастомный фреймворк, для которого не будут существовать готовые рецепты и библиотеки (например, для обработки форм), а порог входа для новичков будет существенно выше, чем при разработке на популярном фреймворке. Придётся тратить дополнительное время на объяснение всех принципов, особенностей, best practices и соглашений. То есть собственно того, что делает фреймворк фреймворком.


    В статье эта мысль в целом проходит, но уж очень много в ней воды.


    1. PerlPower
      11.02.2019 19:37
      +2

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

      Ну да это полбеды. Средний package.json для двух примерно одинаковых сайтов может представлять такую сборную солянку, что не угадаешь. Кто-то любит grunt, кто-то gulp, кто-то вебпак, кто-то не может жить без lodash, а кто-то считает что минимализм прежде всего. Не уверен, что выбранный фреймворк сильно повышает порог вхождения по сравнению со всем остальным. Разве что порог прохождения собеседования.


      1. onegreyonewhite
        12.02.2019 00:21

        Ну всё же цель Framework'а не из голов разработчиков бардак убирать, а минимизировать его влияние. Без FWа простор для багов всегда больше. А бардак в головах нужно убирать ещё одним слоем соглашений внутри команды, просто меньшим (например, используем такой framework, такие инструменты и так располагаем файлы). Проще говоря определяем стек.


  1. numitus2
    11.02.2019 13:25
    +3

    Насколько я помню Jquery был популярным, потому что в те времена совместимость браузеров была ужасной. поддержка ie6 не давал возможность на реализацию любых фич без jquery. Сейчас js позволяет делать любую фичу jquery без jquery. Скорее всего будущие версии js будут нативно поддерживать функциональность фреймворков.


    1. JustDont
      11.02.2019 13:39
      +3

      Однако в js едва ли запихнут паттерны. Уже сейчас самое интересное, что даёт какой-нибудь реакт или даже ангуляр — это сокрытие солидной части «кишок» MVC. И это в js не появится. В то, что в js рано или поздно появится нативная хорошая поддержка шаблонизации — в это я, например, охотно верю. А вот то, что в него типичные паттерны проектирования интерфейсов впихнут в виде «синтаксического сахара» или еще как-то — неа.


      1. Zenitchik
        11.02.2019 16:00

        Однако в js едва ли запихнут паттерны.

        Мы в своё время запихнули. Но это было давно. Сейчас надо выбирать более подходящий фреймворк.


        1. mayorovp
          11.02.2019 16:15
          +4

          Какие именно паттерны вы запихнули в спецификацию js?


          1. Zenitchik
            11.02.2019 19:08
            +1

            Я неправильно прочитал пост. Пардон.


      1. Druu
        11.02.2019 19:10

        Уже сейчас самое интересное, что даёт какой-нибудь реакт или даже ангуляр — это сокрытие солидной части «кишок» MVC

        Это каким образом реакт и ангуляр скрывают кишки mvc?


        1. JustDont
          11.02.2019 19:21

          State management — это кишки MVC, да и в общем виде вопрос поддержки соответствия между M и V — это те самые кишки.


          1. Druu
            11.02.2019 19:35
            +1

            State management — это кишки MVC, да и в общем виде вопрос поддержки соответствия между M и V — это те самые кишки.

            Ну и весь стейт менеджмент что в ангуляре что в реакте лежит на плечах программиста. Где сокрытие кишок-то?


            да и в общем виде вопрос поддержки соответствия между M и V — это те самые кишки

            Это вобщем-то нерелевантный MVC вопрос, т.к. способ организации этого соответствия паттерном не регламетирован. Может у вас там подписки, может биндинги, может модель апи вида теребит — это все вполне mvc.


    1. dom1n1k
      11.02.2019 21:56

      Сегодня jquery-подобные библиотеки тоже имеют смысл. При всем прогрессе браузеров и стандартов, даже если вам не нужно поддерживать IE/Edge (что до сих пор редкость в серьезном проде) — всё равно нативная работа с домом очень многословная и неудобная.
      Если приходится работать с домом, как правило, все равно используют какую-то вспомогательную библиотеку — будь то jQuery, или какой-то облегченный аналог, или самописный велосипед.


    1. justboris
      11.02.2019 22:22

      Это не совсем так работает. В стандарты JS вносят только фичи, которые могут быть полезны разным фреймворкам, например fetch. А такие штуки как Object.observe или HTML imports оказались полезны только отдельным фреймворкам, а не всему сообществу в целом, поэтому в финальный стандарт они так и не попали.


      1. adictive_max
        12.02.2019 04:37

        А такие штуки как Object.observe или HTML imports оказались полезны только отдельным фреймворкам, а не всему сообществу в целом, поэтому в финальный стандарт они так и не попали.
        Что вообще крайне странный подход. Супер полезные фичи не принимают только потому, что они вписываются не во все шаблоны проектирования разом, а только в 70%.


        1. justboris
          12.02.2019 11:07

          Откуда цифра в 70%? Эта фича была полезна только для Angular, а это далеко даже половина никогда не была. Вот здесь есть больше информации про это: https://esdiscuss.org/topic/an-update-on-object-observe


          Кроме того, в стандарт внесли более полезный Proxy, который как оказался более удобным для применения в разных фреймворках: Vue, MobX


          1. adictive_max
            12.02.2019 17:48
            +1

            Object.observe и RX.Observable — это вот вообще ни разу не одно и тоже, даже не близко. Object.observe — это примерно то, как оно реализовано в Vue.
            Но в том-то как раз и дело, что Object.observe позволил бы в огромном количестве мест обходиться вообще без фреймворка и даже бойлерплейт-обвязок вокруг Proxy.


            1. justboris
              12.02.2019 19:29

              Object.observe был нацелен на оптимизацию $scope-объекта из AngularJS 1.x, а современный Angular как раз появился в 2015 году, когда стало понятно, что старый подход не прижился и порождает запутанный код.


              1. adictive_max
                13.02.2019 02:55

                стало понятно, что старый подход не прижился и порождает запутанный код.
                Не прижился в Ангуляре, зато прижился в Vue и MobX, т.к. для маленьких систем и/или одностороннего биндинга более удобен. То есть сам архитектурный принцип никуда не делся и вполне распространён, но аргументировалось его принятие или не принятие исходя из потребностей одного фреймворка.


          1. TheShock
            12.02.2019 22:09

            Кроме того, в стандарт внесли более полезный Proxy, который как оказался более удобным для применения в разных фреймворках: Vue, MobX
            Ну не знаю, реализация МобХ могла бы быть значительно изящнее с более простым Object.observe, чем с переусложнённым прокси.


            1. justboris
              12.02.2019 23:25

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

              Насчет переусложненности нативного API – у него нет задачи быть изящным. Красота делается в userland-библиотеках, а платформа нужна для того чтобы дать техническую возможность реализации как можно большему числу разных библиотек, чтобы не пришлось переписывать стандарт с каждым новым веянием в стилях программирования.


              1. TheShock
                13.02.2019 00:47

                Мне не нравится отображение прокси в дебагере, оно слегка усложнено


                1. VolCh
                  13.02.2019 11:55

                  Это к производителю дебаггера, нет?


      1. vintage
        12.02.2019 05:55

        Ну зачем тогда веб-компоненты условному реакту?


        1. justboris
          12.02.2019 11:18

          Чтобы использовать не-React компоненты в React и наоборот, подключать React-компоненты в другие фреймворки.


  1. edogs
    11.02.2019 13:39

    Половина статьи об отказе от jquery весящий меньше 100кб, а потом вдруг внезапно аргумент с angular с 8мб-ной папкой.
    jquery и прочие, особенно с учетом cdn, это уже скорее стандарт де-факто на многих сайтах, чуть ли не больше стандарт, чем чистый js, отчасти это можно назвать языком более высокого уровня чем js.


    1. iit
      11.02.2019 14:04

      Это смотря как собирать и использовать, например у меня есть проект на Vue который полностью весит 32мб но пользователю при работе с сайтом отдается 500кб-1.3мб js в зависимости от страницы, что позволяет работать с сайтом даже при 2G соединении, а учитывая кэш то можно работать вполне даже комфортно.


      Да размер jquery меньше но по сравнению с кучей картинок и нестандартных шрифтов — размер не имеет существенной разницы.


      1. batyrmastyr
        11.02.2019 15:06
        +7

        Js, с точки зрения вычислений, стоит на порядок-два дороже картинок, так что даже 500 кб — это ужасно много.


      1. dom1n1k
        12.02.2019 00:32

        medium.com/@addyosmani/the-cost-of-javascript-in-2018-7d8950fbb5d4

        Спойлер
        image


        1. iit
          12.02.2019 15:03
          +1

          Справедливо. Но речь идет не о том что js блокирует работу страницы и не о том что за счет распаковки и своего выполнения он есть больше памяти, а о том сколько приходит данных пользователю.


          Плюс для таких любителей считать объем, которые думают что 1 мб js это много нужно учитывать что в SPA не только зашит собственно чистый js но и возможно css in js + довольно большая часть html кода компонентов и иногда например картинка в base64.


          Так что вес страницы нужно мерить полностью. И да внезапно не оптимизированные шрифты которые затребовал заказчик в одном проекте составили 60% времени загрузки страницы и 30% рендера.


          Да на Vue тоже можно сделать такую жуть что будет рендерится довольно долго, но это уже не проблема технологии как таковой.


          На c++ тоже можно забыть затирать объект в куче и использовать костыли с O(n2) и потом ругаться что он медленный и жрет память.


          1. dom1n1k
            12.02.2019 20:36

            А статья как раз и говорит о том, что просто измерять суммарный объем — это слишком упрощенная метрика. Потому что условные 100 кб скриптов сожрут ресурсов намного больше, чем равного объема картинка.


    1. Areso
      11.02.2019 20:49

      C jQuery бывает сложно остановиться. Да, сам он маленький, но вот мы подключили его расширение для таблиц (grid), вот для модальных и диалоговых окон, для пользовательского интерфейса (ui)… Сколько в итоге будет весить папочка с jQuery скриптами?


      1. highter
        12.02.2019 09:52

        Смотря какой функционал вы преследуете. Если подключать расширения от которых вам реально требуется только 10% его способностей, то тут ошибка ваша. Опять же если взять фреймворки, в них так же нужно подключать компоненты.
        Ну и в конце концов, многие крупные компании вообще уходят даже от JQuery, на чистый JS, пример тому github.
        У меня есть знакомый, с которым мы расспорились на тему JQuery vs Vue. В итоге сошлись на мнении, что все таки лучше то использовать, что знает отлично вся команда разработчиков.


        1. VolCh
          12.02.2019 18:32

          Логичный вопрос возникает: а когда нужно подключать jQuery (просто голый), когда сколько процентов его возможностей собираешься использовать?


          1. highter
            13.02.2019 10:02

            Речь шла о подключаемых расширениях — «но вот мы подключили его расширение… таблиц (grid)… модальных и диалоговых окон… пользовательского интерфейса (ui)...»

            А вообще насколько используем подключаемый скрипт можно посмотреть в DevTools -> Coverage. Там же и определиться стоит ли шкурка выделки для переписания на чистый JS


  1. Vadem
    11.02.2019 13:41
    +2

    Два мегабайта для практически пустого приложения?
    Что-то как-то многовато.
    Я не знаю, что курил автор, но у нового ангуляр приложения размер бандла 384KB, а не 6.5MB.


    1. iit
      11.02.2019 14:17

      Часто такие авторы меряют размер того, что выдаст не сжатый dev bundle. А в самом запущенном случае — размер исходников в папках включая node_modules =)


      Используя code splitting + gzip + сжатый bundle цифры совсем уже другие.


    1. haldagan
      12.02.2019 08:42

      Тоже совершенно не понимаю, как можно раздуть простейшее приложение до таких размеров.

      Я подозреваю, что автор взвешивал не-минифицированный вариант с учетом всего html и css. Хотя и в этом случае 2мб для заявленного функционала — многовато. Думаю, что пары сотен кб достаточно на всё.

      П.С.: Я уже писал насчет качества ресурса-донора статьи — судя по увиденному там пишут в основном дилетанты для дилетантов.


  1. skymal4ik
    11.02.2019 13:48
    +1

    Мне очень импонирует идея веба и простых приложений в них- вики, pdf-генератор, простенькая база с парой форм, доступ отовсюду…

    Но блин, столько учить и знать…

    Окей, основы нужны — html, css, js. Без вариантов. Немного интерактивномти — jquery. Больше динамики — ajax, http. Бекенд который отдаёт данные — php, python, ruby. Cookies и сессии тоже сюда. Немного красоты — bootstrap. База данных где хранить данные — mysql. Немного клея, чтобы всё это склеить — Linux, bash. Надо бы ещё нормальный инструмент, например толковая ide. Оказывается безопасность тоже надо — https, hsts, tls, let's encrypt, xss и прочие. Понадобилось работать с датами — добавляй moment.js, потом d3.js. Воспроизводимость и лёгкость деплоя — docker, ci/di. Ещё бы тесты и хуки для гита… Всё это я использую для простенького самописного crm как хобби.
    На фреймворк недостаточно сил и времени сейчас, ибо надо работать и развиваться в профессиональной сфере.

    И когда я смотрю на весь этот стёк, то я ужасаюсь, и хочу всё поменять на xcode, swift и iPhone :)))

    Да, я понимаю что в идеале это разные сущности, разные отделы, разрабы, админы и так далее. Но блин, не слишком ли сложно?))


    1. iit
      11.02.2019 14:13

      На самом деле не сложно, фреймворки очень похожи друг на друга. Сперва учить es6+ (месяц максимум) потом мне понадобилась на React 3 месяца а Vue уже освоил за 2 недели.


      В сухом остатке — то что я бы делал на jquery + es5 пару месяцев я сделал на Vue за 2 недели.


      Компонентный подход не прост — но правильное его использование существенно сокращает работу — тем более готовых компонентов куча и подключаются они проще чем плагины на jQuery.


      В плагинах на jq разброд и шатание, каждый плагин это свои хуки, свои структуры данных и куча прочих велосипедов. В React/Vue все компоненты типовые и календарь и компонент перетаскивания файла — дают одно и тоже событие но с разным содержимым, при этом привязать нужный обработчик — это дело пары минут.


      1. vintage
        11.02.2019 17:23

        На самом деле не сложно, фреймворки очень похожи друг на друга.

        Громкое заявление. Сравните React и $mol, например, и попробуйте найти хоть что-то общее. Впрочем, освоить $mol можно за те же 2 недели.


        1. bano-notit
          11.02.2019 21:56

          > Впрочем, освоить $mol можно за те же 2 недели

          Громкое заявление от разработчика этого фреймворка :D


          1. vintage
            11.02.2019 22:15
            -4

            image


        1. VolCh
          12.02.2019 06:38

          Там пропущено слово «популярные» :)


          1. vintage
            12.02.2019 22:16

            image


    1. staticlab
      11.02.2019 14:38
      +2

      И когда я смотрю на весь этот стёк, то я ужасаюсь, и хочу всё поменять на xcode, swift и iPhone :)))

      Большая часть из того, что вы перечислили — это бэкенд. Если у вас мобильное приложение будет взаимодействовать с сервером, то будет и бэкенд. А там снова и базы данных, и очереди, и серверные языки, и линукс, и безопасность. Не слишком сложно?


    1. Matisumi
      11.02.2019 14:44
      +3

      А для «xcode, swift и iPhone» не нужны базы, безопасность, бекенд, тесты, ci/cd, хуки гита?


    1. staticlab
      11.02.2019 17:29

      на весь этот стёк

      кстати куда стёк? :)


    1. bano-notit
      11.02.2019 21:55

      А вы взяли и смешали в кучу людей и коней. Всё, что относится к Web закончилось на cookies и тем, что оканчивается на .js. Всё остальное — общие инструменты и практики, которые не только в вебе работают.

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

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


  1. Zet_Roy
    11.02.2019 14:10

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


  1. impwx
    11.02.2019 14:38
    +4

    Использование в собственных проектах чужого кода — это всегда риск.
    Если существует известный поддерживаемый фреймворк\библиотека, то писать собственный велосипед вместо него — это гораздо больший риск.


    1. powerman
      11.02.2019 19:18

      На самом деле цена каждой библиотеки-зависимости намного больше, чем принято думать. Вот здесь Russ Cox (один из авторов Go) это описал очень подробно: Our Software Dependency Problem.


  1. maslyaev
    11.02.2019 15:19
    +15

    Все говорят про какие-то крутые SPA, но реальность в подавляющем большинстве случаев выглядит ошеломляюще примитивной. То есть спросить пользователя firstname, lastname, email и предложить нажать кнопочку Submit. Это можно было сделать на заре WWW через банальный CGI, и можно сделать сейчас через сложнейшую связку NodeJS с <Ваш любимый фреймворк>. В первом случае это простенький скрипт на пыхе, а во втором эпичная конструкция.

    Я понимаю, когда в браузере пользователь делает что-то по-настоящему эпичное (замена офисного пакета, полноценный почтовый клиент и т.п.), но ведь нет, большинство применений — это старые добрые фантазии на тему firstname, lastname и кнопочки Submit. Господа, в чём же профит?

    К слову, заметил, что те действительно сложные и функциональные штуки делали в дофреймворковскую эпоху, сейчас смотрятся старомодно. Сейчас стараются не утомлять юзера лишними наворотами. Показать ему слоган, картинку, ну и эти… как их… firstname, lastname и кнопочку Submit.

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


    1. staticlab
      11.02.2019 15:36
      +2

      большинство применений — это старые добрые фантазии на тему firstname, lastname и кнопочки Submit. Господа, в чём же профит?

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


    1. Stan_1
      11.02.2019 16:59
      +2

      Как минимум — когда делаешь form/submit — сразу получишь кучу спама. Можно извращаться с фейковыми полями и прочим — но все это не работает. Либо капча (неудобно для пользователя), либо терпеть спам.

      Когда я делаю на VUE, то поля отправляют значения в store, оттуда скрипт повешенный на кнопку забирает значения и отправляет через AJAX.

      Да, пушкой по воробьям. Но спам уже достал неимоверно. :(


      1. maslyaev
        11.02.2019 18:04

        Банальная отправка данных через POST, имхо, не повод затаскивать к себе в проект 100 с лишним мегабайт чужого кода, суть и конструктивные особенности которого уже давно ни одна живая душа во всей полноте осмыслить не может.


        1. staticlab
          11.02.2019 18:18
          +1

          Цифра в 100 Мб взята с потолка?


          1. maslyaev
            11.02.2019 18:41

            На самом деле 120 с чем-то.

            npm install -g vue-cli
            vue init webpack frontend
            После этого замеряем размерчик папочки «frontend».

            Справедливости ради, аналогичная манипуляция с ReactJS даёт больше 200.


            1. staticlab
              11.02.2019 18:48
              +2

              А компилятор C++ сколько весит? Или он лежит в другой папочке, а потому не считается? А джавовский Gradle считается? Он себя может локально развернуть. А ведь там тоже мегабайты "чужого кода, суть и конструктивные особенности которого уже давно ни одна живая душа во всей полноте осмыслить не может".


              1. maslyaev
                11.02.2019 19:07

                Компилятор C++ один на ВСЕ проекты. Поэтому не считается.


                1. staticlab
                  11.02.2019 19:11
                  -1

                  Ясно. Вот трагедия-то какая.


                  1. maslyaev
                    11.02.2019 19:30
                    -1

                    Не подумайте, мне не жалко 120 метров. Особенно если для действительно для чего-то достойного. Но в данном случае эта штука не помогает даже с дизайном. То есть по-любому весь HTML и CSS всё равно придётся своими руками написать. А вся эта жуть, вокруг которой столько шума — это про то, как подружить M c V через P. Вот в этих трёх соснах вся толпа и бродит, наворачивая всё новые и новые навороты поверх существующих уже и так изрядно навёрнутых наворотов.


                    1. wladyspb
                      12.02.2019 13:44
                      +1

                      Я вас сильно удивлю, но для староверов которые не любят npm, сборщики и прочее из мира фронтенда(я сам такой, не бейте палками — основная профессия всё же бэк) — можно просто подключить vue на страницу через тег script и вместо 120mb вы в свой проект загрузите 85kb. И даже компоненты можно так же подключать. Современный фронтенд не любит такой подход, но vue к счастью предоставляет выбор.


                1. Druu
                  11.02.2019 19:53

                  Так поставьте глобально пакеты. Будет один раз.


            1. Stan_1
              11.02.2019 22:25
              -2

              Ну наверное, это лучше, чем мог бы быть гигабайт, и хуже, чем, скажем, 15 мегабайт. А о чем говорит размер? Большой размер — это хорошо, или плохо? Или вообще ни на что не влияет? Мне кажется, последнее.


        1. Stan_1
          11.02.2019 18:25
          +1

          Спам через POST прекрасно ходит, увы.


      1. Immortal_pony
        11.02.2019 19:30
        +1

        И что мешает реализовать эту невообразимо сложную логику на VanillaJS/JQuery?


        1. Stan_1
          11.02.2019 22:26

          Для меня на VUE это быстрее написать. Плюс — получаю еще кучу других преимуществ.


          1. Immortal_pony
            12.02.2019 00:05

            И что, только ради этого надо вндерять в проект Vue? Не считая того, что его еще придется и изучать? Может про другие преимущества расскажете (в рамках предоставленного maslyaev примера)?


            1. Stan_1
              12.02.2019 00:29

              А почему нет? Что такого есть в VUE, что делает его «сложным для внедрения»? Создание проекта делается в две команды:
              rails new PROJECT_NAME --skip-coffee --skip-test --skip-sprockets --webpack=vue

              и затем
              rails webpacker:install:vue

              На этом я сразу получаю окружение, позволяющее сразу вести разработку приложения. Что такого сложного во «внедрении в проект VUE»?


              1. shybovycha
                12.02.2019 01:27

                как же быстро вы подтвердили контроверсионную точку зрения. теперь простой пример формочки firstaneme, lastname, email и кнопки submit требует рельсы...


                1. Stan_1
                  12.02.2019 07:49

                  Я и не скрывал. А рельсы для такого — это плохо? Почему? У них есть какие-то недостатки, не позволяющие эффективно решить задачу формочки?


                  1. tyler_derden
                    12.02.2019 10:18

                    Неплохо, конечно, если к skip добавить action cable и триллион других слов.


                    1. Stan_1
                      12.02.2019 14:10

                      Согласен :) Я просто из обычной своей строки иницииации стер все лишнее :)


                1. unclejocker
                  12.02.2019 08:45

                  Когда у тебя в руках молоток, все задачи кажутся гвоздями.


              1. maslyaev
                12.02.2019 12:40

                Вот это «почему нет?» конкретно расслабляет. Туда-сюда сотню-другую мегабайт — фигня вопрос. А потом смотрим, вдруг внезапно начинает цвести тема «девопс», позволяющая лёгким движением руки развернуть тысячу виртуалок. Народ, а что у нас за такие крутые вычислительные задачи, для которых нам может понадобиться тысяча stateless вычислительных серверов? Крипту майним? Лекарство от рака ищем? Навороченные нейросетки тренируем? Да нет же, пытаемся сделать так, чтобы firstname и lastname сабмитились гладко через врождённо-однопоточную Ноду.


                1. Stan_1
                  12.02.2019 12:56
                  +1

                  Хм… Вот опять не понимаю. Стоит бизнес-задача — гладкий сабмит firstname и lastname. Задача решена, быстро, заказчик доволен. В чем проблема, даже если это и требует «тысячи серверов»?

                  Я просто упорно не могу понять. Есть три составляющие: сроки, функции, деньги. Если я уложился во все: какая разница, какие технологии и ресурсы я использовал?


                  1. maslyaev
                    12.02.2019 13:12
                    -1

                    Безответственный хищнический подход. Задачу сделали, деньги получили, а там хоть трава не расти. Сейчас Заказчик доволен, желаемая им магия работает. А через месяц окажется, что для его фигни нужно во-первых не забывать регулярно башлять Амазону за AWS, а во-вторых желательно нанять загадочного, редкого и чрезвычайно дорогого зверя, который называется «девопс-инженер».
                    А по-хорошему, всё могло бы обойтись стареньким пентиумом, засунутым с глаз долой куда-нибудь в кладовку.


                    1. Stan_1
                      12.02.2019 13:25

                      Картина апокалипстическая, но реальная жизнь все же другая. Старенький пентиум в кладовке — это не бизнес, а стагнация. Создавая любую систему нужно исходить из того — что она должна быть расширяема. И фрейморвки, в данном случае — Rails, Vue, React и пр. задают очень удобные рамки. Уровень вхождения в проект любого нового разработчика, знакомого с Rails и Vue — очень низкий, понять, что делал предыдущий человек — можно довольно быстро.

                      Наличие ресурса, будь то AWS, или просто VPS (а его, поверьте, достаточно для Rails+Vue) — да, издержки этой практики. Но выбор Rails + Vue — это как ответственный подход с точки зрения будущей модернизации.


                      1. maslyaev
                        12.02.2019 14:03

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

                        Когда-то давно можно было уверенно говорить о том, что пилить систему на FoxPro — самое разумное решение, но сейчас все эти крутые начинания превратились в вонючее легаси, которое все мечтают срыть нахрен. Есть ли у нас гарантии, что поделия на Ангуляре, Вуе или Реакте не превратятся в такое же легаси в обозримой перспективе? Просто прикиньте, как сейчас искать спеца, который не только умеет, но и желает докручивать FoxPro, и примерьте ситуацию на наши прекрасные новомодные фреймворки.


                        1. Stan_1
                          12.02.2019 14:16

                          Это все слишком глобально. Я мыслю проще. Рельсы обеспечивают обвязку для проекта, где любой рельсовик знает: где найти маршруты, контроллеры, модели и миграции. Это настолько жестко забито — что я ни разу не видел проектов, где было бы не так, как везде. :)

                          Vue дает возможность полностью изолировать компоненты друг от друга. Что-то скрыть, что-то добавить — делается очень легко. Влияние на другие компоненты невозможно из-за scoped стилей. Не нужно думать о разделении стилей по namespace. Обмен — через Vuex. Если нужно — новый разработчик может даже не вникать в старый код — просто пишет новую компоненту, и общается со старыми через Vuex, ничего не зная: ни id компонентов других, ничего. Идеальная изоляция подсистем.

                          Я говорю только об этом, не замахиваясь на глобальность мироздания :)


                          1. maslyaev
                            12.02.2019 14:25

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


                        1. Druu
                          12.02.2019 14:43
                          +1

                          Есть ли у нас гарантии, что поделия на Ангуляре, Вуе или Реакте не превратятся в такое же легаси в обозримой перспективе?

                          Да конечно превратятся! Просто ваша фигня под пентиум превратится быстрее.


                          1. maslyaev
                            12.02.2019 15:06

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


                            1. mayorovp
                              12.02.2019 16:12
                              +1

                              Тихо жужжать в углу может что угодно. Вопрос легаси-кода поднимается в тот момент, когда жужжать в углу уже недостаточно, и «фигню» приходится дорабатывать.


                              1. maslyaev
                                12.02.2019 20:54

                                Теперь представьте себе две ситуации:
                                1. Фигня — самоизобретённый велосипед. То есть не сильно заморачиваясь универсальностью сделали ровно то, что требовалось. Зависимости — только на стандартные библиотеки. Уровень перфекционизма — средненький.
                                2. Фигня сделана согласно полному комплекту веяний моды. Зависимости уходят в недра npm (как вариант, PyPI или чего ещё, без разницы), и там рекурсивно подхватывают существенный процент наработок сообщества.

                                Предположим, прошло 10 лет.

                                В первом случае после некоторого периода ознакомления с конструкцией пациента просто берём и докручиваем требуемое. И средство разработки, и стандартные библиотеки никуда не делись. Если нужно, на просторах Интернета можно найти что угодно, хоть 3-й турбо-паскаль.
                                Во втором случае оказывается, что используемые пакеты часть заброшены (и уже несовместимы со своими зависимыми), часть потерялись, часть развились так, что не узнать. Бубен в руки и вперёд, пытаемся восстановить состояние состояние инфраструктуры на тот момент, когда фигня создавалась.
                                В первом случае чтобы разобраться, нужно освежить знания по средству разработки и его стандартным библиотекам. Во втором — по той Джомолунгме барахла, от которого пациент зависим.

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


                                1. mayorovp
                                  12.02.2019 21:12
                                  +1

                                  Нее, ситуации выглядят по-другому.

                                  1. Фигня — самоизобретённый велосипед. Нужно изучать весь код, чтобы понять что там происходит. Любой кусок функциональности потенциально может оказаться в любом файле.

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

                                  2.2 Фигня использует старый, но еще актуальный фреймворк. Тут еще проще: достаточно найти правильного динозавра, и тот во всём разберется.

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

                                  Но даже если и пакетов нигде не осталось — то можно взять за основу уже существующую и «жужжащую» сборку. Это всё равно на порядок проще, чем декопилировать бинарники, остающиеся от мейнстримовых языков.


                                  1. maslyaev
                                    12.02.2019 23:34
                                    -1

                                    Если задачу можно решить просто и дубово, без лишних наворотов и зависимостей от всей необъятной Вселенной, её нужно решать просто и дубово. Решение новичка, накрутившего глупостей и корявостей по незнанию — это, конечно, зло, но и код гения, решившего на простенькой задачке про засабмичивание firstname и lastname продемонстрировать свою невероятную крутизну — зло ни разу не меньшее. И пусть он не тешит себя мыслью про то, что потом его формочку можно будет превратить в полноценный фейсбук. Никто в фейсбук её превращать не захочет. А во что её захотят превратить, он всё равно не угадает. Потому что никто не знает будущего. А кто думает, что знает, у того просто мало опыта.


                            1. Druu
                              12.02.2019 18:54

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

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


                              1. maslyaev
                                12.02.2019 20:59
                                -1

                                Даже самый ярый поклонник реакта всё равно хоть один раз в своём проекте, да вписывает гетЭлементБайИД. То есть он по-любому знаком и с ваниллой, и с ХТМЛ, и с ЦСС.
                                А вот если при изготовлении фигни её автор в порыве вдохновения изобретал свой ни на что не похожий реакт — да, труба дело. Только посочувствовать.


                              1. Immortal_pony
                                12.02.2019 22:54

                                Github так не думает — https://habr.com/ru/post/418257/


                                1. Druu
                                  13.02.2019 07:02

                                  Не понятно, с чего вы это взяли.


                1. staticlab
                  12.02.2019 13:32
                  +1

                  Тысячу stateless серверов вы только что сами придумали. А сотня-другая мегабайт будут только на компьютере разработчика и CI-сервере.


                  Что касается "врождённо однопоточной" ноды, то реактивный подход сейчас стал популярен и на многопоточных платформах.


                  1. maslyaev
                    12.02.2019 14:20

                    Справедливости ради, реактивный подход мне самому понравился. Зачётная идея. Очень не хватало.


              1. Immortal_pony
                12.02.2019 22:56

                Ну да, классика: https://bash.im/quote/394695


                1. Arris
                  13.02.2019 03:21

                  только гента после этого работает, а приложение на vue еще писать надо.


            1. VolCh
              12.02.2019 06:43

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


      1. shybovycha
        12.02.2019 01:28

        я вот чего-то не понял: как стор решает проблему капчи и спама?


        1. vladkorotnev
          12.02.2019 04:32
          +2

          Скорее всего, делается упор на то, что у спамботов скрипты не исполняются


          1. Stan_1
            12.02.2019 07:56

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

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

            Но в последний год появились более умные скрипты, которые такую ситуацию просчитывают, видимо, путем анализа placeholder или label. Кол-во спама значительно выросло. Поэтому применить способ с полным отсуствием формы — сейчас для меня наиболее эффективный путь.

            Вот пример, последнего спама:
            Имя: 30857550
            Phone fake: 79777777777
            Местоположение: ()
            Email: 333333@333.ru
            Телефон: — Комментарий: Юридическое бюро предлагает услуги юридического сопровождения бизнес-процессов на всех этапах работы компании. тут была ссылка.


            1. vladkorotnev
              12.02.2019 09:05

              Кажется, у вас парсер сожрал пример формы. Но это тема весьма примитивная и старая и по-моему описывалась даже ещё в тогда бумажном выпуске ][акер-а год так за 2008, по крайней мере я увидел первый раз именно там.


              1. Stan_1
                12.02.2019 09:20

                Ну да, тема старая. Я же не говорил, что использую VUE только для этого. Просто для меня это как «антимпам из коробки» :) Уже готовый.


      1. EviGL
        12.02.2019 19:04
        +1

        Обычно "отломать сайт для ботов" ещё по пути приводит к "отломать сайт для слепых людей со screenreader'ами".


    1. Druu
      11.02.2019 19:18
      +3

      Все говорят про какие-то крутые SPA

      99% "крутых спа" — это проекты для внутреннего использования и б2б решения, то есть кровавый ынтырпрайз своего рода, с-но просто человек их не видит
      А для того, чтобы ленту твиттера выводить — действительно, спа не нужны.


      1. justboris
        12.02.2019 11:34

        Чтобы выводить только для чтения, может, и не нужны, но вот для написания ответов, лайков и всего такого уже понадобится более менее толстая клиентская логика, а там уже и до SPA недалеко.


        1. Druu
          12.02.2019 13:04

          Чтобы выводить только для чтения, может, и не нужны, но вот для написания ответов, лайков и всего такого
          уже понадобится более менее толстая клиентская логика

          Не надо никакой толстой клиентской логики, чтобы поставить лайк и написать пост. Это функционал гостевухи с народа.
          С точки зрения конкретно фронта твиттер — очень простое приложение.


          1. justboris
            12.02.2019 14:36

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


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


            Сравните два примера:


            • pikabu.ru – не-SPA, при переходе с поста на ленту показывается анимация подгрузки, страница ищет, куда вам перемотать
            • mobile.twitter.com — SPA, переход со страницы твита на ленту мгновенный


            1. Druu
              12.02.2019 14:49

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

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


              А отпозиционировать скролл на пост можно вообще через хеш.


              1. justboris
                12.02.2019 21:00

                В теории оно наверное и могло бы где-то работать как вы описываете, но на практике почему-то оказывается так, как в показанных мной примерах. В случае заметного количества интерактивного контента SPA оказываются отзывчивее и юзабельнее.
                Если у вас есть контрпримеры, покажите, обсудим.


                1. Druu
                  13.02.2019 07:26

                  В теории оно наверное и могло бы где-то работать как вы описываете

                  А до реакта, я так понимаю, интернета не было?


                  В случае заметного количества интерактивного контента SPA оказываются отзывчивее и юзабельнее.

                  Вы в одну кучу смешали СПА и современные фреймворки.


                  1. Можно делать СПА спокойно без каких-либо фреймворков на фронте, и оно не перестанет быть спа. В случае если у вас простое приложение вроде твиттера — такой подход, в сущности, не имеет каких-то особых проблем. С-но, большую часть существования интернетов именно такие спа и были. На каком фреймворке написан вк? А ведь он существенно сложнее твиттера будет.
                  2. Если у вас сложное приложение — вы берете фреймворк. Там закатывать солнце руками — становится очень печально.


    1. xPomaHx
      12.02.2019 13:26
      +1

      А почему для вас пхп это простенький скрипт, а nodejs это сложнейшая связка. Попробуйте вручную поставить отдельно пхп и апатч и настроить их конфиги чтобы вместе работали, а потом в ноде сделаете тоже самое за 3 строчки кода.
      Я не топлю за ноду я за объективность.


      1. sumanai
        12.02.2019 16:11
        -1

        Попробуйте вручную поставить отдельно пхп и апатч и настроить их конфиги чтобы вместе работали

        Всё это есть на любом копеечном хостинге, а для ноды, в большинстве своём, нужен VPS, где кроме самой ноды придётся сервер содержать.


      1. POPSuL
        14.02.2019 08:23
        +1

        С апачем может быть и все сложно (я его не видел последние лет 6, и слава богу). Связка php-fpm+nginx ставится одной командой, после этого достаточно немножко отредактировать конфиг nginx'а и в общем-то все будет работать сразу.
        А если нужно локально повеселиться — apt/yum install php-cli && php -S localhost:8080.


    1. wladyspb
      12.02.2019 13:38

      Я экспериментировал с чистым js, когда думал что мне не нужно тянуть за собой кучу библиотек вроде jquery для того, чтобы просто отправить форму. Это было давно, ES6 ещё не было, а я верил, что тащить лишний код в маленькое приложение глупость, когда можно написать пару функций. Потом я захотел отобразить список. Потом мне потребовалось чтобы список динамически обновлялся. Периодически я страдал, пытаясь сделать что-то что без библиотек писалось в десять строк вместо одной. Это был интересный опыт с чистым js. Повторять я его, конечно, не буду.

      Между тем, минифицированный vue.js сейчас весит 86,5kb, и я готов платить эту цену за удобство и реактивность. И даже подтяну к нему компоненты для красивых селектов, дэйтпикера, и редактора. Ещё почти 100 kb, ужас прямо, особенно учитывая что всё это закешируется.

      И да, возможно приложение будет тормозить, но не из за библиотек, а из за того что я на страницу подтянул несколько разнородных массивов данных из разных источников (на секундочку — несколько mb в gzip), отрисовываю их по разному, возможно работаю с ними, сравниваю, меняю… Эти проблемы решаются уже рефакторингом кода, нахождению узких мест, переписыванием алгоритмов — и они так же(а то и сильнее) тормозят на тех же данных на страницах на которых пока старый легаси код на jquery. А форма с простым submit где в селекте попытались отрисовать 10к элементов — вообще нормально не работает без автокомплита на стороне сервера.


  1. Zenitchik
    11.02.2019 16:03
    +3

    Фреймворки в JS исчезнут примерно тогда же, когда в Java. Иными словами — вряд ли вообще исчезнут. Потому что альтернатива — конструирование велосипедов.


    1. urtow
      11.02.2019 16:27
      +1

      Либо куча велосипедов сделанных другими людьми, либо куча велосипедов сделанными самим.

      Весело


      1. track13
        11.02.2019 17:00
        +4

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


        1. JustDont
          11.02.2019 17:15
          +2

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

          Это да.

          В среднем они лучше написаны

          А вот это — неа.
          В лучшем случае они в среднем лучше написаны с т.з. сферического качества кода, а не решаемых проблем. Если только задачи не совсем непроходимо типовые без малейшего шага в сторону.

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


        1. urtow
          11.02.2019 18:20

          Эх, мечты, мечты…

          В среднем они лучше написаны

          Анекдот про «В среднем они обе проститутки» знаете?

          безопасны

          Даааа? Возможно, если это велосипед написанный большой компанией, то код велосипеда проходит аудит безопасности. Возможно. А возможно и не проходит. А проходит ли аудит безопасности код, который используется этим велосипедом?

          с документацией

          Которой а) не хватает, потому приходится искать доклады, Best Practice и далее, далее б) Лучше бы не было, потому что она морально устарела или написана в стиле «вот переменная, вот класс, вот метод, вот так строится синхрофазатрон».
          Я не говорю, что все фреймворки такие, но сам зачастую лезу в код очередной поделки, потому что в документации чушь.

          по ним есть опыт у других разработчиков

          Это не Rocker Science и не музыкальная теория, осилить фреймворк не составит труда любому более менее приличному разработчику. Вы не говорим о jQuery/Django/RoR программистах, которые просто не умеют ничего другого.
          Учить надо алгоритмы и структуры, а не фреймворки. Не помню, кто сказал.

          на них не тратится бюджет

          Тратится. Фреймворк требует тестирования, проверки работы, исправления багов самого фреймворка, его обновления (и обновления вашего, кода который его использует).

          Я не говорю, что нельзя использовать фреймворки. Конечно можно и нужно. Но стоит понимать, что фреймворк написан для решения конкретной задачи у конкретного человека (компании). Либо это монстр, который старается решить проблемы всех людей в мире и 99% его возможностей вы никогда не используете.


          1. staticlab
            11.02.2019 18:40
            +2

            Это не Rocker Science и не музыкальная теория, осилить фреймворк не составит труда любому более менее приличному разработчику. Вы не говорим о jQuery/Django/RoR программистах, которые просто не умеют ничего другого.
            Учить надо алгоритмы и структуры, а не фреймворки. Не помню, кто сказал.

            Совершенно верно. Но чтобы правильно написать бизнес-логику, нужно знать нюансы работы фреймворка, иначе вместо O(1) где-то получится O(n), а вместо O(n) — O(n^2). В туториалах не всегда эти моменты освещены.


            1. urtow
              11.02.2019 19:21
              +1

              Это не нюансы работы фреймворка, это алгоритмы и структуры. Которые не имеют никакого отношения к фреймворку. И если знать их, разобраться в тонкостях конкретного фрейворка — вообще не проблема.


              1. staticlab
                12.02.2019 13:49
                +1

                Они имеют прямое отношение к фреймворку как раз потому, что используются в этом самом фреймворке. Нюансы как раз и заключаются в том, чтобы знать, какие алгоритмы и особенности их поведения используются в конкретном фреймворке. Например, какой ключ использовать для атрибутов key в элементах react и angular — когда можно брать его из счётчика цикла, а когда лучше использовать что-то из поля данных; почему в компонент react лучше передавать два атрибута по отдельности, а не объединять их в объект с двумя полями и т.д.


                1. urtow
                  13.02.2019 11:47
                  -1

                  Открыл код, посмотрел. Если я знаю структуры данных и алгоритмы, это вопрос часов. А то и минут, если это react. Зачем указывать это в требованиях? :)


                  1. staticlab
                    13.02.2019 12:17
                    -1

                    Вы об этих кейсах узнали только что, а компания желает, чтобы особенности работы фреймворка вам были известны заранее, а не разбирались в нём в рабочее время.


      1. maslyaev
        11.02.2019 19:51
        +1

        Ну да. Мы, инженеры-велосипедостроители, обречены изобретать велосипеды. Как только мы перестаём изобретать велосипеды, мы сразу же обнаруживаем себя продавцами-консультантами в велосипедном отделе. В принципе, там тоже не так уж и плохо, но у нас веселее.

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


      1. shybovycha
        12.02.2019 01:30

        вариации на тему: вы бы предпочли велосипед от giant / harley davidson или сваренный в гараже из остатков профиля и арматуры?


        1. toxicdream
          12.02.2019 08:58
          +1

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


        1. urtow
          12.02.2019 11:20

          Обсуждение инструмента без области применения — переливание из пустого в порожнее.
          Если мне надо клетить девочек (ну или мальчиков) и я живу в городе, езжу по облагороженным паркам и имею доход для обслуживания — конечно giant / harley davidson.
          Если я живу где-то в сельской жопе мира — я лучше сварю из арматуры, поставлю нормальные арматизаторы и буду гонять, не боясь сломать эту фигню.

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


  1. vintage
    11.02.2019 17:30
    +2

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

    Примечательно, что автор реализовал "своими силами" вызов полного ререндера в каждом сеттере. Во "фреймворках", наверно, что-то ещё более адское творится, раз он так "соптимизировал".


    1. powerman
      11.02.2019 19:29
      +1

      Для приложения такой сложности, как в статье — это абсолютно верный подход, потому что простой, надёжный, и с приемлемой производительностью. Что-то более оптимальное в данном случае это типичный пример premature optimization приводящей к излишнему усложнению кода и, возможно, багам.


      1. vintage
        11.02.2019 20:41
        +3

        приложения такой сложности

        Какой такой? Как по мне тут слишком много кода для такой простой задачи. При этом данный код стыдно выпускать в прод, так как нет индикаторов ни на загрузку данных, ни на сохранение. Нет кнопки "повторить оборвавшуюся загрузку". В случае любой ошибки показывается белый экран. И тд, и тп.


        простой

        Ручной менеджмент состояний — это нифига не просто. Нужно каждый раз, что-то меняя, вручную проходиться и всё обновлять.


        надёжный

        Тут мы видим много дублирующейся логики, которая рано или поздно разъедется и привет ночи с дебаггером. Ручное обеспечение инвариантов — это источник чуть-ли не 90% всех багов.


        с приемлемой производительностью

        Ага, на тестовых данных с 3 рецептами. Как только пользователь внесёт несколько десятков всё начинает адски тупить.


        premature optimization

        А вы почитайте первоисточник этого выражения. Там речь про то, что нет смысла заниматься локальной низкоуровневой оптимизацией, пока не оптимизирована высокоуровневая работа кода, так как после высокоуровневой оптимизации низкоуровневый код либо летит в трубу, либо перестаёт быть узким местом.


        излишнему усложнению кода

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


        1. powerman
          11.02.2019 21:18

          Не надо так нервничать. Я отвечал исключительно на "вызов полного ререндера в каждом сеттере" — в таком приложении это действительно уместно. Не стоит масштабировать мой ответ на вообще весь код этого приложения.


          1. staticlab
            11.02.2019 21:37

            А потому что завтра добавляем в это приложение ещё компонентов и страниц. Внезапно оказывается, что оно почему-то начало подтормаживать. Чтобы внедрить оптимизацию рендеринга потребуется довольно много времени на рефакторинг и регрессионное тестирование. А в бэклоге задачи только увеличиваются. В фазе MVP проекта никто времени на рефакторинг не даст, а тем временем техдолг растёт, как растёт и сложность спагетти-кода, которая всё более тормозит нормальный процесс разработки.


  1. danial72
    11.02.2019 21:39

    Кажется, когда люди вспомнят про события и научатся пользоваться веб-компонентами, люди поймут, что никуда не упал ни redux ни react


    1. JustDont
      11.02.2019 22:12
      +1

      Как только вы напишете что-то нетиповое на несколько десятков веб-компонент в несколько уровней глубиной, так потом обнаружите, что для управления этим всем вы уже где-то там сбоку наколхозили или state management, или гору тестов, или еще чего-то в таком же духе, что не сильно отличается от подхода реактов с редаксами.


    1. justboris
      11.02.2019 22:26

      А почему вы так считаете? У вас уже есть большое приложение на веб-компонентах и масштабируется нормально?


  1. OlegGelezcov
    11.02.2019 23:08
    +1

    А я вот сейчас в сторону blazor смотрю, и то, что я вижу впечатляет
    Связка web assembly + .net через некоторое время сделает ненужными вот эти тонны адских js-based фреймворков.
    Реализуя концепцию .net everywhere разработка spa станет такой же комфортной, как и создание десктоп приложений.


    1. VolCh
      12.02.2019 07:01

      Какая разница на .net или js писать, если модели, API и т. д. браузеров те же? Ну и насчёт комфорта очень субъективно.


    1. staticlab
      12.02.2019 10:25
      +1

      Но ведь Blazor больше похож на ASP.NET MVC, чем на десктопные технологии.


      1. OlegGelezcov
        13.02.2019 03:01

        про похожесть я не писал, про удобство писал


        1. staticlab
          13.02.2019 12:20

          Если Blazor больше похож на ASP.NET MVC, чем на WPF, то и удобство программирования будет таким же, не так ли?


          И да, не забывайте, что вместо этой "тонны адских js-based фреймворков" у вас будет виртуальная машина .NET, запущенная в виртуальной машине WASM, а интеграция с браузерным API всё равно будет проходить через JavaScript.


  1. shybovycha
    12.02.2019 01:33

    знатный вброс получился


  1. kirillovmr
    12.02.2019 03:06

    Что не говори, фреймфорки значительно упрощают жизнь разработчику. Автор правильно упомянул что за все нужно платить, в данном случае производительностью, но хочу обратить внимание и на экономию самого важного ресурса — экономию времени. Зачем изобретать колесо второй раз? Если можно объединить усилия, и так сказать с миру по нитке собрать интересные идеи вместе, комбинируя работы разных людей.

    Что было бы если каждый человек писал без фреймворка, насколько увеличилось бы время до релиза? А имея основу, гораздо прозе и правильнее сфокусироваться на конкретной задаче, на конкретно своей идее и проекте.


    1. VolCh
      12.02.2019 06:48

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


  1. Co0l3r
    12.02.2019 03:07

    Ждём продолжения «Когда исчезнут Java-фреймворки?», «Когда исчезнут C++ фреймворки?»


  1. VolCh
    12.02.2019 06:51

    В минусах отказа от фреймворка не указано повышение порога вхождения в проект для человека знакомого с фреймворком или набором библиотек а-ля react+redux.


  1. rework
    12.02.2019 08:33

    Создавая приложение на чистом js, вы невольно будете создавать очередной фреймворк. И чем больше приложений вы будете продолжать писать, тем больше он будет обрастать функционалом и расти в объеме.


  1. wtpltd
    12.02.2019 10:18

    Никогда не исчезнут. И это не зависит от языка. Потому как они антагонистичны.
    Цель любого языка программирования стать как можно более универсальным.
    Цель любого фреймворка стать как можно более специализированным.
    Цель любого микрофреймворка стать еще более специализированным, ибо эти фреймворки сильно разожрались.
    Есть ФВ для фронта, есть для бэкенда, есть для микроконтроллеров, есть для десктопа, есть для мобилок, есть для 3D, есть для VR.
    И так было всегда, даже когда еще не было компов. Топором можно и избу срубить и часы починить. Но ведь зачем-то сделали часовые отверточки…


    1. maslyaev
      12.02.2019 14:30

      Первый фреймворк, который я изучал, назывался TurboVision. Крутая штука, на которой можно было сделать всё, о чём только можно было помыслить. Потом оказалось, что таки не всё. А потом он умер и был навеки забыт.


  1. romanonthego
    12.02.2019 10:42
    +1

    окей. давайте так. у среднего реального проекта на react соотношение бандлов с вендоским кодом (все что в node_modules) и банда кода из src составляет 181кб/99кб. Только 60% кода реально попадающего клиенту (ну мы же не будем сравнивать размер папок с исходным кодом, право) — это код из node_modules (+ к этому tree shaking у вебпака работает так себе, я думаю можно снизить еще — было бы желание)

    За эти 60% процентов вы «покупаете» себе предсказуемость, документацию, фиксы безопасности и баг-фиксы, поддержку комьюнити, расширяемость.
    Так же по мере роста проекта в него все реже добавляются новые пакеты и все больше пишется своего кода, соотвественно использовать фреймворки будет все выгоднее и выгоднее.

    Вот и вся метрика. с определенной степени сложности/размера приложения/частоты обновления становится выгодно использовать фреймворки, до определенного — это неоправданно дорого.


    1. DemianFrai
      12.02.2019 13:04

      Как бы да. Но во всю эту формулу еще стоит внести стоимость переноса проекта на любой из фреймворков и склонность проектов к разрастанию. Заимев опыт разгребания многотонных монстров, начинающихся с «нам нужна одна страничка с информацией о компании», Вы в какой-то момент замечаете, что лепите на фреймворках все, что сложнее лендинга, а лендинги проектируете так, чтобы переносить их на фреймворк было не сильно больно.


  1. xPomaHx
    12.02.2019 13:28

    Раньше были времена цикла jquery vs vanila, теперь когда jq меньше используют, нужно найти новый объект хейта.


  1. copist
    12.02.2019 13:30

    Какие задачи возникают в результате отказа от использования веб-фреймворков?

    Переслены три варианта любого проекта: из г**на и палок без фреймворка, по-простому с мини-фреймворком и по серьёзному с полнофункциональным фреймворком.

    Все три варианта имеют право на существование, даже в крупных проектах. Ну понятно, что это сложно — поддерживать мега кода из г*а и палок, но они существуют.


  1. manifest1
    12.02.2019 13:51

    Минусы «своего фреймфорка»:
    1. Необходимо пилить много вспомогательных функций
    2. Требуется хороший архитектор, чтобы «свой фреймворк» разросшись не погубил себя
    3. Документирование его использования
    4. Отторжение новыми программистами, которые заходят на проект (многие программисты предпочтут использовать общеизвестный фреймворк и развиваться в нем, получать опыт и соответственно повышать свою стоимость в случае перехода в другую организацию)


  1. Spaceoddity
    12.02.2019 15:31

    Какой наброс!
    На самом деле в комментах много лукавства. Конечно хорошо профессионально овладеть каким-нибудь фреймворком и заточить под это дело воркфлоу. Особенно если работаешь на постоянке. Разворачивание проекта, вхождение в процесс — занимает очень мало времени. А вот переезжать на другую технологию, или, упаси бог, «даунгрейдиться» до ванильных html/css/js — брр… Поэтому сразу начинаются холивары о модных тенденциях во фронтэнде, об удобстве компонентного подхода по сравнению с семантическим и т.д.
    Поработайте во фрилансе. Желательно не стартуя с новым проектом, а доделывая за кем-то. Ад и Израиль! Куча мала из смеси фреймворков и нативных сущностей. Зато на какой-то модной штуке. Которую, во-первых, надо умудриться запустить («А вы чем собираете? Грунтом? Попробуйте Ярн! Не работает? А у вас какая версия?»). А во-вторых, разобраться где там куда всё распихано… Хотя как там фреймворки позиционируют? Удобство и скорость?
    С «устаревшим», но вменяемым «ванильным фронтэндом» эта проблема практически не всплывает.
    Программистов куда не запусти — тут же начнут обмазываться какими-то «оптимизаторами рабочего процесса» и повышать порог вхождения. Вот и до фронтэнда добрались. Что там на очереди? Дизайн?


    1. staticlab
      12.02.2019 15:58

      Поработайте во фрилансе

      Зачем?


      1. JustDont
        12.02.2019 16:09

        Чтоб увидеть самому, видимо. В корпоративном мире всё примерно так же, только снаружи не видно. Потому что сор из избы и всё такое. Зато о корпоративном мире можно иногда судить по внешним проявлениям, как например когда гуглопочта для показа ваших писем вдруг начинает прогружать 6.7 мегабайт яваскрипта.


        1. staticlab
          12.02.2019 16:10
          +1

          Так в этом же не фреймворки виноваты.


          1. JustDont
            12.02.2019 16:13

            Ну так автор заглавного коммента вроде так и написал, что фреймворки тут ни разу не являются «серебрянной пулей». В том смысле, что конечно они не виноваты в кривых руках и дедлайнах «вчера», но они и не сильно-то помогают делу поддерживаемого кода в условиях кривых рук и дедлайнов. А то и скорее наоборот: то, с чем на голом жс просто бы не справились, с фреймворками — всё-таки как-то взлетает на костыльной тяге, и потом доставляет миллионы радости и оптимизма тому, кому это потом поддерживать приходится.


            1. staticlab
              12.02.2019 18:07

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


    1. romanonthego
      12.02.2019 16:24

      Это несправедливо. Конечно в идеальном мире можно было бы ожидать каких-то идеальных решений, созданных на идеальном API. Но в реальном мире приходится чем-то жертвовать.


      Если под фронтендом имеется ввиду полторы анимации выпадающего меню на статичной странице-лэндинге тогда да, вполне возможно.


      Идеальный ванильный фронтенд с обходом всех косяков всех браузеров (точно всех? и тесты есть?) и имеющий хоть сколько-нибудь интересный функционал — ну вот например банальный date-picker — но не тот про который вы скажете "ну используйте нативный type="date", а посложнее чуть — с подсветкой доступных для вылета дат (реальный кейс, помните у всех были сайты авиабилетов в 2011-2012 году?) или выбором внутри диапазона дат (тоже реальный кейс, уже из отельного бизнеса) будет писаться долго, муторно, а после ухода программиста его написавшего — еще и крайней неохотно поддерживаться.


      Как только появляется необходимость управлять состоянием, синхронизацией с сервером, более-менее сложных асинхронных вариаций форм — все, привет. На ванильном коде далеко не уедешь (ну или уедешь но добираться будешь крайней долго)


  1. voltag
    13.02.2019 18:36
    +1

    Давайте смотреть на фреймворке проще.
    Конвейер это быстрее и лучше во многих отношениях, хотя бы на примере автомобилей. Но, как ни странно, существую автомобили и мотоциклы собранные в ручную. С каждым подходом вы получаете определённые плюсы и минусы. Замечу(мне так кажеться), что результат зависит не от использования фрейморка(конвейера) или его не использования(руки). Есть прекрасные образцы как ручного труда, так и сделанного на фрейворке таком-то. И весь хайп не из за подхода (каждый хвалит свою капусту), а из за людей, которые крафтили плохой код на конвейере или самоделку.

    Поддерживать говнокод всегда сложно и там и там. Хороший код всегда хорошо поддерживать и ручной и не ручной.

    Если Вам удобно писать с использованием фреймворк(ов)(а), отлично! Но это не значит, что Вы выдаёте максимальную эффективность (иногда, неожиданно, даже по показателем времени). Чёткий пруф с графиками я не готов предоставить. Мой опыт, я даже допускаю, что он, не совсем мал не идёт ни в какое сравнение с тысячами разработчиков. Но я замечу, что, обычно, фреймворки решают определённый круг задач, и как только Вы выходите за пределы фреймвор — это уже нагрузка, а не помощь.

    Я не против фрейморков, они решают типовые задачи, и делают это хорошо. Но это всего-лишь инструмент. И в заголовок можно написать что-то типа «Когда наконец исчезнут отбойные Молотки». Ответ очевиден =)


    1. justboris
      13.02.2019 20:51
      +1

      Хорошая аналогия. 99% людей купили свой автомобиль в салоне и никто не пристает к ним с вопросами, почему они не собрали свой, который ездит быстрее и ест меньше топлива.

      Однако в случае фронтенд-фреймворков почему-то аргумент про 99% типичных ситуаций уже не подходит, и всегда получается длинное обсуждение, о том как здорово делать все самому. Видимо, DIY-специфика Хабра влияет.


  1. POPSuL
    14.02.2019 08:35

    Все таки нужно уметь находить баланс между VanillaJS и FW.
    Как многие сказали — фреймворки упрощают разработку, но в то же время они увеличивают размер страницы и влияют на производительность. Для каких-либо личных (читать как простых) или очень сложных проектов (например, панели управления чем-то, полноценные приложения) использование фреймворков оправдано. В первых случаях они ускоряют разработку, во вторых — упрощают поддерживание и наращивание функциональности.
    Для проектов средней сложности (думаю что хабр можно отнести к таким), и проектов с которыми регулярно взаимодействуют я бы предпочел использовать как можно меньше сторонних библиотек/фреймворков. В таких проектах, как мне кажется, сложная логика на клиенте требуется чуть больше чем никогда, и цеплять всякие vue/react/angular для того чтобы отрендерить формочку для отправки комментария или цеплять jQuery чтобы просто выбрать элемент по селектору и добавить к нему класс — ну такое себе...


    1. VolCh
      14.02.2019 11:32
      -1

      Формочка и выбор по селектору — это как раз примеры простых проектов. Примеры проектов средней сложности для меня: рабочие места каких-то операторов, фронт- и бэк-офисы, личные кабинеты постоянных клиентов и «корзины» обычных покупателей, и т.д, и т. п. И как раз в них использование сторонних фреймворков или мощных библиотек оправдано (если возможно следовать идеологии этих фреймворков и библиотек, а не бороться с ними). А вот для очень сложных проектов оправдано «изобретение велосипедов» и, как вариант, выкладывание их в опенсорс для частичной поддержки силами комьюнити с одной стороны и бесплатной подготовки специалистов под себя. Собственно как тот же Фейсбук поступил с Реактом.