Показать сообщение отдельно
  #8 (permalink)  
Старый 04.04.2016, 21:03
Аватар для nohuhu
Профессор
Отправить личное сообщение для nohuhu Посмотреть профиль Найти все сообщения от nohuhu
 
Регистрация: 21.05.2015
Сообщений: 321

Сообщение от XAPuTOH Посмотреть сообщение
Все так но у меня както не так. :)
Не переживайте, это не только у вас. :) Много, очень много непоняток тянется со времён Ext JS 4.0, когда появилась система классов и динамический загрузчик. Тогда "волшебная" загрузка JavaScript файлов "сама по себе" воспринималась как могучая фича; тогда же и родились рекомендации использовать Ext.create() всегда и везде, потому что оно же волшебное - если вы случайно забыли указать класс в requires, то Ext.create() всё за вас сделает! Магия.

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

Отсюда и необходимость инструментария. Сперва Sencha SDK Tools, потом Sencha Cmd. А когда есть инструментарий, костыли навроде Ext.create() уже не нужны в принципе - потому что класс гарантированно будет существовать к моменту, когда вы попытаетесь использовать его через new Ext.Foo(). Более того, в редких случаях когда Cmd не отлавливает зависимости автоматически, Ext.create() будет стрелять вам в ногу, и очень больно, т.к. вместо легко исправимой ошибки на этапе сборки вы получите непредсказуемую ситуацию с попытками динамической загрузки файлов неизвестно откуда, да ещё и синхронно. С боевого сервера, ага.

Цитата:
Если класс существует он пытается загрузить js файл без имени.
Если не существует то имя и путь файла вполне себе нормальные.
Именно об этом я выше и писал: непредсказуемость ситуации с динамической загрузкой. Это только с первого взгляда кажется, что всё очень просто: да вот же путь к моей директории с приложением, склеить её с именем класса и загрузить, и всё! А фигвам, как насчёт разных путей для фреймворка, сторонних библиотек, ваших классов? Как насчёт случаев, когда в один файл пихают несколько классов? Откуда эту информацию брать?

В dev и test сборках эта информация содержится в объекте Ext.manifest, который создаёт Cmd. А вот в боевой сборке манифеста нет, потому что она по определению боевая и должна содержать в себе всё необходимое. Поскольку манифеста нет, то и динамический загрузчик обламывается с треском.

Цитата:
Как создавать экземпляры компонентов? Использовать new?
С new ситуация аналогичная.
Да, используйте new Ext.Foo() вместо Ext.create('Ext.Foo'). Если для сборки используете Cmd, то все пути и зависимости должны определяться автоматически - Cmd умная штука, она понимает оператор new и многие другие способы.

Если пути не определяются, то у вас что-то не то с настройками в app.json. Рекомендую копать в эту сторону.

Цитата:
Ну и за основу был взят admindashboard template. в котором используется Ext.create().
К сожалению, Ext.create() до сих пор используется очень много где. Просто потому, что большая часть примеров писалась во времена, когда Cmd ещё не было и динамическая загрузка была настойчиво рекомендована к использованию. Те времена давно прошли, но радиоактивные осадки всё ещё выпадают нам на голову. :(
Ответить с цитированием