M - Монго

Когда я искал классный стартовый проект / исходный код / ​​шаблон или как бы вы его называли для стека MEAN, полностью написанного на машинописном тексте, я не нашел ничего действительно полезного. Итак, я начал создавать это семя сам. Вот мои первые впечатления от этого стека. Текущий результат размещен на github, его можно использовать бесплатно и повторно!

Стек MEAN когда-то был «вещью», но со временем от него отказались с появлением Angular2 +, в результате чего старые проекты были немного переработаны. Но зачем вообще кому-то нужно использовать стек MEAN? Для меня у этого стека всегда было одно большое преимущество: только один язык в проекте. Теперь, с появлением Angular 2, это вносит некоторую путаницу в мир MEAN. Большинство бэкэнд-библиотек для части Mongo-Express-Node написано на Javascript, тогда как большинство вещей Angular 2 написано на машинописном тексте. Если мы по-прежнему хотим, чтобы везде был один язык, нам нужно решить: Frontend Angular 2 в JS или бэкэнд в TS. Поскольку я люблю машинописный текст, для меня выбор был легким. Машинопись везде была!

E - Экспресс

Я начал с бэкэнда, так как здесь было гораздо больше неизвестных мне факторов. Используя Angular 2, вы пользуетесь множеством руководств и Google, поддерживающим фреймворк, но с бэкэндом TS Mongo-Express-Node вы немного сами по себе. Вопросы, которые у меня были, были примерно такими: «Каков этот инструмент?», «Могу ли я запускать свои модульные тесты с помощью IntelliJ, как я привык из JUnit?», «Для скольких пакетов npm существует типизация?» и «насколько надежны эти пакеты?».

Я начал с уровня базы данных, для которого нашел Mongo Connector с типизацией. Для модульных тестов я решил использовать Mocha и Chai. Я поместил тестовые файлы в тот же каталог, что и исходные файлы, и смог запустить их из командной строки, например:

mocha --reporter spec --compilers ts:ts-node/register '**/*.test.ts

Конечно, когда проект становится больше, вы хотите иметь возможность запускать отдельные модульные тесты. Это возможно с grep, что несколько громоздко. Однако через несколько часов мне удалось заставить IntelliJ запускать отдельные модульные тесты прямо из редактора. С тех пор опыт разработки значительно улучшился.

Во время разработки уровня базы данных я не столкнулся с какими-либо серьезными проблемами. Я, кстати, не самый большой сторонник MongoDB, но стек MEAN был существующим брендом, на котором я мог развиваться. В любом случае, я бы предпочел базу данных SQL для любых реальных веб-проектов, основанных на моем прошлом опыте работы с Mongo. Вот мои причины, почему. Если вы разделяете это мнение, я также злоупотребил буквой M в MEAN, чтобы создать ветвь MySQL стека. Я разработал интерфейс доступа к базе данных таким образом, чтобы остальной части приложения не нужно было знать, поддерживается ли оно Mongo или MySQL. Модульный дизайн ftw. В любом случае, я собираюсь поддерживать обе ветки в будущем.

A - Угловой

Следующей частью приложения была буква «E», ExpressJS / ExpressTS. Я установил несколько простых маршрутов и общий «маршрутизатор CRUD», который позволил бы вам создавать / читать / обновлять / удалять любые данные, используя url /api/v1/:resource/:id. Затем я добавил модель пользователя и уровень аутентификации. Замечание о моделях: сначала я поделился моделями между фронтендом и бэкэндом, но это было слишком неприятно, так как мне всегда приходилось npm publish при каждом изменении, и особой пользы от этого не было, поскольку модели все равно различались. Например, у внутреннего пользователя также хранится пароль и так далее. Для аутентификации я использовал PassportJS. Сначала меня немного сбивало с толку то, как это напрямую используется в слое маршрутизации. Я также использовал что-то под названием connector-flash, относящееся к паспортуJS, пока не заметил, насколько, надеюсь, он устарел ... У меня был аналогичный опыт с библиотекой хеширования паролей. Сначала я установил bcrypt, а потом мне пришлось переключиться на bcrypt-nodejs, поскольку bcrypt вызывал сумасшедшие ошибки при установке. К счастью, я не использовал библиотеку bcrypt непосредственно в своем коде, но добавил к ней небольшой слой. Таким образом я мог легко переключить реализацию (библиотеку) и гордиться собой, насколько мастерски я программировал интерфейс. А если серьезно, то, учитывая отток пакетов, я настоятельно рекомендую вам это для вашего проекта NodeJS: если это не профессионально поддерживаемая библиотека, лучше оберните ее, чтобы вы могли легко ее отключить! Конечно, бывают случаи, когда в этом нет никакого смысла, например, Например, вы не можете просто обернуть интерфейс Angular, но Angular 1 - ›Angular 2 на самом деле является хорошим примером того, как вы черт возьми, когда ваша широко используемая библиотека, которой вы доверяете, устарела ...

N - узел

Что касается самого внешнего интерфейса, изначально я не планировал ничего делать, так как в основном это серверная часть, в которой отсутствовал шаблон машинописного текста, а в Angular 2 есть хороший интерфейс командной строки для создания лесов. Но потом я подумал: Ну, вы должны хотя бы продемонстрировать, как используется ваш крутой backend api. И я решил создать небольшой интерфейс. Я должен сказать, что мне очень нравится работать с CLI, так как я человек, который генерирует довольно маленькие компоненты (по одному на каждую кнопку), и это значительно упрощает задачу. У меня были сценарии оболочки в Angular 1, которые сделали это за меня, но с AngularCli это стало еще удобнее. Кроме того, когда дело доходит до сборки производственной сборки, это непревзойденно. Просто иметь возможность запускать ng build --prod просто потрясающе. Мне вообще очень нравится Angular2. Единственное, чем я до сих пор не доволен на 100%, так это управление состоянием, так как все делают это немного по-своему, и на самом деле нет никаких лучших практик, но, кроме этого, я не так много нашел, о чем пока можно пилить . Что ж, есть несколько подводных камней, но в основном все работает так, как я ожидал.

Заключение

Наконец, объединив все эти вещи вместе, функциональный REST-API и упрощенный интерфейс, я решил провести демонстрацию приложения. Пока я работаю над проектом, он все еще постоянно улучшается, но это то, что есть сейчас. Для развертывания я снова решил полностью разделить серверную часть и интерфейсную часть. Интерфейс просто потребляет серверную часть через http://demo.tsmean.com:4242. Я думаю, что это довольно крутая установка, так как в этом случае вы также можете использовать удаленный бэкэнд для локальной разработки своего интерфейса. Например, если вас интересует только внешний интерфейс, продолжайте и получите git-репозиторий внешнего интерфейса и используйте этот REST Api для проверки! Бэкэнд должен разрешать запросы CORS, чтобы эта настройка работала, но кроме этого ничего не нужно было настраивать. Сам интерфейс обслуживается 20-строчным скриптом узла (также использующим экспресс).

Следующие шаги

В настоящее время я работаю над улучшением модульности системы, так что действительно есть модули mysql и mongo, а также проверка подлинности и т. Д., Модульная. Я делаю это с помощью библиотек машинописного ввода npm, для которых я написал небольшой учебник, как их создавать в процессе на «how-to-write-a-typescript-library.com».

Куда все это меня оставило? Я все еще в восторге от стека. Мне очень нравится, что нет переключения контекста, что есть только машинописный текст, машинописный текст, машинописный текст (и немного HTML и CSS). Было одно исключение: я сначала попытался написать свой сценарий развертывания на машинописном тексте, и это было ужасно. Пакет node-ssh содержал ошибки и был намного сложнее, поэтому я вернулся к обычному сценарию оболочки. Я пробовал много реализаций сценариев развертывания за эти годы (js, ts, python, java,…), и я всегда возвращался к простому сценарию оболочки. Но вернемся к теме. Мне пока нравится стек, за исключением того, что я предпочитаю MySQL Mongo для всего, что должно стать настоящим проектом. Но, конечно, я пока не могу сказать, как этот стек будет вести себя в масштабе. Я еще не создал с его помощью многомиллионное веб-приложение, о чем можно судить по «первым впечатлениям» в названии. Однако я не вижу причин, по которым вы не хотели бы использовать этот стек для своего производственного проекта. Я бы не стал слишком много спорить о производительности, поскольку ваши часы разработки, вероятно, будут намного дороже, чем затраты на ваш сервер. Я бы не стал ни выбирать, ни отказываться от стека по производительности. Я бы не сказал, что «узел неблокирующий, мы должны его использовать!», Так как вы также можете получить неблокирование с помощью Scala, Java и т. Д. И я бы не сказал: «JS - это динамический язык, он намного медленнее, чем скомпилированная Java», поскольку вы всегда можете передать тяжелые вычислительные задачи на аутсорсинг выделенным веб-службам, а покупка дополнительного сервера узла также вас не испортит. Больше всего меня беспокоит вопрос «как обстоят дела с инструментами» и «насколько стабильны пакеты»? Я где-то посередине. Конечно, инструменты не так хороши, как с Java. Я все еще нахожу, что IntelliJ иногда немного исчерпывает свои возможности в моем проекте (он становится немного вялым), хотя я не знаю почему. Кроме того, некоторые мелочи, такие как импорт типизации, которая иногда отсутствует, необходимость настройки поддержки NodeJS и mocha в IntelliJ и т. Д., Требуют некоторого времени. С другой стороны, управление внешними и внутренними зависимостями с помощью npm (или пряжи) - это круто. Опять же, это «всего одна система», которая делает вас более эффективными и придает ясность проекту. Итог: мне очень нравится работать с fullstack-typescript, и я определенно продолжу развивать свой шаблон / исходный код / ​​стартовый пакет / что угодно. Я думаю, что это идеальное начало для вашего приложения, поскольку начать работу с ним несложно, но это также отличный выбор для любого проекта среднего размера. Если ваш проект является следующим по величине веб-приложением на земле, возможно, еще слишком рано использовать стек, но также может быть возможность принять его с недавним взрывом использования машинописных текстов.

Я хотел бы услышать ваше мнение по этому поводу. Какой у вас опыт работы с полным стеком машинописного текста?

Создание стека TS MEAN - первые впечатления