Мы начинаем с разработки через тестирование с помощью React и заканчиваем статической типизацией с помощью Flow.
Эта статья является частью серии, начинающейся с Укрепление сборки React: Часть 1, в которой рассматриваются решения для создания более поддерживаемых интерфейсных приложений.
Jest and React
Мы следуем документации по включению Jest и React.
yarn add --dev babel-jest react-test-renderer
Поскольку babel-jest использует Babel, нам нужно извлечь конфигурацию Babel, которая находится в webpack.config.js (и удалите там дублирующую конфигурацию).
./.babelrc
{ "presets": ["es2015", "react"], "plugins": ["syntax-dynamic-import"] }
Теперь, когда Jest включен для React, мы следуем их примеру, сначала создавая интерактивный компонент React: Link и используя его в нашем приложении React. .
./src/index.jsx
import 'babel-polyfill'; import React from 'react'; import { render } from 'react-dom'; import sum from './sum'; import Link from './Link'; render( <div> <div>Hello World</div> <div>1 plus 2 equals {sum(1, 2).toString()}</div> <Link page="https://www.google.com">Google</Link> </div>, document.getElementById('root'), );
Продолжая следовать их примеру, мы создаем тестовый снимок для Link. Актуальный тест.
Опять же, в этой серии статей лишь кратко рассматривается разработка через тестирование с помощью React.
Поток
Как и при разработке через тестирование, мне еще предстоит внедрить статическую типизацию с помощью JavaScript. В качестве фона проверка статического типа позволяет выявлять такие ошибки, как…
function square(n) { return n * n; // Error! } square("2");
во время компиляции, а не во время выполнения. По сути, цель статической типизации:
Устали запускать код для поиска ошибок? Flow выявляет проблемы по мере того, как вы пишете код. Перестаньте тратить время на догадки и проверки.
- Команда Flow
Как и многие вещи JavaScript сегодня, Facebook предоставляет решение, которое позволяет статическую типизацию; называется Flow. Он обеспечивает простой переход к статической типизации с помощью JavaScript.
примечание: еще одно популярное, хотя и более сложное решение - TypeScript.
В этой серии статей мы просто включим Flow в процесс сборки, чтобы мы могли использовать его, если решим использовать его позже.
Следуя инструкциям, мы начинаем с установки зависимостей разработки.
yarn add --dev babel-preset-flow flow-bin
примечание: нам не нужен babel-cli (в документации), поскольку мы используем webpack для запуска Babel транспиляция нашего JavaScript.
Нам нужно включить Babel с возможностью обработки дополнительного синтаксиса Flow с обновленным файлом конфигурации Babel.
./.babelrc
{ "presets": ["es2015", "react", "flow"], "plugins": ["syntax-dynamic-import"] }
Нам также необходимо обновить ESLint для обработки дополнительного синтаксиса Flow с использованием eslint-plugin-flowtype, добавив следующие дополнительные зависимости разработки.
yarn add --dev babel-eslint eslint-plugin-flowtype
Нам нужно обновить конфигурацию ESLint следующим образом:
./.eslintrc
{ "parser": "babel-eslint", "env": { "browser": true, "jest/globals": true }, "extends": [ "airbnb", "plugin:jest/recommended", "plugin:flowtype/recommended" ], "plugins": [ "jest", "flowtype" ] }
примечание: babel-eslint используется в качестве синтаксического анализатора ESLint по умолчанию, который не может обрабатывать синтаксис Flow.
Наконец, мы инициализируем Flow, введя:
yarn run flow init
Flow работает путем запуска отдельной службы для вашего исходного кода; начато:
yarn run flow
и остановился с
yarn run flow stop
Стандартный (и утомительный) механизм получения отчета об ошибках - запустить команду
yarn run flow status
Однако пакет flow-status-webpack -plugin позволяет webpack сначала запускаться, а затем автоматически сообщать о статусе Flow для каждой сборки :
yarn add --dev flow-status-webpack-plugin
И обновление:
./webpack.config.js
... const CleanWebpackPlugin = require('clean-webpack-plugin'); const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; const FlowStatusWebpackPlugin = require('flow-status-webpack-plugin'); ... new BundleAnalyzerPlugin(), new FlowStatusWebpackPlugin({ failOnError: true, }), ],
Со всем этим мы можем использовать Flow.
./src/sum.js
// @flow function sum(a: number, b: number): number { return a + b; } module.exports = sum;
примечание: Facebook предоставляет расширение (Nuclide) для редактора Atom, которое поддерживает отображение Flow статус в редакторе.
Подведение итогов
После написания этой серии статей я обнаружил, что начинаю тосковать по дням написания интерфейсных приложений только с помощью jQuery. Но затем я быстро вспоминаю о головной боли, связанной с поиском проблем в сложных приложениях, которые эти новые инструменты призваны устранить.
Хотя это может быть банально, я не мог удержаться от напоминания себе, что «это не JavaScript твоего отца».