Ant Design of React下面简称为“antd”css
GitHub上的antd是用typescript实现的,目前我在学习typescript,所以fork了一份antd的源码。学习过程当中发现学习曲线很陡峭,不适合新手,所以想把antd中适合新手的东西(各个组件的typescript源码)剥离出来,作到零配置,方便学习。html
个人想法是:node
使用Facebook的creat-react-app工具(下面简称为CRA)建立项目,CRA帮咱们的项目配置了开发用的服务器(该服务器还能热替换)、集成了Jest测试环境、集成了tslint代码规范、 webpack也配置好了。新手不用关心配置文件,上来就是编码和学习,Perfect !react
进入正题,新手如何建立一个项目来学习antd源码?webpack
create-react-app my-app --scripts-version=react-scripts-ts
若是提示create-react-app 不是可用的,说明要安装CRA(-g 表示全局安装)git
npm install create-react-app -g
若是你没有安装npm,那么就去百度一下安装nodegithub
2. 步骤1 生成的目录结构以下: web
这里我把tslint.json的内容删掉了,只留下花括号,这么作是为了方便后面咱们复制粘贴代码。typescript
tslint是定义代码规范的,一旦代码不规范就会出现红色标识,很难看,干脆就不要tslint了。npm
3.在src目录下新建components文件夹,复制antd源码中src/components/icon下的index.tsx还有tests目录下的index.test.tsx文件,打开文件发现:
红色箭头是antd源码中没有的,我本身琢磨着加的。
红色波浪线表示相关模块没有安装,或者是该模块没有tsd文件,先安装模块:
npm install classnames omit.js
npm install enzyme enzyme-adapter-react-16 react-test-renderer --save-dev
4.安装后发现红色波浪线还在,这是由于咱们安装的模块没有相应的声明文件,这里有个解决方法:创建一个和src同级的typings文件夹,新建index.d.ts,内容是:
/// <reference path="custom-typings.d.ts" />
新建custom-typings.d.ts,内容是:
declare module 'classnames'; declare module 'omit.js'; declare module 'enzyme'; declare module 'enzyme-adapter-react-16'; declare module 'react-test-renderer';
5. 回到icon下的index.tsx,发现
import * as React from 'react';
之前我不是这样写的,是这样的:
import React from 'react';
不单单是react,不少模块都要换成新写法,这让我很难受,所以我设置成了之前的写法,找到根目录下的tsconfig.js和tsconfig.test.js,把module的值替换成'es2015':
{ "compilerOptions": { "allowSyntheticDefaultImports": true, "baseUrl": ".", "outDir": "build/dist", "module": "es2015", "target": "es5", ……
{ "extends": "./tsconfig.json", "compilerOptions": { "module": "es2015" } }
然而vscode编辑器还会有红色波浪线错误,只有react是个特例,我不懂为何,导入React就按新写法来,其余模块用原来写法。为何能够这么改呢?我会把相应的资源连接放在最下面,请自行理解。
这一步能够解决相似"omit.js._default is not a function"的错误
6.Icon引入后,能够运行 npm test ,test运行成功表明上面的步骤你很好地执行了;咱们接下来看看Icon的效果,编辑 App.tsx, 新增如下语句:
import './components/style/antd.min.css' import Icon from './components/icon'; <p className="App-intro"> To get started, edit <code>src/App.tsx</code> and save to reload. <Icon type="book" /> </p>
运行 npm start , 会发现book图标出现了.
这里要注意,咱们引入了antd.min.css样式文件,它定义了antd的组件样式,是antd的最终产物之一.能够经过 npm install antd ,安装后在antd 的 dist 目录下找到它.
7.咱们接着引入button组件, 把button目录下的index.tsx, button.tsx, button-group.tsx 复制到本身项目下,编辑 button.tsx , 删掉其中的
import PropTypes from 'prop-types'; static propTypes = { type: PropTypes.string, shape: PropTypes.oneOf(['circle', 'circle-outline']), size: PropTypes.oneOf(['large', 'default', 'small']), htmlType: PropTypes.oneOf(['submit', 'button', 'reset']), onClick: PropTypes.func, loading: PropTypes.oneOfType([PropTypes.bool, PropTypes.object]), className: PropTypes.string, icon: PropTypes.string, };
prop-types是运行时的类型检查,我以为有typescript就够了.
8.如今试试button的效果,编辑App.tsx:
import Button from "./components/button"; <Button type='danger' icon='search'>Antd</Button>
运行 npm start 便可在浏览器中看到效果.
9.接下来编辑button的测试文件,复制antd源码button目录下的test目录下的index.test.tsx,新增语句以下:
import { render, mount, configure } from 'enzyme'; import Adapter from 'enzyme-adapter-react-16'; configure({ adapter: new Adapter() });
最新版的enzyme须要这样设置.
运行 npm test 查看测试状况
10.总结一下,上面是把antd源码中的icon和button组件以及它们的测试文件剥离出来,运行在本身的项目当中, 研究antd的设计人员开发组件的思想, 这对咱们学习typescript , react组件开发颇有帮助.
使用的编辑器-VSCode
推荐阅读
上面建立的项目已托管在GitHub上:typescript-study