1. Создание проекта React-Native с использованием CRNA EXPO

Установите инструмент EXPO’s Create-React-Native-App (CRNA).

$ yarn global add create-react-native-app

Откройте терминал и перейдите в нужную рабочую папку. Выполните команду ниже, чтобы создать новый проект React-Native:

create-react-native-app CRNAExpoTSExample

С помощью приведенной выше команды CRNA создаст для вас очень простое, но готовое к запуску приложение, поддерживающее реакцию. После создания приложения перейдите в папку проекта созданного приложения и убедитесь, что базовое исходное приложение, созданное с помощью CRNA, работает.

cd CRNAExpoTSExample
yarn start

Откройте приложение на своем мобильном устройстве

Загрузите приложение Expo на свой мобильный телефон (Android или iPhone). Откройте приложение Expo и выберите опцию «Сканировать QR-код». Убедитесь, что ваша машина для разработки и мобильный телефон подключены к одной и той же сети Wi-Fi.

Отсканируйте приведенный выше QR-код в приложении Expo (версия 26.0.0 и выше, Expo больше не поддерживается опция сканирования на iPhone, вы все равно можете сканировать QR-код с камеры iPhone, и вам будет предложено открыть его с помощью приложения Expo). Теперь наше приложение должно открыться на вашем телефоне:

Запуск модульных тестов

Также убедитесь, что скаффолд модульного теста CRNA в папке проекта работает: yarn test

2. Добавление машинописного текста

Установка зависимостей

yarn add typescript tslint -D
yarn add @types/react @types/react-native @types/react-dom -D

Нам также понадобятся rimraf и concurrently для очистки выходной папки от файлов ts-transpiled-to-js и одновременного запуска сценариев npm.

yarn add concurrently rimraf -D

Для написания юнит-тестов jest в машинописном тексте нам понадобится ts-jest. Также мы установим defs типов для рендереров jest и react test.

yarn add ts-jest @types/jest @types/react-test-renderer -D

Настройка

Настройте файл конфигурации Typescript tsconfig.json с помощью команды tsc или просто создайте файл вручную в папке проекта.

tsc --init

(Если команда tsc не работает, например, tsc command not found, проверьте, установлен ли у вас машинописный текст глобально и /node/bin в вашей $PATH var - см. Https://stackoverflow.com/a/37092975 или Https://stackoverflow.com/a/37117612 или https://stackoverflow.com/a/46222888)

tsconfig.json

Откройте проект в редакторе кода и обновите tsconfig.json, как показано ниже.

Обратите внимание на настройки rootDir и outDir (строка № 6-7) выше.

Мы хотели бы, чтобы все файлы кода нашего приложения typescript находились в папках / подпапках в папке src. С “rootDir”: “src компилятор Typescript будет искать все файлы .ts или .tsx в папке src и ее подпапках.

“outDir”: “build” означает, что машинописный текст будет выводить переведенные файлы javascript в папку build.

Также обратите внимание на свойство “exclude” выше (строки 31–36), сюда можно добавить любые файлы или папки js, которые вы хотите, чтобы машинописный текст игнорировал.

Добавьте tslint.json

Добавьте файл tslint.json в папку проекта, скопировав его содержимое отсюда.

Создайте папки src и build

Поскольку мы настроили src и build как rootDir и outputDir в tsconfig.json, создайте эти папки в корневой папке нашего проекта.

Когда мы создали проект с помощью команды CRNA (create-react-native-app CRNAExpoTSExample), она добавила App.js и App.test.js в нашу папку проекта. Переместите эти файлы в созданную нами папку src, переименуйте App.js и App.test.js в App.tsx и App.test.tsx соответственно. Папка и файлы проекта на этом этапе должны выглядеть примерно так:

Добавьте еще несколько скриптов в package.json

Когда мы создали проект выше с помощью команды CRNA, package.json файл, который он создал в папке проекта с шаблоном, будет иметь следующие сценарии:

...
"scripts": {
   "start": "react-native-scripts start",
   "eject": "react-native-scripts eject",
   "android": "react-native-scripts android",
   "ios": "react-native-scripts ios",
   "test": "node node_modules/jest/bin/jest.js"
}
...

Теперь мы добавим еще несколько скриптов для выполнения наших задач по компиляции машинописного текста, созданию сборки и запуску нашего приложения:

Мы бы добавили вышеуказанные скрипты в наш раздел скриптов package.json. Это объясняется ниже:

Полную версию package.json можно найти здесь.

Добавление App.js в корневую папку проекта

Если вы заметили, что в package.json файле, который был изначально создан CRNA, «основная» точка входа для приложения установлена ​​на:

"main":"./node_modules/react-native-scripts/build/bin/crna-entry.js"

Это означает, что наше приложение запускается с этого файла crna-entry.js. Откройте этот файл, и вы обнаружите, что он ссылается на наш App.js файл:

var _App = require('../../../../App');

Это означает, что ожидается модуль приложения в App.js файле в корневой папке проекта. Однако мы переместили исходный App.js файл в папкуsrc. Также имейте в виду, что компилятор машинописного текста выведет преобразованный файл ts-to-js в папку build.

Итак, чтобы CRNA работала с нашей измененной структурой папок и конфигурацией машинописного текста, давайте добавим файл App.js в папку проекта, который будет просто экспортировать наш компонент приложения в src/App.tsx, который компилятор машинописного текста выведет в папку build.

Создайте App.js файл в корневой папке проекта с кодом ниже:

import App from './build/App';
export default App;

Добавьте App.js в массив exclude tsconfig.json

Добавьте созданный выше App.js файл в массив exclude tsconfig.json, чтобы машинописный текст игнорировал этот файл.

3. Запустите приложение.

Теперь мы готовы запустить наше приложение для машинописного текста. Выполните команду:

yarn run buildAndStart

Эта команда запустит buildAndStart скрипт, который мы создали в нашем package.json файле выше, очистит папку build и выведет переведенные файлы машинописного текста в папку build и запустит проект. Как и раньше, вы увидите, что CRNA генерирует QR-код на вашем терминале, который вы можете сканировать из приложения EXPO на вашем Android / iPhone, и увидите, что наше приложение работает на устройстве.

Внесите некоторые изменения в App.tsx, чтобы увидеть, как в реальном времени выполняется перезагрузка, чтобы обновить приложение на вашем устройстве с отображением последних изменений. (Обновление может занять некоторое время в первый раз.)

(Если у вас есть репозиторий git для папки проекта, добавьте /build в .gitignore, так как нам не нужно отправлять файлы сборки в git. Также добавьте “build” в массив exclude tsconfig.json для машинописного текста, чтобы файлы в этой папке игнорировались.

4. Настройте тесты Jest Unit для использования машинописного текста.

Мы установили пакет ts-test, чтобы мы могли писать наши модульные тесты Jest с использованием машинописного текста.

Добавьте новый файл jest.config.js в папку проекта

👆В настройке testRegex выше мы указываем искать любой файл в папке __test__ или любой файл .test или .spec в папке / src /. Мы поместим весь исходный код нашей разработки в папку src, а файл спецификации / теста будет помещен во вложенные папки в src вместе с ресурсом / компонентом.

Добавьте jest.config.ts в массив exclude tsconfig.json

Добавьте jest.config.ts в массив exclude tsconfig.json, чтобы машинописный текст игнорировал этот файл.

Настройте ts-jest для обработки синтетического импорта

CRNA использует синтетический импорт по умолчанию в файле компонента приложения, который он создает при формировании проекта. Таким образом, вы увидите, что React импортирован, как показано ниже, в App.tsx

import React from 'react';

Чтобы ts-jest обрабатывал синтетический импорт по умолчанию, убедитесь, что у вас есть следующая конфигурация:

  1. В tsconfig.json убедитесь, что у вас есть "allowSyntheticDefaultImports": true в compilerOptions.
  2. Убедитесь, что у вас установлен трансформатор для обработки перенесенных файлов jsx с помощью bable-test:
module.exports = {    
    "transform": {        
        "^.+\\.jsx?$": "<rootDir>/node_modules/babel-jest",
        "^.+\\.tsx?$": "ts-jest"    
     },
     ....
     ....
}

Запуск модульного теста

Запустите тест и убедитесь, что он работает должным образом: yarn test.

👏 Ура !! Мы настроили машинописный текст для разработки нашего приложения Expo React-Native и модульных тестов.

В следующем посте мы создадим быстрый и простой компонент и его модульный тест, чтобы убедиться, что эта конфигурация Typescript, которую мы сделали для нашей EXPO CRNA выше, работает хорошо, поскольку мы добавим больше компонентов в наше приложение.