我决定放弃dva并自己搭一个基于TypeScript的脚手架
一、为什么我要放弃dva
老实说,dva真的很好用,下载下来过后直接写业务逻辑代码就可以了,基本不用理会webpack如何配置,项目结构怎么设计,甚至我可以不用知道redux的数据流是怎样的、saga如何处理异步、react-router路由是什么,怎么按需加载,都可以开发,只要知道react语法就成功了一半,更开心的是,我可能用到的插件,在node_modules下一搜索,基本都有了,简直不要太方便,然而,我还是有不得不放弃的理由。
1.我想用TypeScript了
突然想用TypeScript重构一下项目,怕以后业务越来复杂,项目越来越大,之前写的会忘记。
dva是支持TypeScript的,但是配置路由中,因为使用了dva/dynamic,总会有一些奇奇怪怪的报错信息,最后找到了最佳的实践方法,就是把Umi引入进来,之前看官方说的类nextjs的框架,果断放弃了,因为我用不到,用了之后才知道,嗯……类似nextjs结构吧,和nextjs好像没有太多相同之处,因为dva+umi+roadhog才是一个完整的页面+路由+服务的最佳实践。
我的项目感觉越来越大了,我想我要放弃了。
2.React-Router真的挺好用
React-Router v4真的是将前端路由发挥的很好,可以很灵活的配置,包括按需加载、事件监听等等,dva也很好,把路由的核心都放在了一起,但是类如我想在Route里面写render好像变难了,不能把models注入里面。
一些看似鸡肋,有时候很好用的功能在dva里面变得更难了,我想我要放弃了。
3.webpack怎么配置
webpack零配置啊,这点真的是省了很多查看各种loader和插件版本问题的时间,按需加载这种也不用去翻文档了,一个true就可以,但是越是封装的好,可灵活配置的就越少.webpackrc文件可以配置的也不多。打包dist下生成0.async.js ..... 31.async.js,几十个文件真的逼死强迫症。我想我又要放弃了。
4.我要把代码放到docker上
这个我就觉得很无奈了,roadhog也很好,为什么放到docker上运行npm run build就挂起了呢,网上提了问题,最后还是自问自答,发现2.3.0就会这样,还是要降到2.2.0。我想还是放弃把。
5.东西太多就是卡
幸幸苦苦项目算是跑起来了,可以感觉打包运行时间好长啊,果然做开发还是要配一个好点的电脑,不过,我决定还是放弃了。
二、准备自己搭一个脚手架吧
1.先找一些性能好的插架兼容我的破电脑
webpack4:不是看中它宣传的零配置,真的打包速度比前几个版本快好多,记得单独安装webpack-cli。
mobx:TypeScript兼容上比较好,可以感觉更轻一点。
react-router v4:看看文档配置起来真的很好用。
axios:fetch也不用啦,哪个小用哪个。
async/await:暂且拿它代替一下saga,感觉够用。
2.各种版本各种坑
各种版本先升到最新的,一般来说新版本很多会做性能优化。
webpack:webpack4放弃了CommonsChunkPlugin
,引入了optimization.splitChunks
,还有optimization.runtimeChunk
,搭配HtmlWebpackPlugin
用比较好。
TypeScript的加载器有两个,awesome-typescript-loader
和 ts-loader
,我比较倾向于前一个,更快。但是我的项目中用了ts-loader
,因为引入了antd,为了不用bable,我用ts-import-plugin
加载样式,在各种版本的尝试下,用最新版的awesome-typescript-loader
加上最新版的antd并不能很好的加载antd的样式。
antd的版本如果3.0以前要在tsconfig.json中加"allowSyntheticDefaultImports": true
tsconfig.json:主要是一些ts语法转换的配置,有点像bable所做的事情,不过我不想用bable,在处理async/await
的时候,要加上"lib": ["es6", "dom"]
。
3.顺手发个npm包
发一个包,方便用。
如果你想尝试一下
npm install -g rwt-cli
rwt init <name>
cd <name>
npm install
-
npm start
查看版本rwt -v
orrwt --version
目前是1.1.6
没什么好说的,还是看代码吧,如果你觉得可以优化也可以
github:https://github.com/octopodcat/rwt
npm:https://www.npmjs.com/package/rwt-cli