优雅地使用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
复制代码

注意:注意多余的注释可能会不兼容,需要移除,详细文档可查阅编译选项。

配置文件

tsconfig.json
{
  "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

优雅地使用TypeScript开发React Native应用

配置 ESLint Plugin

eslint.validate
eslint.autoFixOnSave

settings.json
{
    "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 支持的插件

配置文件

.eslintrc.js
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,
    },
  },
}
复制代码

.eslintignore
# /node_modules/* and /bower_components/* ignored by default
复制代码

Prettier 代码格式化

ESLint 能够检测出代码中的潜在问题,提高代码质量,但是并不能完全统一代码风格。而 Prettier 在格式化代码方面具有更大优势。Prettier 扫描文件中的样式问题,并自动重新格式化代码,以确保缩进、间距、分号、单引号和双引号等遵循一致的规则。

VsCode 支持

如果你只是想要格式化你的 JS 或 TS 代码,你可以忽略这一部分

安装 Prettier Plugin

优雅地使用TypeScript开发React Native应用

配置 Prettier Plugin

注意:除了以下配置,建议你把其他格式化插件,比如 beautify 直接卸载,并配置 prettier 为默认格式化程序。

prettier.requireConfig
editor.formatOnSave
{
    "prettier.requireConfig": true,
    "editor.formatOnSave": true,
}
复制代码

规则配置

优雅地使用TypeScript开发React Native应用

Prettier ❤ ESLint

完成上一部分 VSCode 的支持,再配置一个 PrettierConfig 文件你就可以使用 Prettier 的功能了。但是当样式出问题时,编辑器并不会给你报错。更糟糕的是,ESLint 和 Prettier 在格式化规则方面存在一些冲突。幸运的是,Prettier 被设计为易于与 ESLint 集成,所以你可以轻松在项目中使两者,而无需担心冲突。

$ yarn add prettier eslint-config-prettier eslint-plugin-prettier -D
复制代码

配置文件

.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

安装

安装完后不需要配置,直接在项目中添加配置文件即可。

优雅地使用TypeScript开发React Native应用

配置文件

.editorconfig
# 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']
  },
}
复制代码

相关资料


以上所述就是小编给大家介绍的《优雅地使用TypeScript开发React Native应用》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

全栈开发之道

全栈开发之道

和凌志 / 电子工业出版社 / 68.00元

全栈(Full Stack)是一种全新的以前端为主导的框架,框架选型聚焦在MEAN(MongoDB、Express、AngularJS、Node.js)上。选用MEAN全栈技术,可以快速地实现敏捷开发,尤其是到了产品的运营阶段,其优势表现得非常明显。本书主要介绍MEAN全栈技术,分为入门篇、基础篇和实战篇,入门篇对全栈进行了概述,基础篇重点介绍了全栈的四个主要技术,即MongoDB、Express......一起来看看 《全栈开发之道》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试