Решение Javascript для зависимостей с произвольным порядком включает - PullRequest
2 голосов
/ 22 августа 2009

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

Проблемы становятся более сложными, когда для сценариев и зависимостей требуется более одной зависимости или файл удовлетворяет более чем одному компоненту.

Использование .js, похоже, подходит для этого, но, во-первых, отношения зависимостей должны быть известны до их загрузки, во-вторых, автор заявляет, что некоторые тесты больше не работают на Firefox. Я подозреваю, что это блокирует выполнение, что кажется немного волшебным.

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

Ответы [ 3 ]

2 голосов
/ 24 июля 2010

Существует несколько подходов для решения вашей проблемы, почти все подходы в этой Javascript Dependency Management презентации.

Тот, кто лучше решает вашу проблему, использует библиотеку jingo.

В основном с jingo¹ вы можете сделать что-то вроде этого, чтобы объявить модуль с зависимостями:

  jingo.declare({
    require: [
      'hallmart.Greeter'
    ],
    name: 'hallmart.Store',
    as: function() {
      hallmart.Store = function() {
        var greeter = new hallmart.Greeter();
        this.admit = function(customer) {
          greeter.welcome(customer.name);
        };
      };
   }
 });

См. Code.google.com/p/jingo/wiki/GettingStarted для справок.

¹ code.google.com/p/jingo/

2 голосов
/ 22 августа 2009

Порядок тегов сценариев в DOM может быть неправильным, если для зависимостей разрешено требовать больше зависимостей и манифестировать их после загрузки.

Ну, что это за скрипты, которые пытаются загрузить свои собственные зависимости? Это не стандартная функция JavaScript, поэтому нет одного ответа; то, как вы справляетесь с этим, зависит от сценария, который пытается включить зависимости.

Для синхронно загружаемых сценариев (включаемых через document.write или добавление элементов сценария в DOM во время загрузки) вы можете, по крайней мере, быть уверенным, что вы хороши для загрузки. Для асинхронной загрузки (отложенные сценарии, включение AJAX или готовые обратные вызовы по таймауту) должен быть механизм обратного вызова. Если вы смешиваете различные сценарии, которые имеют разные системы зависимостей и готовых обратных вызовов, это будет проблемой.

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

Нет, не совсем. Обработка зависимостей и динамическая вставка скриптов всегда будут немного сложными. Единственный «решенный», стандартный подход - это полностью статические сценарии, которые пишутся вручную в порядке зависимости.

0 голосов
/ 16 августа 2011

Я предвзят, но недавно я создал менеджер зависимостей javascript под названием Pyramid . Он похож на другие менеджеры зависимостей (и, вероятно, похож на тот, который вы создали), за исключением нескольких ключевых функций.

  1. Он может загружать любой файл, не только javascript, и позволяет вам определить, как этот файл включен на вашей веб-странице. Во время разработки я использую его для загрузки не только моих javascript и css файлов, но и вставляю html на мою главную страницу. Это позволяет мне хранить мои представления html отдельно (что отлично подходит для таких библиотек, как knockout)
  2. Объединяет ваши файлы, когда пришло время для выпуска.
  3. Написан полностью в javascript, поэтому настройка проста. Вам не нужно беспокоиться о внешних инструментах.
  4. Вам нужно только один раз установить скрипт включения для всех ваших html-файлов. После этого все файлы можно обновлять в одном файле загрузчика зависимостей (вместо того, чтобы постоянно обновлять включаемые файлы во всех заголовках при переименовании, удалении или добавлении сценариев)

Документация менеджера зависимостей Pyramid

Пример кода, показывающий, как он работает во время разработки.

Файл: dependencyLoader.js

//Set up file dependencies
Pyramid.createOrUpdate({
    name: 'standard',
    files: [
    'standardResources/jquery.1.6.1.min.js'
    ]
});

Pyramid.createOrUpdate({
name:'lookAndFeel',
files: [
    'styles.css',
    'customStyles.css'
    ]
});

Pyramid.createOrUpdate({
name:'main',
files: [
    'createNamespace.js',
    'views/buttonView.view', //contains just html code for a jquery.tmpl template
    'models/person.js',
    'init.js'
    ],
    dependencies: ['standard','lookAndFeel']
});

HTML-файлы

<head>
    <script src="standardResources/pyramid-1.0.1.js"></script>
    <script src="dependencyLoader.js"></script>
    <script type="text/javascript">
        Pyramid.load('main');
    </script>
</head>
...