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.
ссылка на оригинал статьи http://habrahabr.ru/post/225847/
Добавить комментарий