Continuing the discussion from Typescript - какие известны проблемы с интеграцией и использованием?:
Мы на текущем проекте (веб трейдинговая платформа) всерьез задумались использовать TypeScript. Отвечая на вопрос, почему не другие доступные транспайлеры, я сначала опишу ситуацию с проектом. Есть большая кодовая база, на es5, упакованная в commonjs модули, построенная на ООП-шных классах поверх цепочки прототипов, платформа развивалась не один год. Планируется дальнейшее развитие платформы, изменение поведения существующих классов и дописывание нового функционала, оптимизации.
Какие проблемы могут быть решены с помощью транспайлера, и при этом вызывают неудобство.
- Рефакторинг существующего кода сложен и многословен. Поэтому в случае, когда можно срезать угол, программист срезает. JavaScript позволяет с большой легкостью “срезать углы”, запутывая код, или добавляя проблем при отладке. Очень сложно контролировать качество кода программно.
- Многословность JavaScript-а для реализации общепрограммеских концепций. Одни и те же концепции (интерфейсы, абстрактные классы, обязательные параметры, необязательные параметры, валидация параметров) можно выразить разными образами, и со временем в кодовой базе можно встретить несколько реализаций примесей, или абстрактных классов. Что легкости при чтении не добавляет.
- jsdoc-и не справляются в должной степени с подсветкой типов и подсказками кто является потребителем какого типа данных.
- Сложность навигации по классам и их методам. Метод
getState
имеет почти каждый UI компонент, и если webstorm не смог определить тип свойстваcomponent
в кодеthis.component.getState()
, то при попытке перехода к методу мы наблюдаем портянку из файлов классов, который этот метод реализуют. Аннотации помогают, но опять таки нет механизмов программно убедиться, что каждый созданный метод - аннотирован, и аннотирован корректно.
Главное - то, чего нельзя делать: переписывать все. Поэтому нужен механизм максимального использования уже существующей кодовой базы.
Теперь пройдем по характеристикам существующих вариантов
es6
Будущий стандарт, устранившийся, с годной поддержкой ide-шками, новым и удобным синтаксическим сахаром (классы, наследование, интерполяция строк), пакетной системой. Есть минимум 2 транспайлера (babeljs и traceour), годно выполняющие свою работу.
Почему нет:
- тянет некоторые проблемы JavaScript-а с собой (типы).
- потребует переделки процесса сборки, (чтобы подружить новые модули с нашими commonjs).
Почему бы и да:
- стандарт, следовательно жить будет долго, не приведет к тому, что через пару лет мы будем завязаны на никем не поддерживаемую технологи.
CoffeeScript
Лаконичный, сахарный-сахарный (в смысле синтаксиса) JavaScript, вдохновленный Ruby. Решал в свое время множество проблем, которые сейчас решены в es6 (классы, наследование, интерполяция строк, arrow-functions). Не является стандартом, имеет поддержку. Чтобы научиться на нем писать, достаточно пары дней. Научиться его читать - сложнее. JavaScript является валидным CoffeeScript кодом.
Почему нет:
- неясно будущее технологии, а преимущества
- сложнее будет найти программистов (или придется тратить время на обучение)
- привносит свои проблемы в связи с новой семантикой
Почему бы и да:
- лаконичный, красивый
flowtype
Фейсбуковое изобретение, достаточно молодое. Из-за медийности компании сложно оценить ценность самой технологии (о технологии говорят потому что технология хороша, или потому что фейсбук ее всячески рекламирует. То же самое с React-ом). Добавляет проверку типов. Не знаю степень интеграции с IDE (подскажет ли несоответствие типов) внутри ide.
Почему нет:
- Решается 1 задача, в то время как проблем много.
Почему бы и да:
- Минимально требуемые изменения. Решается только 1 задача.
Dart
Гугловое изобретение, переходной мост между JavaScript и Java. Отличные доки, опциональные аннотации типов (на рантайм никак не влияют). Совсем другой язык, не несущий проблем javascrpt-а. Интеграция с ide, свой способ определения пакетов. Развивается только гуглом. Были речи о выстраивании dart-vm (интерпретатора) в браузеры, однако другие производители браузеров не сильно поддержали идею. Богатая стандартная библиотека. Язык продолжает эволюционировать достаточно быстро. Компилируется в JavaScript, но выдается много своего лишнего кода.
Почему нет:
- Если проект прекратит свою поддержку, никто не сможет потянуть его развитие. + не так много проектов завязано на Dart-е (несмотря даже на то, что стандарт открыт).
- Сложно использовать существующий код вместе с Dart-ом. Возможно, но сложно.
Почему да:
- Богатая стандартная библиотека.
- Хороший язык, вобравший сильные стороны как java, так и JavaScript.
TypeScript
Надмножество JavaScript, с опциональной типизацией, интерфейсами, и возможностями ES6. Считай, продвинутый Flowtype (так как есть интерфейсы и миксины) + ES6. Майкрософтовое изобретение, тем не менее опенсорсное. JavaScript это валидный TypeScript. Годная поддержка ide-шками. Положительные сигналы от коммьюнити: ангуляр, на который завязаны многие разработчики, собирается ипользовать тайпскрипт во второй своей версии. Типы учитываются только во время написани кода (как и в Dart), компилируемая в чистый (в плане формы) JavaScript.
Почему нет:
- Не стандарт.
Почему бы и да:
- Добавит строгости на уровне синтаксиса языка, позволит использовать возможности ES6.
- Решает больше проблем, чем привносит рисков (майкрософт забьет на проект).
Итого: мы сейчас оцениваем цену перехода, прикидываем сложности при использовании. Пока что всех рассмотренных инструментов, наши проблемы (не все, но немалая их часть) лучше всего решаются TypeScript-ом. Если цена перехода не будет велика, вскоре начнем использовать.