КАК: Анализировать файл конфигурации для пользовательских сборок с помощью gulp 🥛

Что я узнал из рефакторинга 🤓

Некоторые из моих проектов - CSS решения. Один конкретный проект имеет дело с коллекцией CSS анимаций. Все началось как один файл. Он рос и рос, и вскоре кто-то предложил модульность проекта.

Это логично. Но я был в раздумьях относительно того, как это сделать. Я думал просто придерживаться своих CLI инструментов, а не использовать инструмент для сборки. Я довольно много играл с gulp и вместо этого решил использовать его с рядом плагинов, чтобы улучшить рабочий процесс.

Итак, что мне нужно было сделать?

Мне нужно было разделить мой файл на несколько файлов для разных анимаций. Я хотел, чтобы каждый мог выпускать свои собственные сборки. Это указывает на некоторую форму файла конфигурации.

Итак, я создаю один.

{
   "whirls": {
      "bar": {
        "bar": true,
        "bar-follow": true
      },
      "double-up": {
        "double-up": true
      },
      "duo": {
        "duo": true
      },
      "line": {
        "line": true,
        "line-grow": true,
        "line-back-and-forth": true,
        "line-back-and-forth-grow": true
      },
      "shadow": {
        "shadow": true,
        "shadow-oval-left": true,
        "shadow-oval-right": true
      },
      "spherical": {
        "spherical-horizontal": true,
        "spherical-vertical": true
      },
      "traditional": {
        "traditional": true
      }
   }
}

Этот файл определяет, какие анимации я хочу включить при запуске сборки.

В моем gulpfile мне нужно ссылаться на эту конфигурацию всякий раз, когда я строю, чтобы строить только желаемый источник. Для этого я написал следующую функцию, которая создает массив исходных строк для использования в моей задаче сборки.

gatherSrc = function (sources, path, ext) {
  for (var src in sources ) {
   if (sources[src] === true) {
    processSrc.push('src/' + ext + '/sources/' + path + src + '.' + ext);
   } else if (Object.keys(sources[src]).length > 0) {
    var newPath = (path === undefined) ? src + '/' :path + src + '/';
    gatherSrc(sources[src], newPath, ext);
   }
  }
 };

Я вызываю эту функцию в своей задаче сборки, передавая корневой ключ конфигурации и расширение файлов, которые я хочу построить. Это потому, что у меня есть файлы scss и less , и я хочу стараться придерживаться принципа DRY как можно лучше. processSrc - это пустой массив, который определяется как содержащий только файл ядра _10 _ / _ 11_ перед тем, как мы вызываем gatherSrc в соответствующих задачах сборки для любого языка.

var config = require('./path/to/config/file');
...
//inside build task
processSrc = [‘src/style/core’];
gatherSrc(config.animations, undefined, 'scss');

Функция дает мне набор исходных строк, которые затем передаются в задачу сборки. Затем, используя такой пакет, как gulp-concat, мы можем объединить источник и передать его в задачу сборки.

Вот и все!

С относительной легкостью мне удалось провести рефакторинг, сделав его модульным и настраиваемым с помощью gulp 🥛 🎉

Как всегда, любые вопросы, предложения или если я что-то пропустил, не стесняйтесь оставлять заметку или твитнуть меня 🐦!