Ограничить использование сценариев, определенных за пределами области RequireJS.

У меня проблема с областями (глобальными переменными/пространствами имен), которую я просто не могу исправить. Дело в том, что у меня есть устаревший код в проекте, в который я добавил новые функции с помощью Require.js. Этот устаревший код загружается с использованием стандартных тегов <script>, а новый код загружается с помощью Require. Проблема возникает, когда я добавляю Ractive.js в Require as AMD. Поскольку устаревший код загружает Prototype.js, он имеет некоторые конфликты с Ractive.js.

Основная проблема заключается в наблюдении за изменениями массива. В частности, когда я наблюдаю за массивом с помощью наблюдателя шаблонов.

ractive.observe('dataArray.*', function(newValue, oldValue, keypath) { alert(' status changed from ' + oldValue + ' to ' + newValue); }, {debug: true, init: false});

Если я не добавляю наблюдатель в массив, все работает, но если я добавляю его, я получаю ошибку undefined is not a function в прототипе.js (этого не происходит, когда я удаляю прототип.js из глобалов).

Другое дело, что это действительно работает, когда я не использую обозреватель шаблонов.

Итак, мой вопрос: есть ли способ настроить Require.js для использования только тех скриптов, которые загружаются как AMD-ы? Или, другими словами, ограничить область действия сценариев AMD только друг другом, чтобы он игнорировал глобальные сценарии?

Заранее спасибо.


person BugiLesPaul    schedule 01.05.2014    source источник
comment
Не могли бы вы дать больше информации об этих столкновениях? Вы испытываете ошибки? К сожалению, нет способа «защитить» модули AMD от глобального пространства имен.   -  person Rich Harris    schedule 01.05.2014
comment
@RichHarris Я обновил вопрос. Спасибо, что прочитали это. :)   -  person BugiLesPaul    schedule 01.05.2014


Ответы (1)


Я смог создать аналогичную ошибку, добавив на страницу старую версию Prototype.js. Я подозревал, что это из-за того, что Prototype.js добавляет нестандартные методы в Array.prototype (среди прочего). Это обычно считается Плохой вещью, потому что делает такого рода конфликты довольно вероятными в больших кодовых базах.

В частности, ошибка заключалась в том, что Ractive вызывает Array.prototype.map для строки при работе с наблюдателями шаблонов. Функция map является стандартной в ES5, но не в более старых браузерах (таких как IE8), поэтому Prototype добавляет полифилл, но в старых версиях Prototype это сломанный полифилл. Этот сломанный полифил выдает ошибку, когда вы вызываете его со строкой вместо ошибки (потому что он использует свой собственный метод this.each()) — необычная, но вполне приемлемая операция в ES5.

К счастью, похоже, что более поздние версии Prototype не сломаны таким же образом. Мне удалось воспроизвести ошибку с версией 1.6.1 (версия на их сайте документации за 2009 год), но не с последней версией 1.7.2.

Итак, у вас есть два возможных варианта:

  • Обновите прототип до последней версии
  • После загрузки Prototype переопределите неработающий метод map(). Вы можете использовать этот полифилл из MDN (убедитесь, что вы опустили проверку if (!Array.prototype.map){...}).

Из них второй, вероятно, с наименьшей вероятностью сломает код, зависящий от Prototype!

person Rich Harris    schedule 01.05.2014
comment
Спасибо большое, вы меня спасли :) - person BugiLesPaul; 05.05.2014