用react typescriptt写react和node是怎样的一种体验

webpack4正式版发布也有一段时间了, 为了從实际中感受变化, 于是以react typescriptt, react, 结合之前翻译的一篇文章, 搭建一个可供项目使用的框架.

我是由另一个项目升级过来的, 因为旧项目没用babel, 直接以ts-loader转.

原項目涉及到配置变化的库及版本

果然跑不通, 符合心理预期!????

提示信息与实际不符, 估计提示没改过来, 还是用babel吧(其实它的也是建议用babel), 免得挣扎!

  1. 首先是react-hot-loader/babel, 无论是按官方推荐配置, 还是写在.babelrc, 以上两者都加上环境判断, 开发环境没问题, 可是打包出来的生产环境代码看起来怪怪的:

怎么看都不合理吖! 为什么会出来我的本地源文件路径! 本地开nginx调试生成环境代码, 虽然能跑, 不过, 这不是我想要的生产代码!

异步组件的css提取问题, 暂以提取所有css到┅个文件中告终, 即:

过程曲折, 还有一些问题没写上, 具体请参考...

如果大家有更好的解决方案, 也欢迎评论或

}

在里边有解释了为什么要使用TS鉯及在Node中的一个项目结构是怎样的。
但是那仅仅是一个纯接口项目碰巧赶上近期的另一个项目重构也由我来主持,经过上次的实践以后尝到了TS所带来的甜头,毫不犹豫的选择用TS+React来重构这个项目
这次的重构不仅包括Node的重构(之前是Express的项目),同时还包括前端的重构(之湔是由jQuery驱动的多页应用)

因为目前项目是没有做前后分离的打算的(一个内部工具平台类的项目),所以大致结构就是基于上次Node项目的結构在其之上添加了一些FrontEnd的目录结构:

其中标绿(也可能是一个+号显示)的文件为本次新增的。
其中client-distviews都是通过webpack生成的实际的源码文件都在client-src下。就这个结构拆分前后分离其实没有什么成本
在下边分了大概这样的一些文件夹:

项目的入口html文件采用ejs作为渲染引擎
是用于tsc编譯执行的一些配置文件
各种配置项存放的位置,类似请求接口的host或者各种状态的map映射之类的(可以理解为枚举对象们都在这里)
一些公共函数存放的位置各种可复用的代码都应该放在这里
各种静态资源的存放位置,图片之类文件
里边存放了各种环境的webpack脚本命令以及dll的生成
湔后端复用代码的一个尝试

实际上边还漏掉了一个新增的文件夹我们在src目录下新增了一个common目录,这个目录是存放一些公共的函数和公共嘚config不同于utils或者config的是,这里的代码是前后端共享的所以这里边的函数一定要是完全的不包含任何环境依赖,不包含任何业务逻辑的

类姒的数字千分位,日期格式化抑或是服务监听的端口号,这些不包含任何逻辑也对环境没有强依赖的代码,我们都可以放在这里
这吔是没有做前后分离带来的一个小甜头吧,前后可以共享一部分代码

要实现这样的配置,基于上述项目需要修改如下几处:

  1. src下的utilsconfig部分玳码迁移到common文件夹下主要是用于区分是否可前后通用
  2. 为了将对之前node结构方面的影响降至最低,我们需要在common文件夹下新增一个index.ts索引文件並在utils/index.ts下引用它,这样对于node方面使用来讲并不需要关心这个文件是来自utils还是common
  1. 然后是配置webpackalias属性,用于webpack能够正确的找到其路径

如果使用vs code进行開发而且使用了ESLint的话,需要修改TS语法支持的后缀添加react typescripttreact的一些处理,这样才会自动修复一些ESLint的规则:

因为在前端使用了React按照目前的主鋶,webpack肯定是必不可少的
并没有选择成熟的cra()来进行环境搭建,原因有下:

  1. webpack更新到4以后并没有尝试过想自己耍一耍
  2. 结合着TS以及公司内部的東西,会有一些自定义配置情况的出现担心二次开发太繁琐

但是其实也没有太多的配置,本次重构选用的UI框架为Google Material的实现:
而他们采用的昰 来进行样式的编写所以也不会涉及到之前惯用的scss的那一套loader了。

webpack分了大概如下几个文件:

公共的webpack配置类似env之类的选项
用于将一些不会修改的第三方库进行提前打包,加快开发时编译效率
可以理解为是webpack的基础配置文件通用的loader以及plugins在这里
生产环境的特殊配置(代码压缩、資源上传)
开发环境的特殊配置(source-map

dll是一个很早之前的套路了,大概需要修改这么几处:

  1. 创建一个单独的webpack文件用于生成dll文件
  2. 在普通的webpack文件中进行引用生成的dll文件
// 需要提前打包的库 // 向外抛出的`vendors.dll.js`代码的具体映射,引用`dll`文件的时候通过它来做映射关系的

这样在watch文件时打包就会跳过verdors中存在的那些包了。
有一点要注意的如果最终需要上传这些静态资源,记得连带着verdors.dll.js一并上传

在本地开发时vendors文件并不会自动注入到html模版中去,所以我们有用到了另一个插件。
同时在使用中可能还会遇到webpack无限次数的重新打包这个需要配置ignore来解决-.-:

// 将`ejs`模版文件放到目標文件夹,并注入入口`js`文件

TS的配置分了两块一个是webpack的配置,另一个是tsconfig的配置

// 一定不要忘记配置ts tsx后缀

ts-loader用于将TS的一些特性转换为JS兼容的语法,然后执行babel进行处理react/jsx相关的代码最终生成可执行的JS代码。

然后是tsconfig的配置ts-loader的执行是依托于这里的配置的,大致的配置如下:

// 构建输出目录但因为使用了`webpack`,所以这个配置并没有什么卵用 // 开启装饰器的使用

最近这段时间我们团队基于airbnbESLint规则进行了一些自定义,创建了自镓的
同时还存在了和的两个衍生版本

除了上边提到的两端公用代码以外,还需要添加一个controller用于吐页面因为使用的是routing-controllers这个库,渲染一个靜态页面被封装的非常棒仅仅需要修改两个页面,一个用于设置render模版的根目录另一个用来设置要吐出来的模版名称:

// 渲染页面时的一些变量 // 添加模版所在的目录 // 以及使用的渲染引擎、文件后缀

如果是多个页面,那就创建多个用来Renderts文件就好了

目前的routing-controller对于Koa的支持还不是很恏(原作者对Koa并不是很了解,导致Render对应的接口被请求一次以后后续所有的其他的接口都会直接返回该模版文件,原因是在负责模版渲染的URL触发时本应返回数据,但是目前的处理却是添加了一个中间件到Koa中所以任何请求都会将该模版文件作为数据来返回)所以@Render并不能適用于Koa驱动。
不过我已经提交了了跑通了测试用例,坐等被合并代码但是这是一个临时的修改方案,涉及到这个库针对外部中间件注冊的顺序问题所以对于app.ts还要有额外的修改才能够实现。

// 手动创建koa实例然后添加`render`的中间件,确保`ctx.render`方法会在请求的头部就被添加进去 // 后续嘚逻辑就都一样了

当然这个是新版发出以后的逻辑了,基于现有的结构也可以绕过去但是就不能使用@Render装饰器了,抛开koa-views直接使用内部的:

// 直接在接口返回时获取模版渲染后的数据

目前的示例代码采用的上边的方案

至此一个完整的TS前后端项目架构就已经搭建完成了(剩下嘚任务就是往骨架里边填代码了)。
我已经更新了之前的 在里边添加了本次重构所使用的一些前端TS+React的示例还包括针对@Render的一些兼容。

react typescriptt是一個很棒的想法解决了N多javaScript种令人诟病的问题。
使用静态语言来进行开发不仅能够提高开发的效率同时还能降低错误出现的几率。

如果在使用TS的过程中有什么问题、或者有什么更好的想法欢迎来沟通讨论。

}

我要回帖

更多关于 react typescript 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信