19. Миграция старых проектов
Миграция старых SAPUI5 проектов на новые инструменты
Зачем мигрировать?
- Старые проекты часто используют устаревшие версии UI5, не поддерживают современные инструменты (TypeScript, UI5 Tooling, Fiori Tools), плохо покрыты тестами, сложны в поддержке.
- Миграция позволяет упростить поддержку, ускорить разработку, повысить качество кода и интеграцию с CI/CD.
1. Аудит текущего состояния
Пример:
Было:
- Весь код в одной папке
/webapp, все контроллеры в одной директории, нет разделения на модули. - Используется устаревший
Component-preload.js, нетui5.yaml.
Стало:
- Чёткое разделение:
/srcдля нового кода,/webappдля legacy, естьui5.yaml, структура контроллеров по папкам.
2. Переход на UI5 Tooling
Пример ui5.yaml:
specVersion: '3.0'
metadata:
name: my.legacy.app
type: application
resources:
configuration:
paths:
webapp: webapp
Команда:
npm install --save-dev @ui5/cli
ui5 build
3. Внедрение TypeScript
Было:
LegacyController.controller.js
sap.ui.define([
"sap/ui/core/mvc/Controller"
], function(Controller) {
return Controller.extend("my.legacy.app.controller.LegacyController", {
onInit: function() {
// ...
}
});
});
Стало:
NewFancyController.ts
import Controller from "sap/ui/core/mvc/Controller";
export default class NewFancyController extends Controller {
onInit(): void {
// ...
}
}
tsconfig.json — см. 14. TypeScript
4. Рефакторинг архитектуры
Было:
В каждом контроллере свои утилиты, дублирование кода.
Стало:
BaseController.ts
import Controller from "sap/ui/core/mvc/Controller";
export default class BaseController extends Controller {
showError(message: string) {
sap.m.MessageBox.error(message);
}
}
MyPage.controller.ts
import BaseController from "./BaseController";
export default class MyPage extends BaseController {
onError() {
this.showError("Что-то пошло не так");
}
}
5. Миграция UI
Было:
Кастомная таблица на XML:
<Table>
<columns>
<Column><Text text="ID"/></Column>
<Column><Text text="Name"/></Column>
</columns>
<items>
<ColumnListItem>
<cells>
<Text text="{id}"/>
<Text text="{name}"/>
</cells>
</ColumnListItem>
</items>
</Table>
Стало:
Использование SmartTable (Fiori Elements):
<smartTable:SmartTable
entitySet="Products"
tableType="Table"
useExportToExcel="true"
useVariantManagement="true"
useTablePersonalisation="true"
header="Products"
showRowCount="true"/>
6. Внедрение тестирования
Было:
Тестов нет.
Стало:
/webapp/test/unit/model/formatter.js
QUnit.module("formatter", function () {
QUnit.test("should return upper case", function (assert) {
var sText = formatter.upperCase("test");
assert.strictEqual(sText, "TEST");
});
});
E2E:
/e2e/test.spec.js (wdi5)
describe("App", () => {
it("should open the main page", async () => {
await browser.url("/");
const title = await browser.$("id=mainTitle");
expect(await title.getText()).toBe("Главная");
});
});
7. Автоматизация и CI/CD
Пример GitHub Actions workflow:
name: UI5 CI
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Install dependencies
run: npm install
- name: Build UI5 app
run: ui5 build
- name: Run unit tests
run: npm test
Best practices
- Мигрируйте поэтапно: не пытайтесь переписать всё сразу. Начните с инфраструктуры, затем переводите отдельные модули.
- Покрывайте изменения тестами: это снизит риски регрессий.
- Используйте генераторы: для новых модулей и приложений используйте yo @sap/fiori.
- Документируйте архитектурные решения: это поможет при онбординге новых разработчиков.
- Удаляйте legacy-код: не бойтесь избавляться от устаревших утилит и паттернов.
Подводные камни
Было:
Кастомный компонент, который не работает после обновления UI5.
Решение:
- Проверить changelog UI5.
- Переписать компонент с использованием стандартных API.
- Добавить тесты на критичные функции.
Полезные ссылки
Миграция — это не только про новые инструменты, но и про культуру разработки:
- Пишите тесты на каждый новый модуль.
- Используйте линтеры и автотесты.
- Документируйте архитектурные решения.
Миграция — это не разовая задача, а процесс. Чем раньше начнёте — тем проще будет поддерживать проект в будущем.