Mantri - это система контроля зависимостей от Thanasis Polychronak
Как известно, в штатной комплектации JavaScript нет встроенной модульной системы (как import в Python, или #include в C++).
Поэтому когда проект вырастает из пары файлов в несколько десятков/сотен модулей, этот вопрос встает остро.
Поэтому когда проект вырастает из пары файлов в несколько десятков/сотен модулей, этот вопрос встает остро.
Особенности Mantri:
- Является оберткой над Google Closure Tools
- Использует Namespaces
- Написана на Node и доступна в виде пакета npm
- Существует плагин для grunt
Для чего мне контроль зависимостей
Во время работы с достаточно крупной кодовой базой, появилась необходимость использовать Jasmine, иначе вносить любые изменения в код без тестов – как заниматься воздушной акробатикой без натянутой внизу сетки: нужны мастерство и смелость.Конечно можно было обойтись упорядоченной вставкой тегов script в testRunner.html но очень не хотелось этого делать.
Итак, что имеем: множество js-файлов, зависимость которых сложно прослеживать, и необходимость запускать тесты для отдельных модулей.
Альтернатива: Require.js и почему, все таки, Mantri
Но есть особенности:
- Require - реализация AMD (Asynchronous Module Definition), она подразумевает что все модули «определены», т.е. завернуты в вызов define(). С одной стороны это хорошо – меньше утечек переменных в глобальное пространство, но это может привести к неожиданным багам в существующей кодовой базе (часть модулей может опираться на глобальное пространство)
Mantri же основана на механизме модульного загрузчика: технически, чтобы определить модуль, достаточно написать в начале файла:/** * @fileoverview The user model. */ goog.provide('myApp.model.user');
-
Require ориентируется на файл-конфиг где прописаны алиасы и пути к модулям (конечно, вы можете это не делать ;) А это значит, что система сильно чувствительна к перемещению файлов.Mantri не завязана на пути к файлам, а ориентируется на виртуальные namespace-ы
-
За счет все тех же define() и использования путей файлов, Require проще использовать во время стадии разработки, библиотека просто делает асинхронные запросы за нужными файлами.
Mantri так не умеет, ему требуется шаг прекомпиляции, при котором будет сгенерирован файл зависимостейdep.js
, а уже потом можно делать ту же асинхронная загрузку.Эта особенность выравнивается на стадии выпуска в продакшн, т.к. в обоих случаях требуется шаг сборки (r.js или mantri build)
Похоже, в моей ситуации Mantri.js выглядит более подходящей.