- PVSM.RU - https://www.pvsm.ru -
Вы писали крупные проекты используя JS? У вас было много объектов в объектах объектов (напр. LIB.Module.object.param)? У меня такое было часто и это вызвало довольно большое неудобство и плохой вид кода. Аналогично часто приходилось использовать анонимные функции, они выглядят не особо аккуратно.
Хотелось какого-то очень простого и аккуратного решения проблемы. Случилось так, что проект над которым я работаю имеет модуль на 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 глобальными не становятся. Это как раз то, чего мы хотели добиться.
Думаю, что-то подобное уже существует и если кто-то ткнет пальцем для сравнения буду благодарен.
Код открыт здесь [1]
Можно легко установить: npm install imex -g
Более полная инструкция по установке и запуске с примерами есть в readme [2].
Автор: ohmed
Источник [3]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/javascript/61998
Ссылки в тексте:
[1] Код открыт здесь: https://github.com/ohmed/ImEx.js
[2] readme: https://github.com/ohmed/ImEx.js/blob/master/README.md
[3] Источник: http://habrahabr.ru/post/225847/
Нажмите здесь для печати.