Что такое Flow?
Flow - это средство проверки статического типа для JavaScript. Это снижает вероятность появления ошибок, поскольку отслеживается Тип данных, проходящих через систему. (Подробнее о статических и динамических типах здесь).
Чтобы использовать Flow в Webpack, нужно подготовить 2 вещи.
- Поточный бункер
- babel-plugin-transform-flow-strip-types (для компиляции)
Flow-bin - это двоичный файл, который интерпретирует аннотации типа потока и включает проверку статического типа. Поскольку типы предназначены только для того, чтобы помочь уменьшить количество ошибок в разработке, нам нужно удалить типы, прежде чем мы отправим JavaScript в браузер. Руководство по установке предлагает установить babel-preset-flow для компиляции babel. Покопавшись в исходном коде, вы увидите, что этот пресет зависит от babel-plugin-transform-flow-strip-types
. Если у вас есть babel-preset-env, настроенный в Webpack для транспиляции JSX, хорошая новость в том, что он уже справился бы с Flow за вас! babel-preset-env включает babel-plugin-transform-flow-strip-types
в качестве одного из подключаемых модулей, поэтому нет необходимости устанавливать и настраивать babel-preset-flow.
babel-loader автоматически удаляет аннотацию потока, если задано значение 'env' или 'flow' указан в .babelrc. Никакой дополнительной настройки в webpack.config.js не требуется.
Что-то, что нужно быть осторожным с Flow
Flow также может интегрироваться с редакторами и включать линтинг на лету без необходимости flow check
на терминале отдельно. Чтобы включить Flow-Language-Support в VScode, Flow необходимо установить глобально, хотя это не рекомендуется.
У меня возникла проблема в новом проекте, где Flow продолжал жаловаться на то, что React.ComponentType не экспортируется из React, хотя я уже установил последнюю версию Flow в проекте с помощью npm. Проект Flow включает типы React, так что это вряд ли связано с обновлением React 15 до React 16…
После долгого процесса отладки я заметил, что the flow version
не последняя версия, установленная для проекта.
which flow
показывает, что использованный сервер потока был из /usr/local/bin/flow
, глобального потока… что должно было быть очевидным, поскольку команда flow
доступна только тогда, когда поток установлен глобально. В противном случае нам нужно использовать конкретный поток проекта через node_modules/.bin/flow
.
Чтобы удалить и переустановить глобальный поток
npm uninstall -g flow-bin npm install -g flow-bin
Теперь плагин потока VSCode должен работать с новым проектом. Однако может показаться, что она не работает в старых проектах, которые все еще зависят от более старой версии Flow ... Если обновление Flow в старых проектах вызывает слишком много проблем, использование проверки node_modules/.bin/flow
для конкретного проекта должно решить эту проблему на данный момент.
Примечание. Чтобы использовать двоичный поток для конкретного проекта вместо глобального потока, мы можем установить следующие настройки в VSCode.
"flow.useNPMPackagedFlow": true
Одно замечание: если что-то прямолинейное должно работать, но не работает, а документация и проблемы с stackoverflow и github не очень понятны = ›Тройная проверка версий !
Полезная техника: литье типа
Раздражающая проблема Flow, с которой я столкнулся, обычно связана с другими распространенными методами сторонней библиотеки. Например:
const hoveredDom = findDOMNode(component).getBoundingClientRect();
Первоначально Flow жалуется, что .getBoundingClientRect()
невозможно вызвать потенциально null
значение. После выполнения обычной проверки, чтобы убедиться, что findDOMNode(component)
не равно нулю, Flow жалуется, что getBoundingClientRect()
нельзя вызвать Type Text
… потому что findDomNode может возвращать любой из null | Element | Text
в соответствии с предварительно созданными типами Flow. В моем случае я знаю, что findDOMNode (component) наверняка вернет мне Element
. Чтобы ограничить возвращаемый тип только Element
, мы можем использовать Типовое преобразование через любое! Чтобы сделать тип более конкретным, мы можем использовать магический any
. Тогда поток перестает жаловаться!
const componentDom = ((findDOMNode(component): any): Element); const hoveredDom = componentDom.getBoundingClientRect();
Полезный прием: имитация типов потока
Иногда нам не нужны определения типов для используемых нами библиотек. например инструмент мониторинга производительности why-did-you-update
. В этом случае, когда Flow жалуется на “required module not found”
в этой библиотеке, мы можем смоделировать его, используя метод, указанный здесь.
// mocking file
declare module 'invariant' { declare module.exports: any; }
- Создайте фиктивный файл, например, выше
- Добавьте путь к файлу в раздел
[lib]
внутри.flowconfig
Другой метод - использовать библиотеку потокового типа для загрузки / генерации определений типов.
Другие полезные ресурсы
Используйте CSSModules с Flow.
//.flowconfig [options] module.name_mapper.extension='css' -> '<PROJECT_ROOT>/flow/CSSModule.js.flow'