虽然2月初就回来了,可 CoreCRM 一直到5月才开始恢复开发,期间是各种生活中的意外和不方便。

1. 为什么要重构

首先是一件很值得高兴的事情:CoreCRM 有了第一位 contributor!Larry 是我原来的一位实习生,现在在某公司做前端开发。因为 Larry 的加入,我就不再是一个人战斗了。当然,也就得考虑怎么进行合作的事情了。

年前的开发计划是:使用 Bootstrap 按照悟空CRM的样子先弄出一个可以用的版本来。然后再使用一些比较好的后台前端框架来代替 Bootstrap。在和 Larry 讨论之后,他觉得 Bootstrap 已经有点跟不上时代,以后扩展 UI 都会有一些困难。加上 Bootstrap 是 jQuery 作为交互基础的,和 VueJS 这样的框架也是不太配合。正好 Larry 的公司正在使用蚂蚁金服出品的 Ant Design 开发后台程序,他感觉这个框架设计的不错:组件丰富、设计合理、社区活跃、文档丰富(还是中文)。Ant Design 基于 React Component,也是当前非常流行的前端框架,经过多年的发展,据说其组件的丰富程度已经与 jQuery 不遑多让。

鉴于之前我使用 VueJS 做全页渲染的经验,我认为 React 这东西,如果不做 Server-Side Rendering(SSR),用户体验不会太好。如何集成 SSR,其实有两种方案:

  1. 完全使用 nodejs 来做前端服务器,ASP.NET Core 做 API 服务器
  2. 集成 node 到 ASP.NET Core 里,通过 ASP.NET Core 提供一些 Web 的服务

去年我也曾经用了一周的时间去研究几个 ASP.NET Core 的 React Server-side Rendering 方案,可一个人的精力毕竟有限,要同时使用两种语言开发,脑子的转换效率是一个问题。最后我放弃了 React,转而使用 ASP.NET Core 的 Razor 来做页面渲染了。只对其中一些动态的部分做了 VueJS 组件。不过这次情况不一样了,有 Larry 做前端的开发,我可以把更多的精力放到后面的API 开发和架构的优化上。而且,前后分离之后,还可以在对方工作滞后的情况下继续开发。所以我决定对整个项目进行重构。

2. 重构的尝试

近些年前端技术发展迅速,各种 hot reload 横行,在开发的时候要方便和高效的多。那么应该怎么来实现 SSR 呢?我进行了三次尝试:

2.1 Microsoft.AspNetCore.SpaServices

做为 ASP.NET Core 团队的作品,感觉上是比 Facebook 做的 ReactJS.NET 更好用一些。特别是和 ASP.NET Core 的互通性上,应该有一些优势。不过,ReactJS.NET 的 SSR 已经内置,写起来要容易一些。

一开始,我尝试使用 aspnetcore-spa 这个 yeoman generator,可这货居然还是使用的 typescript 做为主语言。虽然我之前也学了一点 typescript,但与别人合作的时候,就不能只考虑自己的技术栈了。为了不增加 Larry 的学习成本,以使得项目能够尽快进入开发,我决定还是自己搞一个基于 es6 的 ClientApp。方法当然也很简单:用 dva-cli 创建一下就 OK 了。

在完成了 ClientApp 的创建之后,需要添加一个 boot-server.js 来实现 SSR:

var { match } = require('react-router');
var { createServerRenderer } = require('aspnet-prerendering'); module.exports = createServerRenderer(function(params) {
return new Promise(function (resolve, reject) {
var re = /^\/([^\/]*)(/[^\/]*)?/;
var matched = params.location.path.match(re);
var controller = matched[1];
var codeFile = './dist/' + controller;
var App = require(codeFile); // eslint-disable-line var path = matched[2] === '' ? '/' : matched[2]; // this line is buggy.
match({
routes: App.routes,
location: path
}, function (err, redirectLocation, renderProps) {
if (err) throw new Error("Route match failed: " + err); if (redirectLocation) new Error("I don't know how to redirect."); var initialState = {};
resolve({ html: App.renderHTML(initialState, renderProps)});
})
});
});

params 里包含了一些从 Razor 传进来的数据,比如访问的路由、初始化数据等。这里本来应该直接使用 params.location.path来匹配路由,进行渲染的,可是我并没有使用完全的 SPA (Single Page Application) 架构,而是有所分离,所以就需要使用正则表达式分离 controller 和 action,然后再进行页内的匹配。现在 repo 里的代码只是实现了单页的测试载入,还没有正式的使用起来。

2.2 koa + Web API Server

本来以为上面这个方案就已经可以了。前端使用了 dva + antd + roadhog,可以直接运行一个 webpack-dev-server 直接进行开发。然后我再转到 Razor 里做为一个 Controller 的 View。不过,Larry 希望能完全脱离 ASP.NET Core 运行前端代码。我也考虑了使用

SpaServices 可能会有一些限制,比如:需要处理路由、不能使用 ES6,同时运行的时候也还是需要安装 Node,其实和一个独立的前端 Server 并没有什么区别。所以我又尝试把前端的 Server 完全分离出来。

这一步可能做的有点太激进了,我尝试使用 Web API 的模板重新创建了 CoreCRM 这个 project。结果就悲剧了:Web API 是非常轻量的框架,里面什么也没有。加上如果要分离前后端 Server,比较好的权限验证方案是使用 JSON-Web-Token,不然还需要在两个 Server 之前同步 session,也是比较麻烦的事情。而搞一套 JWT 的验证机制,也不是很容易。已经有的解决方案不是太简单,就是太复杂……

回归 SpaServices

上面这些困难加起来,让我觉得这里面的学习成本现在不可接受。所以就先放弃了这个方案。在经过一点设计和开发之后,我发现这其实和使用 koa 并没有太大的差别。问题总是可以通过一些服务间的交互来解决的。只是现在这个节点,使用 SpaServices 更容易上手一点。待到项目有一个可用的版本,后面可以尝试以其它的方式进行重构,也不是不可能的事情。毕竟这个项目至少还有2.0版。

3. 经验

“选择”总是一件很困难的事情。特别是每个选项都各有利弊的时候,选择就更加困难。每一种组合都是一种可能,每一种组合有都有它的局限。差别可能就在团队成员之间是不是能顺畅的合作。如果合作出现问题,能不能及时调整。

希望这次调整能给项目带来更多的活力。

CoreCRM 开发实录 —— 前后端分离的重构的更多相关文章

  1. Angular企业级开发(9)-前后端分离之后添加验证码

    1.背景介绍 团队开发的项目,前端基于Bootstrap+AngularJS,后端Spring MVC以RESTful接口给前端调用.开发和部署都是前后端分离.项目简单部署图如下,因为后台同时采用微服 ...

  2. 无需CORS,用nginx解决跨域问题,轻松实现低代码开发的前后端分离

    近年来,前后端分离已经成为中大型软件项目开发的最佳实践. 在技术层面,前后端分离指在同一个Web系统中,前端服务器和后端服务器采用不同的技术栈,利用标准的WebAPI完成协同工作.这种前后端分离的&q ...

  3. Django系列---开发三 前后端分离

    数据交互接口规范REST,全称 Representational State Transfer,意为"表现层状态转化". django的第三方拓展--django-rest-fra ...

  4. 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 十四 ║ VUE 计划书 & 我的前后端开发简史

    ---新内容开始--- 番外 大家周一好呀,又是元气满满的一个周一呀!感谢大家在周一这个着急改Bug的黄金时期,抽出时间来看我的博文哈哈哈,时间真快,已经到第十四篇博文了,也很顺顺(跌跌)利利 (撞撞 ...

  5. 手把手教你使用 Spring Boot 3 开发上线一个前后端分离的生产级系统(一) - 介绍

    项目简介 novel 是一套基于时下最新 Java 技术栈 Spring Boot 3 + Vue 3 开发的前后端分离的学习型小说项目,配备详细的项目教程手把手教你从零开始开发上线一个生产级别的 J ...

  6. 前后端分离(手)-- 使用mock.js(好样的)

    ## 前言: 本篇博文昨天七夕写的,一天下来被虐得体无完肤,苦逼的单身狗只能学习,对!我爱学习,关掉朋友圈,并写了一篇博文发泄发泄.这次写mock.js的使用,能使前后端分离,分离,分离,重要的是说三 ...

  7. 《Spring Boot 入门及前后端分离项目实践》系列介绍

    课程计划 课程地址点这里 本课程是一个 Spring Boot 技术栈的实战类课程,课程共分为 3 个部分,前面两个部分为基础环境准备和相关概念介绍,第三个部分是 Spring Boot 项目实践开发 ...

  8. SSM框架中的前后端分离

    认识前后端分离 在传统的web应用开发中,大多数的程序员会将浏览器作为前后端的分界线.将浏览器中为用户进行页面展示的部分称之为前端,而将运行在服务器,为前端提供业务逻辑和数据准备的所有代码统称为后端. ...

  9. 前后端分离(手) -- mock.js

    前言: 本篇博文昨天七夕写的,一天下来被虐得体无完肤,苦逼的单身狗只能学习,对!我爱学习,关掉朋友圈,并写了一篇博文发泄发泄.这次写mock.js的使用,能使前后端分离,分离,分离,重要的是说三遍. ...

随机推荐

  1. 2017-3-20 HTML 基础知识

    HTML的定义:HTML是一门编程语言的名字:超文本标记语言(Hyper Text Mark-up Language ),就是超越了文字的范畴,除了文字还可以有图片.视频.音频.动画.特效.表格.链接 ...

  2. 【Android】TextView跑马灯效果

    老规矩,先上图看效果. 说明 TextView的跑马灯效果也就是指当你只想让TextView单行显示,可是文本内容却又超过一行时,自动从左往右慢慢滑动显示的效果就叫跑马灯效果. 其实,TextView ...

  3. Docker 跟 NodeJs 最佳实践

    Level-1 简单实现 需求:简单的构建一个app应用并且用docker部署.Dockerfile编写为: FROM node:7.3.0 RUN mkdir -p /usr/src/app COP ...

  4. 【转】如何成为一位优秀的创业CEO

    编者按:本文来自 Ryan Allis,是一位来自旧金山的创业者和投资人.在 2003 年创立了 iContact,并任 CEO. 做创业公司的 CEO 可以说是世界上最有挑战性的事情之一.你得让客户 ...

  5. Linux系统文件的三个重要时间详解

    Linux文件三个时间的查看 Linux下使用命令stat获取文件的三个时间,先看现象 各个时间的含义: Chang time:简称ctime,一个文件或目录的更改时间.在Linux中,基本上无法知道 ...

  6. 开源一个vue2的tree组件

    一直打算偷懒使用个现成的树组件,但是在github上找了一大圈没有找到真正满足应用开发的树组件,所以没办法只能自己写了一个,开源出来希望可以帮助到需要的人,同时如果大家觉得好用,我可以顺带骗骗★(希望 ...

  7. 机器学习:形如抛物线的散点图在python和R中的非线性回归拟合方法

    对于样本数据的散点图形如函数y=ax2+bx+c的图像的数据, 在python中的拟合过程为: ##最小二乘法 import numpy as np import scipy as sp import ...

  8. 初窥DB2之insert语句

    第一种写法 INSERT INTO PERSVALUES (12, 'Harris', 20, 'Sales', 5, 18000, 1000, '1950-1-1') 第二种写法 INSERT IN ...

  9. linux ssh -l 命令运用

    ssh是远程登录命令,-l选项是最常用的选项,下面是我的一些总结 远程登录:ssh  -l  userName  ip # 远程登录到 10.175.23.9 ssh -l root2 10.175. ...

  10. 【Egret】Native版本 视频播放器(android)

    前段时间,领导说客户要一个平板版本的视频播放器,把我们做的一些视频资源放进去,要是本地的:我们部门又没有app开发程序员,正好又前段我在实验egret的app打包功能,就说用egret做(ps:本来想 ...