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

в 9:14, , рубрики: javascript, метки:

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

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js