Я собираюсь круглыми кругами, пытаясь понять RequireJS и как использовать его для загрузки зависимостей, которые НЕ отображаются как неопределенные, когда я пытаюсь их использовать в модулях.Определение зависимости jQuery для модуля с Durandal в HotTowel SPA
Я начал с курса Pluralsight «SPA с HTML5» Джона Папы. Я никогда не понимал, почему существует необходимость указывать каждую библиотеку в теге скрипта, который входит в комплект, когда я думал, что вся суть AMD в requireJS заключается в том, что вы передали ей ответственность и ее основной атрибут данных для асинхронной загрузки что требовалось. Что было вдвойне запутанным в решении, представленном в этом курсе, так это то, что он не соответствовал всей основной базе данных, задокументированной в документации RequireJS.
Перейдите на несколько месяцев, и теперь у нас есть шаблон «Горячее полотенце» с Durandal, образец «сервисного» модуля, настройка, которая следует за документацией RequireJS и довольно простым для понимания стартовым приложением. Единственное, что звучит будильником, - это идея, что большинство библиотек находятся в обычной папке «сценарии», а Durandal находится в полностью отдельной папке «приложение» вместе с логикой приложения. Если я узнал одну вещь из курса SPA SPA и играя с requireJS, это то, что перемещение материала из одной папки происходит очень быстро.
Во всяком случае, новый шаблон отлично работает. Зависимости модулей отлично работают, Views и ViewModels являются обязательными, и есть пример модуля logger с зависимостью модуля от модуля Durandal (то есть в папке приложения), который отлично работает. Нужно просто добавить еще один простой модуль, который использует jQuery и mockJson на основе кода, который находится в шаблоне Hot Towel, не так ли? Эрр, нет, не совсем.
Вот очень простая декларация для начала моего модуля «dataservice.js» внутри "приложения/службы папки
define(['jquery'],
function ($) {
var init - function....
я, конечно, получить«Неопределенную»за $ при попытке доступа и это в моем кодовом блоке. Таким образом, после прочтения слишком много запутанной литературы (большая часть которых заканчивается с комментарием, чтобы сказать: «Это изменилось в JQuery хххх так не имеет значения больше») я следующие вопросы:
Когда монитор в сетевом трафике я вижу, что библиотека jQuery загружается правильно, как и mockJSON, если я добавляю ее в пакет поставщика, определенный в BundleConfig.cs. Итак, jQuery существует и ждет в моем браузере, даже если я не дал это само определение модуля. Для того, чтобы избавиться от «Неопределенные» ссылки в моем модуле документации представляется, означает, что мне нужно добавить что-то вроде следующего:
require.config({ paths: { 'text': 'durandal/amd/text', jquery: '../Scripts/jquery-1.9.1' } });
(. «Текст» декларация уже была там, я просто добавил Jquery псевдоним) Это заставляет мой модуль иметь функцию, а не «неопределенную», которая решает часть проблемы, за исключением того, что она вызывает вторую копию скрипта, который я уже видел, загруженный из-за пакета поставщиков шаблонов Hot Towell. Я не хочу загружать две копии jQuery по понятным причинам, так как я могу это исправить?
Я добавил библиотеку mockJSON к своему «поставщику», и это обычно называют использованием $ .mockJSON. Я не могу ничего сделать, чтобы сделать это действительным. Даже если я взломаю ссылку на скрипт, используя тот же процесс, который я сделал для jquery с объявлением require.config ({paths: ', я становлюсь неопределенным, не говоря уже о том, что проблема «библиотека загружается дважды» уже упоминалась Как я могу определить зависимость библиотеки, чтобы мое использование этой библиотеки в модуле работало?
Я предполагаю, что вся эта боль связана с тем фактом, что requireJS заключается в загрузке асинхронных модулей, но jQuery и mockjson являются синхронными, поэтому я должен загрузить их другими способами (связывание жестко закодированной ссылки), но это все равно означает, что мои модули requireJS нуждаются в том, чтобы указать их как зависимости, и ничто из того, что я пробовал, работает. Является ли мое предположение об этом синхронности/асинхронной проблеме правильной? Я надеялся найти хотя бы одно примерное приложение в Durandal, которое использовало jQuery и, в идеале, плагин jquery, но все, что я вижу, это код модуля, который использует модули Durandal, а не что-либо еще. Тот факт, что все эти библиотеки находятся за пределами основного корня для requireJS, вероятно, усугубляет проблему, поскольку мне приходится прибегать к путям с строками «../» в них, чтобы получить ссылки. Кто-нибудь знает, почему эта структура «всех библиотек, кроме Durandal, находится в одной папке, но существует Durandal в полной полной»?
Я понимаю, что requireJS использует «соглашение по конфигурации» в команде define, поэтому, если я пропустил идентификатор модуля, тогда он принимает идентификатор на основе имени исходного файла и пути из указанной корневой папки, указанной с использованием данных -главный. Однако Дюрандал ссылается на модуль, называемый «вход» в его коде. Этот модуль находится не в корневой папке, а в папке под названием «Durandal/transition/entry.js», поэтому я смущен тем, что любая ссылка на нее - «вход», а не «Durandal/переходы/вход». Где он псевдоним?
И наконец (hoorah) Я не понял тонкости разницы между заданием зависимостей в качестве первого аргумента (строкового массива) с инструкцией define и отсутствием этих зависимостей, а затем на фабрике модулей, которая становится первым аргументом указав что-то вроде var system = require ('../ system') - почему я должен использовать одну форму, предпочитая другую. Я вижу, что два типа смешиваются по образцу приложения и не понимают, почему.
P.S.: Когда я редактирую эту запись, я вижу пять вопросов с номерами от 1 до 5. Когда я ее просматриваю, я вижу, что она отображается как 1, а затем от 1 до 4. Некоторые странные HTML-редактор против ошибки отображения, что независимо от того, какое форматирование я пытаюсь, t были в состоянии исправить, поэтому, пожалуйста, разместите любые комментарии, как если бы у вас было пять вопросов с номерами от 1 до 5, а не с 2 пронумерованными 1 и тремя пронумерованными от 2 до 4!)
Спасибо за ссылку. Хорошо знать, что у нас могут возникнуть проблемы с нокаутом, если мы не будем следовать подходу, обсуждаемому в этой теме. У меня есть работа с решением, которое я опубликую сейчас. –
Если вы загружаете сторонние модули спереди, вам не нужно беспокоиться о том, чтобы определить для них. Когда они загружаются, они не знают о необходимости (потому что он загружается после этого), поэтому они просто загружаются в глобальное пространство. И если вы используете их много (например, $ и ko), тогда все в порядке. Если вы будете смешивать и сочетать, да, это может быть неудобно. Но нет причин смешивать и сопоставлять некоторые сторонние библиотеки в AMD, а некоторые нет. Конечно, вы можете использовать все библиотеки с AMD (и прокладки, которые не поддерживают его), как это было в Code Camper. Но в реальных приложениях вы найдете проблемы, поэтому интересна конфигурация для CodeCamper. –
Спасибо, Джон. Я действительно думаю, что для следующего курса SPA вам нужно больше объяснений. –