ImEx.js украсит ваш код

от автора

Вы писали крупные проекты используя 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.

ссылка на оригинал статьи http://habrahabr.ru/post/225847/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *