axy.define — бициклет на тему CommonJS

А тем временем полку бесполезных велосипедов всё пребывает.

Я забросил последнее время JavaScript, а он тут развивается семимильными шагами. Так что я решил освежить знания и посмотреть на новые веяния. Для начала взялся разобраться с TypeScript (потому что я типизированный задрот и педант), Node.js (потому что куда без него), а заодно подумать над модульной системой для клиента (потому что 21-й век на дворе).

И чтобы всё это объединить, я написал на TypeScript модульную систему, которая эмулирует окружение ноды в браузере (не полностью, конечно, но немного).

Вот — axy.define.

Имеется некая виртуальная файловая система, в которой в виде файлов лежат модули и любые другие данные, с ними можно работать с помощью модуля fs. require() ищет модули внутри этой «ФС». Полный алгоритм ноды: относительные пути, поиск по node_modules + системные каталоги, подстановка расширений, индексные файлы, package.json…

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

Частично реализованы некоторые элементы окружения, global, process, модули ядра, такие как fs, path.

Пример

Ссылка

Тестовое приложение тупо меняет цвет страницы на серый.

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

В примере тестовый проект собран вместе с node_modules в которой лежит сама утилита сборки.
В браузере же:

  1. Из «командной строки» опять запускается сборка проекта уже в виртуальной ФС.
  2. Собранный проект запускает отдельную песочницу.
  3. В песочнице опять проходит сборка с нуля.
  4. Собранный повторно проект уже запускается и меняет цвет страницы.
  5. Стандартный поток вывода перенаправлен из консоли в дивы.

Такой вот треш.