Вы писали крупные проекты используя JS? У вас было много объектов в объектах объектов (напр. LIB.Module.object.param)? У меня такое было часто и это вызвало довольно большое неудобство и плохой вид кода. Аналогично часто приходилось использовать анонимные функции, они выглядят не особо аккуратно.
ImEx.js
Хотелось какого-то очень простого и аккуратного решения проблемы. Случилось так, что проект над которым я работаю имеет модуль на node.js, который собирает воедино все .js файлы в один build.js. И здесь возникла мысль, а почему бы не добавить некий пре-процессор, который несколько модифицирует входной код, тем самым позволив сделать нестандартные функции (легковесный CoffyScript или TypeScript). Так и появился маленький препроцессор ImEx.js
Цель
Избежать длинных конструкций
Предположим у нас есть три сущности World, World.Animal, World.animals.Dog, давайте представим как оно будет выглядеть на чистом JS:
// World.js
var World = {
animals: {}
};
// Animal.js
World.Animal = function ( name, legNum ) {
this.name = name;
this.legNum = legNum;
};
// Dog.js
World.animals.Dog = function () {
this.barking = false;
};
World.animals.Dog.prototype = Object.create( World.Animal );
World.animals.Dog.prototype.bark = function () {
this.barking = true;
};
World.animals.Dog.prototype.stopBark = function () {
this.barking = false;
};
Если воспользоваться ImEx.js код будет выглядеть вот так:
// World.js
namespace Global;
export World = {
animals: {}
};
// Animal.js
namespace World;
export Animal = function ( name, legNum ) {
this.name = name;
this.legNum = legNum;
};
// Dog.js
namespace World.animals;
import World.Animal;
export Dog = function () {
this.barking = false;
};
Dog.prototype = Object.create( Animal );
Dog.prototype.bark = function () {
this.barking = true;
};
Dog.prototype.stopBark = function () {
this.barking = false;
};
Было добавлено три директивы 'namespace', 'import', 'export'. Все настолько просто, что думаю не требует пояснений.
Сделать более явной модульность
Это достигается с помощью директив import, export.
Полностью избежать анонимных функций, но иметь их преимущества
Если вникать в реализацию то каждый модуль оборачивается в анонимную функцию и все переменные которые не обозначены префиксом import или export глобальными не становятся. Это как раз то, чего мы хотели добиться.
На завершение
Думаю, что-то подобное уже существует и если кто-то ткнет пальцем для сравнения буду благодарен.
Код открыт здесь
Можно легко установить: npm install imex -g
Более полная инструкция по установке и запуске с примерами есть в readme.
Автор: ohmed