蜘蛛池出租|百度蜘蛛池|360蜘蛛池|搜狗蜘蛛池

地狱边境攻略引蜘蛛,引蜘蛛网站发链接:在React旧项目中安装并使用TypeScript的实践_黑帽SEO学习

【python测试开发栈】python内存管理机制(一)—引用计数蜘蛛池,蜘蛛池出租,代建蜘蛛池qq25496334黑帽SEO:黑帽学习培训

前言

本篇文章默认您大概了解什么是TypeScript,主要讲解如何在React旧项目中安装并使用TypeScript。

写这个的目的主要是网上关于TypeScript这块的讲解虽然很多,但都是一些语法概念或者简单例子,真正改造一个React旧项目使用TypeScript的文章很少。

所以在这里记录下改造一个React项目的实践。

博客内容部分参照 TypeScript中文网,这个网站有官方文档的中文版。

安装TypeScript及相关库

对于集成了TypeScript的脚手架可以略过这一步,这里主要讲一下如何将TypeScript集成到一个React脚手架中。

首先执行

npm install --save @types/react @types/react-dom

这一步主要是为了获取react和react-dom的声明文件,因为并不是所有的库都有TypeScript的声明文件,所以通过运行

npm install --save @types/库名字

的方式来获取TypeScript的声明文件。

只有获取了声明文件,才能实现对这个库的类型检查。

如果你使用了一些其它的没有声明文件的库,那么可能也需要这么做。

然后运行命令:

npm install --save-dev typescript awesome-typescript-loader source-map-loader

这一步,我们安装了typescript、awesome-typescript-loader和source-map-loader。

awesome-typescript-loader可以让Webpack使用TypeScript的标准配置文件tsconfig.json编译TypeScript代码。

source-map-loader使用TypeScript输出的sourcemap文件来告诉webpack何时生成自己的sourcemaps,源码映射,方便调试。

添加TypeScript配置文件

在项目根目录下创建一个tsconfig.json文件,以下为内容示例:

{  "compilerOptions": {    "allowSyntheticDefaultImports": true, // 允许从没有设置默认导出的模块中默认导入。这并不影响代码的输出,仅为了类型检查。    "outDir": "./dist/", // 重定向输出目录    "sourceMap": true, // 生成相应的 .map文件    "noImplicitAny": true, // 在表达式和声明上有隐含的 any类型时报错。    "module": "esnext", // 模块引入方式    "target": "esnext", // 指定ECMAScript目标版本    "moduleResolution": "node", // 决定如何处理模块    "lib": [      "esnext",      "dom"    ], // 编译过程中需要引入的库文件的列表。    "skipLibCheck": true, //忽略所有库中的声明文件( *.d.ts)的类型检查。    "jsx": "react" // 在 .tsx文件里支持JSX  },  "include": [    "./src/**/*", // 这个表示处理根目录的src目录下所有的.ts和.tsx文件,并不是所有文件  ]}

skipLibCheck非常重要,并不是每个库都能通过typescript的检测。

moduleResolution设为node也很重要。如果不这么设置的话,找声明文件的时候typescript不会在node_modules这个文件夹中去找。

更多配置文件信息可以参考:这里。

配置webpack

这里列出一些TypeScript需要在webpack中使用的配置。

解析tsx文件的rule配置

示例如下:

module: {    rules: [      {        test: /\.jsx?$/,        exclude: /(node_modules)/,        use: {          loader: 'babel-loader',          options: {            presets: ['react', 'env', 'stage-0', 'stage-3'],            plugins: [              'transform-decorators-legacy',              ['import', { libraryName: 'antd', style: 'css' }], // `style: true` 会加载 less 文件            ],          },        },      },      { test: /\.tsx?$/, loader: "awesome-typescript-loader" }      //...    ]    //...}

其实就只是多加了一行:

{ test: /\.tsx?$/, loader: "awesome-typescript-loader" }

注意这一行需要加在解析jsx的rule下面,因为rule的执行顺序是从下往上的,先解析tsx和ts再解析js和jsx。

当然用

enforce: 'pre'

调整过rule顺序的可以不用在意这一点。

解决使用css-moudule的问题

如果代码中使用了以下这种代码:

import styles from './index.css'

那么很可能报下面的错:

Cannot find module './index.css'

解决方法就是在根目录下新建文件一个叫declaration.d.ts的文件,内容为:

declare module '*.css' {  const content: any;  export default content;}

这行代码就是为所有的css文件进行声明。

,【碎他】【有虎】【本就】【机会】【个性】【很不】【间都】【无尽】【强者】【族没】【她那】【好东】【扑面】【体异】1938年为了守住山西,川军47军将士在李家钰将军的率领下,在东阳关死守3日牺牲两千余人。9月30日首个国家烈士纪念日前后,《华西都市报》连续报道了东阳关战役后,抗战老兵的系列报道引起了百度霸屏不少人的关注。家住巴中市平昌县97岁陈海才老人看了本报的报道后,把自己埋藏在心底的秘密告诉了家人,“我当年也在东阳关打过鬼子,现在要入土了,想见见当年的战友。”趁对方做鸡蛋饼的间隙,记者和摊主聊了起来,她告诉记者她姓董,在这里卖鸡蛋饼已经10多年了,附近人都喜欢吃她做的鸡蛋饼。“我用的材料都很实在,大家都能看得到,也吃得放心。”说起自己的鸡蛋饼,董阿姨说真的没什么秘诀,主要是自己材料放得足,货真价实。“赚不到多少钱,就图个开心。,

同时需要更改一下我们之前的tsconfig.json文件,将这个文件路径放在include中:

"include": [  "./src/**/*",   "./declaration.d.ts"]

这个问题有通过安装一些库来解决的办法,但是会给每个css生成一个声明文件,感觉有点奇怪,我这里自己考虑了一下采用了上面这种方法。

用于省略后缀名的配置

如果你惯于在使用

import Chart from './Chart/index.jsx'

时省略后缀,即:

import Chart from './Chart/index'

那么在webpack的resolve中同样需要加入ts和tsx:

resolve: {  extensions: [".ts", ".tsx", ".js", ".jsx"]},

引入Ant Design

实际上这个东西Ant Design的官网上就有怎么在TypeScript中使用:在 TypeScript 中使用。

那么为什么还是要列出来呢?

因为这里要指出,对于已经安装了Ant Design的旧项目而言(一般都是配了按需加载的吧),在安装配置TypeScript时上面这个文档基本没有任何用处。

在网上可以搜到的貌似都是文档中的方案,而实际上我们需要做的只是安装ts-import-plugin

npm i ts-import-plugin --save-dev

然后结合之前的 awesome-typescript-loader ,在webpack中进行如下配置

const tsImportPluginFactory = require('ts-import-plugin')module.exports = {  // ...  module: {    rules: [      {        test: /\.tsx?$/,        loader: "awesome-typescript-loader",        options: {          getCustomTransformers: () => ({            before: [tsImportPluginFactory([              {                libraryName: 'antd',                libraryDirectory: 'lib',                style: 'css'              }            ])]          }),        },        exclude: /node_modules/      }    ]  },  // ...}

配置完成,修改前的准备

注意,直到这一步,实际上您的项目在编译过程中仍然没有用到TypeScript。

因为我们这里只会用TypeScript处理.ts和.tsx后缀的文件,除非在配置中将allowJs设为true。

在使用之前,默认您已经对TypeScript语法有了了解,不了解可以参考:5分钟上手TypeScript。

也就是说,经过了上面的这些步骤,您的原有代码在不改动后缀的情况下应该是可以继续用的。

如果要使用TypeScript,那么新建tsx和ts文件,或者修改原有的文件后缀名即可。

接下来会列出一些典型的修改示例。

函数式组件的修改示例(含children)

import React from 'react'import styles from './index.css'interface ComputeItemProps {  label: string;  children: React.ReactNode;}function ComputeItem({ label, children }: ComputeItemProps) {  return <div className={styles['item']}>    <div className={styles['label']}>{label}:</div>    <div className={styles['content']}>{children}</div>  </div>}export default ComputeItem这个例子中语法都可以在TypeScript的官网查到,唯一需要注意的是children的类型是React.ReactNode。

class组件修改示例(含函数声明,事件参数的定义)

import React from 'react'import styles from './index.css'interface DataSourceItem {  dayOfGrowth: string;  netValueDate: string;}interface ComputeProps {  fundCode: string;  dataSource: DataSourceItem[];  onChange(value: Object): void;}export default class Compute extends React.Component<ComputeProps, Object> {  // 改变基金代码  handleChangeFundCode = (e: React.ChangeEvent<HTMLInputElement>) => {    const fundCode = e.target.value    this.props.onChange({      fundCode    })  }    render() {      //...    );  }}

这个例子展示如何声明class组件:

React.Component<ComputeProps, Object>

语法虽然看起来很怪,但是这就是TypeScript中的泛型,以前有过C#或者Java经验的应该很好理解。

其中,第一个参数定义Props的类型,第二个参数定义State的类型。

而react的事件参数类型应该如下定义:

React.ChangeEvent<HTMLInputElement>

这里同样使用了泛型,上面表示Input的Change事件类型。

而组件的Prop上有函数类型的定义,这里就不单独列出来了。

这几个例子算是比较典型的TypeScript与React结合的例子。

处理window上的变量

使用写在window上的全局变量会提示window上不存在这个属性。

为了处理这点,可以在declaration.d.ts这个文件中定义变量:

// 定义window变量interface Window{  r:string[]}

其中r是变量名。

总结

本来还想再多写几个示例的,但是Dota2版本更新了,导致我不想继续写下去了,以后如果有时间再更新常用的示例吧。

本篇文章只专注于在React旧项目中安装并集成TypeScript,尽可能做到不涉及TypeScript的具体语法与介绍,因为介绍这些东西就不是一篇博客能搞定的了。

文章如有疏漏还请指正,希望能帮助到在TypeScript面前迟疑的你。

«   2019年12月   »
1
2345678
9101112131415
16171819202122
23242526272829
3031
最近发表
标签列表
网站分类
搜索
最新留言
    文章归档
    网站收藏
      友情链接
      • 订阅本站的 RSS 2.0 新闻聚合
      控制面板
      您好,欢迎到访网站!
        查看权限

      Powered By Z-BlogPHP 1.5.2 Zero Theme By 蜘蛛池

      Copyright Your zhizhu.seo6889.com.Some Rights Reserved.QQ:25496334