Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 01.04.2016, 09:43
Аспирант
Отправить личное сообщение для XAPuTOH Посмотреть профиль Найти все сообщения от XAPuTOH
 
Регистрация: 17.12.2012
Сообщений: 63

Опять у меня непонятки с билдом
В общем есть проект.

В development все отлично работает(использую app watch)
Делаю app build production. Все отлично компилируется.

Запускаю приложение.
Рисуется интерфейс. все хорошо.
далее пытаюсь запустить функционал системы. т.е. например жму кнопку которая должна сделать и добавить в существующую таб панель вкладку

Примерно так:
newView = Ext.create('Admin.view.modeulename.Main');
mainCard.add(newView)


Так вот выяснилось что в продакшене код:
Ext.create('Admin.view.modeulename.Main');


Вызывает ошибку: http://localhost/.js 404 (Not Found)
Т.е. вместо Admin.view.modeulename.Main у меня почемуто пустота.

И так с любым Ext.create()

Если в консоли набирать Admin.view.... то хром все видит и знает. т.е. предлагает дополнить.

Ктонибудь сталкивался с таким? куда копать ума не приложу
Ответить с цитированием
  #2 (permalink)  
Старый 01.04.2016, 09:51
Аватар для Infarch
Профессор
Отправить личное сообщение для Infarch Посмотреть профиль Найти все сообщения от Infarch
 
Регистрация: 06.06.2014
Сообщений: 292

В Application.js:

requires: ['Admin.view.modeulename.Main']
Ответить с цитированием
  #3 (permalink)  
Старый 01.04.2016, 10:16
Аспирант
Отправить личное сообщение для XAPuTOH Посмотреть профиль Найти все сообщения от XAPuTOH
 
Регистрация: 17.12.2012
Сообщений: 63

Да вроде как стоит
requires: [
        'Admin.*'
    ],


Ну и как я уже сказал. Если в консоле набирать Admin.View и т.д. то видно что браузер знает такой этот компонент и по логике он уже должен быть загружен.

Тут как будто просто стирается текст Admin.view.modeulename.Main
Потому как он пытается загрузить localhost/.js
Ответить с цитированием
  #4 (permalink)  
Старый 01.04.2016, 12:04
Аспирант
Отправить личное сообщение для XAPuTOH Посмотреть профиль Найти все сообщения от XAPuTOH
 
Регистрация: 17.12.2012
Сообщений: 63

Нашел еще одну особенность.
Если я вместо Admin.view.modeulename.Main напишу Admin.view.modeulename.Mainsd

То ошибка таже. но пишет уже подругому:
localhost/app/view/objects/Mainsd.js 404 (Not Found)
Ответить с цитированием
  #5 (permalink)  
Старый 01.04.2016, 15:32
Аватар для Infarch
Профессор
Отправить личное сообщение для Infarch Посмотреть профиль Найти все сообщения от Infarch
 
Регистрация: 06.06.2014
Сообщений: 292

"modeulename" - тут нет опечатки? Так и должно быть?
Ответить с цитированием
  #6 (permalink)  
Старый 01.04.2016, 21:24
Аватар для nohuhu
Профессор
Отправить личное сообщение для nohuhu Посмотреть профиль Найти все сообщения от nohuhu
 
Регистрация: 21.05.2015
Сообщений: 321

Когда вы вызываете Ext.create() на несуществующий класс, динамический загрузчик попытается найти и загрузить этот класс синхронным Ajax запросом. Это работает в отладочном режиме; в боевой сборке динамический загрузчик отключен и вы видите то, что наблюдаете.

Две рекомендации: прописывайте иерархию в requires и не используйте Ext.create(), никогда. Оно есть зло.
Ответить с цитированием
  #7 (permalink)  
Старый 02.04.2016, 06:04
Аспирант
Отправить личное сообщение для XAPuTOH Посмотреть профиль Найти все сообщения от XAPuTOH
 
Регистрация: 17.12.2012
Сообщений: 63

Все так но у меня както не так.
Если класс существует он пытается загрузить js файл без имени.
Если не существует то имя и путь файла вполне себе нормальные.

Как создавать экземпляры компонентов? Использовать new?
С new ситуация аналогичная.

Ну и за основу был взят admindashboard template. в котором используется Ext.create().
Ответить с цитированием
  #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 ещё не было и динамическая загрузка была настойчиво рекомендована к использованию. Те времена давно прошли, но радиоактивные осадки всё ещё выпадают нам на голову. :(
Ответить с цитированием
  #9 (permalink)  
Старый 05.04.2016, 09:22
Аспирант
Отправить личное сообщение для XAPuTOH Посмотреть профиль Найти все сообщения от XAPuTOH
 
Регистрация: 17.12.2012
Сообщений: 63

Спасибо за столь подробный развернутый ответ!

Очень нужная информация!

Будем переделывать на new!
Ответить с цитированием
  #10 (permalink)  
Старый 05.04.2016, 10:33
Аватар для Infarch
Профессор
Отправить личное сообщение для Infarch Посмотреть профиль Найти все сообщения от Infarch
 
Регистрация: 06.06.2014
Сообщений: 292

Раз тут зашел такой разговор, то можно и я вклинюсь? Вот есть функция widget (http://docs.sencha.com/extjs/5.1/5.1...-method-widget). По документации, это хелпер для Ext.create. Вопрос: а стоит ли тогда этот виджет использовать?
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
HELP!!! У меня проблема с соц. сетью Вконтакте, причиною является "JavaScript error" Mixa Общие вопросы Javascript 1 14.07.2012 14:42
Простой сценарий определения текущего времени у меня в браузере почему-то не работает WitaliG Общие вопросы Javascript 2 02.08.2010 22:05