Интегрируйте Ext JS 4.1 MVC приложение в переписанный URL (mod_rewrite) при разработке и производстве
Создание нового приложения Ext JS 4.1.1 на основе раздела структуры файла в руководстве Sencha по архитектуре приложений MVC. В итоге получается следующая структура:
/wwwroot
/myapplication
/app
/controller
/view
app.js
/extjs-4.1.1
Файл app.js содержит:
Ext.Loader.setConfig({
enabled: true
});
Ext.application({
appFolder: '/myapplication/app',
autoCreateViewport: true,
name: 'MyApplication',
controllers: [
...
]
});
Все хорошо. Затем я включаю файл app.js для вывода в мое серверное MVC-приложение (не путать со структурой Ext JS MVC на стороне клиента). Используемый язык и структура серверного приложения не имеют значения для этого вопроса, но результат вывода. В разработке URL-адрес приложения:
http://servername/someidentifier1/someidentifier2
Как и во многих приложениях, mod_rewrite используется для придания значения идентификаторам и сопоставления URL-адреса с кодом на стороне сервера. Эти идентификаторы не отображаются на "физические" каталоги. Выход этого URL:
<!DOCTYPE html>
<html>
<head>
<title>MyApplication</title>
<link href="/extjs-4.1.1/resources/css/ext-all-debug.css" media="screen" rel="stylesheet" type="text/css" >
<script type="text/javascript" src="/extjs-4.1.1/ext-debug.js"></script>
<script type="text/javascript" src="/myapplication/app.js"></script>
</head>
<body>
</body>
</html>
Ext JS находится не в рекомендованном по умолчанию месте, а /wwwroot/myapplication/extjs-4.1.1, но вместо этого на один уровень выше, поскольку он используется несколькими приложениями. Если вы посмотрите на app.js выше, вы также заметите параметр appFolder, который необходимо установить, чтобы он работал с "несуществующим" URL.
Все это прекрасно работает при разработке, но следующим шагом является создание "сборки" кода с помощью Sencha SDK Tools (вопрос основан на версии 2.0.0 Beta 3 для Windows). Вот где это идет не так. Я делаю эти шаги:
- Командная строка Я захожу в каталог / wwwroot / myapplication.
- Я исполняю
sencha create jsb -a http://servername/someidentifier1/someidentifier2 -p myapplication.jsb3
создать файл jsb3. - Я исполняю
sencha build -p myapplication.jsb3 -d .
Сборка не удалась. В этом случае, потому что он пытается найти пользовательский код, например, для контроллеров по пути c:\...\myapplication\myapplication\app\controller: текущий путь + параметр appFolder. Можно было бы предположить, что лучше запустить его на один уровень выше, но тогда он не сможет найти каталог (shared) extjs-4.1.1.
Я предполагаю, что время сделает структуру Ext JS MVC и SDK Tools более гибкой, и немного отклоняться от структуры по умолчанию не рекомендуется. Все приемлемо, но с другой стороны: интеграция Ext JS 4.x (Ext JS в MVC-стиле) с перезаписью URL (mod_rewrite) тоже должна быть очень распространенной практикой?
Любая предложенная рабочая установка / структура будут высоко оценены.
Цели должны быть:
- Нет ручного редактирования файла jsb3.
- Сохранение каталога extjs-4.1.1 на верхнем уровне для совместного использования приложениями.
- Отсутствие файла app.html, поскольку он никогда не используется в серверных приложениях MVC и в противном случае потребовал бы обновления вручную.
- Хорошим дополнением было бы содержание app.js внутри сгенерированного HTML на стороне сервера, поскольку тогда он мог бы получать динамически генерируемые параметры.
3 ответа
Создание файла index.html для генерации файла проекта будет одним из способов. Я также обнаружил, что Sencha Architect очень жесткий и сложный в использовании. Самое неприятное, что я не могу использовать внешний редактор для редактирования сгенерированного кода. Все должно быть сделано в дизайнере, и это хорошо, если дизайнер может предоставить все необходимые мне функции. Но это не может.
Пара вещей.
Первое - вам не нужно указывать абсолютный путь для библиотеки ExtJs и для вашего приложения в загрузчике.
...
appFolder: 'app' // should be enough
...
Во-вторых, что касается различий между сборкой и производством, я получил два файла.html - index.html и index-dev.html. Эти файлы не изменяются (после их настройки), поэтому синхронизировать их не проблема.
Вы используете index-dev.html для нужд разработки, отладки, а также для процесса сборки. В основном этот файл настроен для вашей локальной среды разработки.
index.html просто использует комбинированную и сокращенную версию вашего app.js и настроен для производственного развертывания.
Используя переписывание модов вы можете использовать слегка модифицированный файл.htaccess от Symfony
<IfModule mod_rewrite.c>
RewriteEngine On
#<IfModule mod_vhost_alias.c>
# RewriteBase /
#</IfModule>
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ app.php [QSA,L]
</IfModule>
Этот файл позволит вам
- получить ресурс с сервера, если это настоящие файлы (css, js, images и т. д.)
- преобразовать части URL в параметры запроса, если в файловой системе сервера нет совпадений.
Это должно работать на вашей установке, просто измените строку app.php на точку входа вашего приложения
для установки каталогов у вас все в порядке, просто пара вещей:
ваши инструменты SDK устарели, так как вы можете скачать: http://www.sencha.com/products/sencha-cmd/download/ (v3.0.0)
Следуя документам на http://docs.sencha.com/ext-js/4-1/, вы можете получить "сборку" с нужным вам классом, но в конце или переключиться между разработками вручную. / производственный файл javascript, или вы переключаетесь с помощью переменных окружения в вашем коде.
На самом деле я думаю, что вы можете использовать "поддельный" index.html в каталоге сборки, который будет изменен инструментом сборки, а затем в производственном коде вы можете имитировать код, сгенерированный сборкой sencha.