优雅地使用TypeScript开发React Native应用
栏目: JavaScript · 发布时间: 5年前
内容简介:从React Native 0.57 版本开始,我们终于可以直接使用 TypeScript 开发,不需要任何额外的配置。本文主要介绍如何使用 TypeScript 优雅地开发 React Native 应用。初始化项目之前,请确保已经按照React Native 中文网 的搭建开发环境文档完成了环境搭建注意: 入口文件
从React Native 0.57 版本开始,我们终于可以直接使用 TypeScript 开发,不需要任何额外的配置。本文主要介绍如何使用 TypeScript 优雅地开发 React Native 应用。
初始化项目
初始化项目之前,请确保已经按照React Native 中文网 的搭建开发环境文档完成了环境搭建
$ react-native init AwesomeProject 复制代码
注意: 入口文件 index.js
需要保留,其他文件都可以使用 .ts
或 .tsx
后缀。
TypeScript编译器
$ yarn global add typescript $ yarn add -D typescript 复制代码
配置 tsconfig.json
$ tsc --init --pretty --target esnext --allowJs --checkJs --jsx react-native --allowSyntheticDefaultImports --experimentalDecorators --emitDecoratorMetadata 复制代码
注意:注意多余的注释可能会不兼容,需要移除,详细文档可查阅编译选项。
配置文件
{ "compilerOptions": { "target": "esnext", "module": "commonjs", "allowJs": true, "checkJs": true, "jsx": "react-native", "strict": true, "allowSyntheticDefaultImports": true, "esModuleInterop": true, "experimentalDecorators": true, "emitDecoratorMetadata": true }, "exclude": ["node_modules"] } 复制代码
解释:
-
target
: 指定ECMAScript目标版本 "ES3"(默认),"ES5","ES6"/"ES2015","ES2016","ES2017","ES2018", "ES2019" 或 "ESNext"。 -
mode
: 指定生成哪个模块系统代码:"None","CommonJS","AMD","System","UMD","ES6", "ES2015" 或 "ESNext"。 -
allowJs
: 允许编译javascript文件。 -
checkJs
: 在.js
文件中报告错误。与--allowJs
配合使用。 -
jsx
: 在 .tsx文件里支持JSX: "react"、"react-native"或 "preserve"。查看JSX。 -
strict
: 启用所有严格类型检查选项。启用--strict
相当于启用--noImplicitAny
,--noImplicitThis
,--alwaysStrict
,--strictNullChecks
和--strictFunctionTypes
和--strictPropertyInitialization
。 -
allowSyntheticDefaultImports
: 允许从没有设置默认导出的模块中默认导入。这并不影响代码的输出,仅为了类型检查。 -
esModuleInterop
: TypeScript与Babel采取了不同的方案,并且直到现在,还没出现真正地固定标准。 简单地说,如果你使用Babel,Webpack或React Native,并期望与你以往使用地不同的导入行为,TypeScript提供了该编译选项。 -
experimentalDecorators
: 启用实验性的ES装饰器。 -
给源码里的装饰器声明加上设计类型元数据。
: 给源码里的装饰器声明加上设计类型元数据。
@types/react、@types/react-native
为了提高开发效率和避免 typescript 类型检查报错,你需要添加这两个类型声明库。
$ yarn add @types/react @types/react-native -D 复制代码
EsLint 代码检测
Lint工具用于检查代码的语法是否正确、风格是否符合要求。最新的工具ESLint不仅允许你自定义语法规则,还允许用户创造插件,改变默认的JavaScript语法,比如支持ES6和JSX的语法。
VsCode 支持
安装 ESLint Plugin
配置 ESLint Plugin
eslint.validate eslint.autoFixOnSave
{ "eslint.validate": [ "javascript", "javascriptreact", { "language": "typescript", "autoFix": true }, { "language": "typescriptreact", "autoFix": true }, { "language": "vue", "autoFix": true }, { "language": "html", "autoFix": true } ], "eslint.autoFixOnSave": true, } 复制代码
项目配置
注意:配置之前请确保根目录下存在 .eslintrc.js
。如果要指定忽略某些文件,可以使用 .eslintignore
文件(node_modules、bower_compnents 文件夹已经默认被忽略)
$ yarn add -D eslint eslint-config-airbnb eslint-plugin-jsx-a11y eslint-plugin-import eslint-plugin-react eslint-plugin-react-native @typescript-eslint/parser @typescript-eslint/eslint-plugin eslint-import-resolver-typescript 复制代码
- eslint: 可组装的JavaScript和JSX检查工具
- eslint-config-airbnb: 该软件包提供Airbnb的
.eslintrc
作为可扩展的共享配置 - eslint-plugin-jsx-a11y : 用于JSX元素的可访问性规则的静态AST检查器。
- eslint-plugin-import: 此插件旨在支持ES2015 +(ES6 +)导入/导出语法的linting。
- eslint-plugin-react: ESLint React 校验规则插件
- eslint-plugin-react-native : 针对ESLint的React Native特定linting规则
- @typescript-eslint/parser : 将 TypeScript 转换为 ESTree,使 eslint 可以识别
- @typescript-eslint/eslint-plugin : 一个包含一堆特定于TypeScript的ESLint规则的插件
- eslint-import-resolver-typescript : 给 eslint-plugin-import 添加 typescript 支持的插件
配置文件
module.exports = { env: { es6: true, node: true, jest: true, 'react-native/react-native': true, }, extends: [ 'airbnb', 'plugin:react-native/all', 'plugin:@typescript-eslint/recommended', ], parser: '@typescript-eslint/parser', parserOptions: { ecmaFeatures: { jsx: true, impliedStrict: true, }, ecmaVersion: 2018, project: './tsconfig.json', sourceType: 'module', }, plugins: [ 'import', 'react', 'react-native' ], settings: { 'import/resolver': { typescript: {}, }, }, rules: { 'global-require': 0, 'linebreak-style': [2, 'unix'], 'no-console': [ 'error', { allow: ['warn', 'error', 'info', 'log'], }, ], 'lines-between-class-members': [ 2, 'always', { exceptAfterSingleLine: true, }, ], 'no-use-before-define': [ 2, { functions: true, classes: true, variables: false, }, ], 'prefer-destructuring': [ 2, { array: false, object: true, }, ], 'react/prefer-stateless-function': 0, 'react/prop-types': 0, 'react/jsx-filename-extension': [ 2, { extensions: ['.js', '.jsx', '.tsx'], }, ], 'jsx-a11y/accessible-emoji': 0, 'react-native/no-color-literals': 0, '@typescript-eslint/no-use-before-define': [ 2, { functions: true, classes: true, variables: false, }, ], '@typescript-eslint/explicit-function-return-type': { allowExpressions: true, allowTypedFunctionExpressions: true, }, }, } 复制代码
# /node_modules/* and /bower_components/* ignored by default 复制代码
Prettier 代码格式化
ESLint 能够检测出代码中的潜在问题,提高代码质量,但是并不能完全统一代码风格。而 Prettier 在格式化代码方面具有更大优势。Prettier 扫描文件中的样式问题,并自动重新格式化代码,以确保缩进、间距、分号、单引号和双引号等遵循一致的规则。
VsCode 支持
如果你只是想要格式化你的 JS 或 TS 代码,你可以忽略这一部分
安装 Prettier Plugin
配置 Prettier Plugin
注意:除了以下配置,建议你把其他格式化插件,比如 beautify 直接卸载,并配置 prettier 为默认格式化程序。
prettier.requireConfig editor.formatOnSave
{ "prettier.requireConfig": true, "editor.formatOnSave": true, } 复制代码
规则配置
Prettier ❤ ESLint
完成上一部分 VSCode 的支持,再配置一个 PrettierConfig 文件你就可以使用 Prettier 的功能了。但是当样式出问题时,编辑器并不会给你报错。更糟糕的是,ESLint 和 Prettier 在格式化规则方面存在一些冲突。幸运的是,Prettier 被设计为易于与 ESLint 集成,所以你可以轻松在项目中使两者,而无需担心冲突。
$ yarn add prettier eslint-config-prettier eslint-plugin-prettier -D 复制代码
- prettier: 主 prettier 库
- eslint-config-prettier : 关闭所有不必要或可能与 prettier 的规则冲突的ESLint规则。
- eslint-plugin-prettier : 以 ESLint 插件的形式运行 prettier
配置文件
.eslintrc.js
module.exports = { extends: [ 'prettier', 'plugin:prettier/recommended', 'prettier/react', 'prettier/@typescript-eslint', ], } 复制代码
.eslintignore
# /node_modules/* and /bower_components/* ignored by default 复制代码
.prettierrc.js
module.exports = { semi: false, // 行位是否使用分号,默认为true trailingComma: 'es5', // 是否使用尾逗号,有三个可选值"<none|es5|all>" singleQuote: true, // 字符串是否使用单引号,默认为false,使用双引号 printWidth: 120, // 一行的字符数,如果超过会进行换行,默认为80 tabWidth: 2, // 一个tab代表几个空格数 bracketSpacing: true, // 对象大括号直接是否有空格,默认为true,效果:{ foo: bar } } 复制代码
.prettierinore
**/node_modules/* src/**/*.js src/**/*.jsx src/**/*.ts src/**/*.tsx 复制代码
EditorConfig 跨编辑器配置统一
当多人共同开发一个项目的时候,往往会出现大家用不同编辑器的情况。就前端开发者来说,有人喜欢 Sublime,有人喜欢 Webstorm , 也有人喜欢 Atom,还有人喜欢 Vim,HBuilder 等等。各种不同编程语言的开发者喜欢各种不同的编辑器。EditorConfig 这个项目就是为了解决跨编辑器开发项目的代码风格统一问题的。
VSCode Plugin
安装
安装完后不需要配置,直接在项目中添加配置文件即可。
配置文件
# EditorConfig is awesome: http://EditorConfig.org # top-most EditorConfig file root = true # Unix-style newlines with a newline ending every file [*] indent_style = space indent_size = 2 end_of_line = lf charset = utf-8 trim_trailing_whitespace = true insert_final_newline = true [*.md] trim_trailing_whitespace = false [*.gradle] indent_size = 4 [BUCK] indent_size = 4 复制代码
Git pre-commit Hook
pre-commit
钩子在键入提交信息前运行。 它用于检查即将提交的快照,例如,检查是否有所遗漏,确保测试运行,以及核查代码。 如果该钩子以非零值退出,Git 将放弃此次提交,不过你可以用 git commit --no-verify
来绕过这个环节。 你可以利用该钩子,来检查代码风格是否一致(运行类似 lint 的程序)、尾随空白字符是否存在(自带的钩子就是这么做的),或新方法的文档是否适当。
husky: 轻松使用 Git hooks
Husky 能阻止坏的 git commit
, git push
和更多的:hankey:
$ yarn add -D husky 复制代码
配置文件
.huskyrc.js
module.exports = { hooks: { 'pre-commit': 'node node_modules/eslint/bin/eslint.js --fix src/**/*.js', }, } 复制代码
注意:测试发现直接运行 eslint --fix
使用的是全局的模块。
只使用 husky 的问题
- 性能问题:对整个项目运行一个lint进程很慢,而且linting结果可能无关紧要。
- 效率问题:遗留代码仓库上工作的同学很快会遇到新的问题,开启 Lint 初期,你可能会面临成千上万的 Lint Error 需要修复。部分同学对下面这个图可能并不陌生:只改了文件 A,但是文件 B、C、D 中也有大量错误。
lint-staged: husky的好帮手
针对暂存的git文件运行linters并且不要让:hankey:滑入你的代码库!对暂存区概念不熟悉的同学可以看下git-简明指南
$ yarn add -D husky lint-staged 复制代码
- husky: 被用来添加一些 git 钩子,这里我们需要一个用
pre-commit
在每次git commit
操作时执行lint-staged
命令。 - lint-staged: 可以对 git 暂存区文件(也就是你想要 commit 的文件)执行一些操作,这样做即提高了性能又提高了效率。
配置文件
.huskyrc.js
module.exports = { hooks: { 'pre-commit': 'lint-staged', }, } 复制代码
lint-staged.config.js
module.exports = { "src/**/*.{js,jsx,ts,tsx}": ["eslint --fix", "git add"] } 复制代码
相对于根目录引入组件
这部分不是必须的,配置也有些繁琐。这里我就只介绍下简单的配置,详细文档请请查阅 babel-plugin-root-import 。
安装
$ yarn add -D babel-plugin-root-import eslint-import-resolver-babel-plugin-root-import 复制代码
babel.config.js
module.exports = { ... plugins: [ [ 'babel-plugin-root-import', { rootPathSuffix: 'src', rootPathPrefix: '~', }, ], ], ... } 复制代码
.eslintrc.js
{ settings: { 'import/resolver': { 'babel-plugin-root-import': { rootPathSuffix: 'src', rootPathPrefix: '~', }, }, }, } 复制代码
tsconfig.json
{ "compilerOptions": { "baseUrl": ".", "paths": { "~/*": ["src/*"] } } } 复制代码
支持 .jsx
React Native 都已经内置支持 TypeScript 了,但是却不支持 .jsx
文件后缀。如果你想要使用 .jsx
开发,可以配置 metro.config.js
:
module.exports = { resolver: { sourceExts: ['ts', 'tsx', 'js', 'jsx', 'json', 'mjs'] }, } 复制代码
相关资料
- Using ESLint and Prettier in a TypeScript Project : TypeScript、ESLint、Prettier、VSCode
- 使用 ESLint + Prettier 简化代码 Review 过程 : Zeit Now、DevOps
- 用Prettier和ESlint来统一提交代码 : ESLint、Prettier、husky、lint-staged
- 用 ESLint 和 Prettier 写出高质量代码 :ESLint、Prettier、husky、lint-staged
- 使用ESLint+Prettier来统一前端代码风格 :ESLint、Prettier
- 使用ESLint & Prettier美化Vue代码 :Vue、ESLint、Prettier、husky、lint-staged、填坑
- 用 husky 和 lint-staged 构建超溜的代码检查工作流 : husky、lint-staged
以上所述就是小编给大家介绍的《优雅地使用TypeScript开发React Native应用》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。