i18n

29 окт. 2013 г.

Mantri.js Dependency System первый взгляд

Mantri - это система контроля зависимостей от Thanasis Polychronak
Как известно, в штатной комплектации JavaScript нет встроенной модульной системы  (как import в Python, или #include в C++). 
Поэтому когда проект вырастает из пары файлов в несколько десятков/сотен модулей, этот вопрос встает остро. 

Особенности Mantri:

Для чего мне контроль зависимостей 

Во время работы с достаточно крупной кодовой базой, появилась необходимость использовать Jasmine, иначе вносить любые изменения в код без тестов – как заниматься воздушной акробатикой без натянутой внизу сетки: нужны мастерство и смелость.
Конечно можно было обойтись упорядоченной вставкой тегов script в testRunner.html но очень не хотелось этого делать.
Итак, что имеем: множество js-файлов, зависимость которых сложно прослеживать, и необходимость запускать тесты для отдельных модулей.

Альтернатива: Require.js и почему, все таки, Mantri

Для решения этой проблемы есть проверенный способ с построением AMD-модулей –  Require.js
Но есть особенности:
  • 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 выглядит более подходящей.

Disqus for SimpleScripter