爲了折騰, 簡單的學習了下TypeScript, 感受確實不錯。 也爲了避免斷學習, 避免落伍, 因此就折騰不斷。css
前段時間用ES6,antd+dva寫了一些demo, 發現antd使用TypeScript實現的,並且angular2也採用了TypeScript。 既然這麼多項目都提早使用了TypeScript, 而我又是React的粉, 那麼仍是先研究下TypeScript實現React組件。html
鑑於剛開始, 仍是站在別人的肩膀上開始吧。node
本人對webpack配置略知一二,但暫時還不想太深刻到工程方面的研究,因此,工具選擇開源的,有阿里使用的atool-build, roadhog. 嘗試屢次, 鑑於以前的項目都是用的roadhog, 並且也看了roadhog git上面已經說支持TypeScript, 因此最終選擇了roadhog, 由於它配置確實簡單、省心。react
不過要使用roadhog的0.6.0-beta2版本(由於以前的版本不支持TypeScript):webpack
npm install roadhog@0.6.0-beta2 --save-dev
配置文件:git
//.roadhogrc { "entry": "src/index.js", "publicPath": "/dist/", "outputPath": "./dist", "env": { "development": { "extraBabelPlugins": [ "dva-hmr", "transform-runtime" ] }, "production": { "extraBabelPlugins": [ "transform-runtime", ["import", { "libraryName": "antd", "style": "css" }] // 加入這一條,import antd的樣式的時候纔不會被md5 ] } } }
+------- src +----- components +----- models +----- routes +------- .roadhog +------- node_modules +------- package.json +------- ...
項目結構基本和antd-admin的結構保持一致。github
// index.js import './index.html' import 'babel-polyfill' import dva, { connect } from 'dva' import createLoading from 'dva-loading' import { browserHistory, Router, Route } from 'dva/router' /** * @desc 如下是解決域名下面子目錄部署問題 * 域名項目下面通常會有多個子項目,那麼部署的時候,子目錄的做用就相當重要了。 * 不借助basename不太容易實現。 */ import { useRouterHistory } from 'dva/router' import createBrowserHistory from 'history/lib/createBrowserHistory' const history = useRouterHistory(createBrowserHistory)({basename: '/mda'}) // 1. Initialize const app = dva({ ...createLoading(), // history: browserHistory, history, onError (error) { console.error('app onError -- ', error) }, }) // 2. Model app.model(require('./models/app')) // 3. Router app.router(require('./router')) // 4. Start app.start('#root')
import React from 'react' import PropTypes from 'prop-types' import { connect } from 'dva' import { Icon, Row, Col, Button, Modal, } from '../components' import 'antd/dist/antd.css' import styles from './app.less' function App ({ children, location, dispatch, app, loading }) { const { isVisible, } = app const showModal = () => { dispatch({ type: 'app/showModal', }) } const handleOk = () => { } const handleCancel = () => { dispatch({ type: 'app/hideModal', }) } return ( <div className={styles.normal}> <Row>This is a row</Row> <Row> <Col span={12}>這是一個Col</Col> <Col span={12}>這是一個Col</Col> </Row> <Button type="primary" onClick={showModal}><Icon type="link" />彈窗</Button> <Modal title="彈窗標題" visible={isVisible} onOk={handleOk} onCancel={handleCancel}> <div>Hello</div> </Modal> </div> ) } App.propTypes = { children: PropTypes.element.isRequired, location: PropTypes.object, dispatch: PropTypes.func, app: PropTypes.object, loading: PropTypes.bool, } export default connect(({ app, loading }) => ({ app, loading: loading.models.app }))(App)
組件位於src/components, 開始學習的時候,能夠直接從ant-design源代碼的components中拷貝代碼過來, 對於簡單的組件Button, Grid, Icon, 能夠拷貝過來, 而後直接跑起來, 不過注意安裝必要的包。web
{ "@types/react": "^15.0.22", "@types/react-dom": "^0.14.23", "antd": "^2.9.1", "classnames": "^2.2.5", "dva": "^1.2.1", "dva-loading": "^0.2.1", "object-assign": "^4.1.1", "omit.js": "^0.1.0", "prop-types": "^15.5.8", "rc-animate": "^2.3.6", "rc-dialog": "^6.5.8", "rc-util": "^4.0.2", "react": "^15.5.4", "react-dom": "^15.5.4" }
工具、項目搭建起來, 下面能夠舒心的學習TypeScript開發React組件了。 鑑於本人也是學習, 還有太多須要努力的。 但願有志同窗一塊兒學習探討。npm
下面列舉出一些坑:json
roadhog貌似和dva關聯起來了, 沒有仔細研究,不作路由配置, 程序跑不起來,姑且先配置下簡單的路由,讓應用跑起來吧。
須要安裝@types/react, @types/react-dom, 雖然暫時還不太明白具體原理。
須要在根目錄配置tsconfig.json, 不然跑不起來
typings目錄暫時沒有用到,待學習
在遷移modal模塊時, 總是報錯, 最後解決方案在解決modal onClose賦值報錯的問題
如下是相關命令
開發: npm run server
構建: npm run build