Ошибка №1: Непонимание жизненного цикла приложения и навигации. Разработчики, пришедшие с веба, часто пытаются управлять видимостью компонентов через `*ngIf` или `v-if`, что приводит к утечкам памяти и неправильному освобождению нативных ресурсов. В NativeScript навигация должна управляться через Frame или специфические для фреймворка методы.
Неправильно (веб-подход):
```
// В шаблоне:
// В коде: this.isVisible = true/false;
```
Правильно (NativeScript-подход):
```
import { Frame } from '@nativescript/core';
// Навигация к новой странице
Frame.topmost().navigate('pages/details/details-page');
// Или использование модального окна
page.showModal('pages/modal/modal-page', { context: data });
```
Забывать вызывать `closeModal()` или не использовать `navigateBack()` приводит к накоплению страниц в стеке.
Ошибка №2: Блокирование UI-потока тяжелыми операциями. Выполнение длительных синхронных задач (парсинг большого JSON, сложные вычисления) в основном потоке приводит к "замороженному" интерфейсу. Решение — использование Web Workers или асинхронных методов.
Неправильно:
```
function processBigData(data) {
let result = [];
for (let item of data) { // Долгий цикл
result.push(heavyCalculation(item));
}
console.log(result); // UI не отвечает во время выполнения
}
```
Правильно:
```
// В основном файле
const worker = new Worker('~/workers/data-processor.js');
worker.postMessage({ data: hugeArray });
worker.onmessage = (msg) => {
// Обновляем UI с результатами
viewModel.set('processedData', msg.data);
};
// Файл data-processor.js
self.onmessage = function(msg) {
const result = msg.data.map(item => heavyCalculation(item));
self.postMessage(result);
};
```
Ошибка №3: Неправильная работа с изображениями и ресурсами. Загрузка больших изображений без оптимизации или кэширования съедает память и трафик. Использование тега `` с прямым URL может работать медленно.
Неправильно:
```
```
Правильно (с кэшированием и обработкой ошибок):
```
```
В коде компонента:
```
import { ImageSource, fromUrl } from '@nativescript/core';
// Использование встроенного кэша
this.imageSource = fromUrl('https://server.com/large_photo.jpg');
// Или использование плагина для advanced кэширования, например, nativescript-image-cache
```
Ошибка №4: Игнорирование специфики платформ (iOS/Android). Одинаковая верстка для обеих платформ часто приводит к несоответствию гайдлайнам и странному поведению.
Пример: Кастомные тени. На Android они работают из коробки, на iOS требуют дополнительных свойств.
Неправильно (единый стиль):
```
.css:
.shadow-label {
box-shadow: 5 5 5 blue;
}
```
Правильно (платформо-специфичные стили):
```
.shadow-label {
box-shadow: 5 5 5 blue;
}
.ios .shadow-label {
/* На iOS может потребоваться дополнительная настройка слоя */
layer.shadowOpacity: 0.7;
}
```
Или использование условной логики в коде:
```
import { isIOS, isAndroid } from '@nativescript/core';
const shadowStyle = isIOS ? iosShadow : androidShadow;
```
Ошибка №5: Плохая организация структуры проекта и зависимостей. Проект быстро превращается в "спагетти-код", если не следовать рекомендациям. Частая ошибка — установка плагинов, несовместимых с текущей версией NativeScript или друг с другом.
Перед установкой плагина всегда проверяйте:
- Совместимость с вашей версией NativeScript Core (`tns info`).
- Последнюю дату обновления (активно ли поддерживается).
- Открытые issues на GitHub.
Ошибка №6: Неэффективное использование биндингов и Change Detection. Слишком частые обновления Observable-объектов или создание сложных выражений в биндингах шаблона снижают производительность.
Неправильно:
```
// Где value1 и value2 часто меняются
```
Правильно: Вычислять сложные выражения в коде и биндить уже готовую строку.
```
// В ViewModel
get fullText() {
return `${this.value1} ${this.value2} some static text`;
}
// В шаблоне
```
Используйте специализированные свойства, такие как `textChange`, для реактивности только когда это необходимо.
Ошибка №7: Неподготовленная публикация в App Store и Google Play. Ошибки в конфигурационных файлах (`App_Resources/`), неправильно подписанные сборки, отсутствие иконок нужного размера.
Обязательно проверьте:
- Все размеры иконок и splash-экранов сгенерированы для всех плотностей.
- В `AndroidManifest.xml` и `Info.plist` правильно указаны разрешения (permissions) и описано их использование.
- Для iOS: корректно настроены provisioning profiles и certificates в Xcode.
- Используйте команды `tns build android --release --key-store-path...` и `tns build ios --release` с правильными параметрами.
Комментарии (15)