Отключаем кэширование загружаемых RequireJS файлов при разработке

Мне нравится RequireJS. Нравятся принцип построения приложения с его использованием, то как он работает с зависимостями, его гибкость и настраиваемость. Но часто может возникать проблема при разработке на локале — кэширование ресурсов браузером (файл подправил, а изменения не отображаются, так как файл берется из кэша).

Можно, конечно, открыть консоль и поставить флаг запрещающий кэширование, можно подправить конфиг web-демона так, чтоб он запрещал кэширование, а можно пойти другим путем — заставить requirejs добавлять рандомный параметр к своим запросам, таким образом заставляя браузер не брать файл из кэша.

Для настройки requirejs я использую отдельный файл-конфигурацию, который загружается перед самой библиотекой, и содержит в себе как описания путей, зависимостей и прочие штуки — так и немного уличной магии.

Ниже будет пример его содержания в полном объеме, и думаю что комментарии тут будут излишне (ссылка на док). Такой код можно оставить работать и на продакшене без особых переживаний, но для разработки на локале есть как минимум одно очевидное ограничение — необходимо чтоб домен верхнего уровня был указан в массиве local, а так как для всех своих локальных проектов использую домен верхнего уровня dev — неудобств совсем не замечаю.

Подробнее под катом

Синглтон для RequireJS

Частенько при разработке приложения с использованием requirejs возникает необходимость в реализации паттерна синглтона. И вот, испробовав пример его реализации что описан ниже заявляю — он имеет право на жизнь. Не без своих недостатков, разумеется, но в целом вполне применибельно:

'use strict';

define([], function () {

  /**
   * Singletone instance.
   *
   * @type {OurNewSingletone|null}
   */
  var instance = null;

  /**
   * OurNewSingletone object (as singletone).
   *
   * @returns {OurNewSingletone}
   */
  var OurNewSingletone = function () {

    /**
     * Initialize method.
     *
     * @returns {}
     */
    this.init = function () {
      // Make init
    };

    // Check instance exists
    if (instance !== null) {
      throw new Error('Cannot instantiate more than one instance, use .getInstance()');
    }

    // Execute initialize method
    this.init();
  };

  /**
   * Returns OurNewSingletone object instance.
   *
   * @returns {null|OurNewSingletone}
   */
  OurNewSingletone.__proto__.getInstance = function () {
    if (instance === null) {
      instance = new OurNewSingletone();
    }
    return instance;
  };

  // Return singletone instance
  return OurNewSingletone.getInstance();

});

И после, указывая наш модуль в зависимостях — мы получаем уже готовый к работе инстанс объекта (один и тот же в разных модулях), что и требуется.