一种语言就可以轻松搞定前后端+安卓端+ios端+web , 等等 , 此时学习还给你送一个桌面端~~~听起来是不是很酷很骚跃跃欲试~!! 走起~
这篇文章主要是推荐一个dart开发服务器的思路 , 如果你已经会用flutter开发app , 如果你想尝试做后端服务器和接口开发 , 如果你想极大提高一个人的全栈开发效率 , 那么看到这篇文章对你或许有启发.并介绍我在过程中对项目的理解 , 主要给大家介绍几点:
- 为什么想尝试dart服务端?
- 为什么推荐dart_mars?
- dart_mars给的思路和启示
- 不足之处
一、为什么想尝试dart服务端? 本人之前一直在做移动端为主 , 项目集中在android社交和toB的产品 , 虽然研究过以前项目的服务端(php和java甚至.net 均有) , 但是一直对于服务端的系统性学习还停留在大学那会的shh. 此处一直是短板.
后来有一些自己想做的小型app, 受制于服务端的短板 , 我只能选择bmob这种第三方服务器做开发 , 实际效果并不理想 .
20年3月份开始转入flutter开发 , 发现 dart 也是可以作为服务器开发语言的 , 一直也在逛各种论坛 ,却发现这方面的文档少得可怜 , 更不要说开源框架那些 .
直到21年7月份 , 看到了大佬的dart_mars, 瞬间觉得打开了一座宝库的大门~~~~
除了dart统一语言的好处 ,我认为dart_mars:
- 本身文档清晰齐全(至少文档框架上是齐全的) ;
- 代码质量也很不错 ;
- 提供了命令式安装脚手架 , 其中包括了大部分的常用基类 , 代码非常简洁
- 作者汤大佬不仅技术牛逼 , 人也很风趣友善 ,毫不吝惜为源码解惑 , 他的文风 也是很好玩的:
上面提到 , dart_mars提供了很好的dart服务端思路 , 主要体现在项目脚手架 、模板脚手架、以及功能划分这几方面
我们先结合源码来看项目脚手架 , 首先看看项目入口 可以看到在项目入口处 , 提供了 常用的几个命令行 , 分别执行创建项目 , 运行项目 , 编译项目等 (当然这里你也可以很方便的扩展你的方法) , 这里为我们扩展项目命令提供了环境 ;
具体创建或者运行项目的代码 , 都在各自的helper内 ,以创建CreateHelper为例 , 继续看代码
class CreateHelper {
static Map<String, String> fileMap = {
/// readme
'README.md': '# {package}',
这里省略若干脚手架代码
/// tests
'lib/tests/test_main.dart': '''
void main(){
print('you can do some test in here');
}
''',
};
static void run(String package) {
var path = Directory.current.path.replaceAll('\\', '/');
var project = path + '/' + package;
if (!Directory(project).existsSync()) {
Directory(project).createSync();
} else {
print('dir ' +
package +
' is already exists, please chose other or delete it then try again');
return;
}
fileMap.forEach((filePath, fileContent) {
var filePathArr = filePath.split('/');
for (var i = 0; i < filePathArr.length; i++) {
var path = project + '/' + filePathArr.getRange(0, i + 1).join('/');
path = path.replaceAll('{package}', package);
fileContent = fileContent.replaceAll('{package}', package);
fileContent =
fileContent.replaceAll('{time}', DateTime.now().toString());
if (!path.contains('.')) {
var directory = Directory(path);
if (!Directory(path).existsSync()) directory.createSync();
} else {
var file = File(path);
if (!file.existsSync()) file.createSync();
file.writeAsStringSync(fileContent);
}
}
});
print('project ' + package + ' has been created');
print('you can change dir with command: cd ' + package);
print(
'and then get dependent with command: dart pub global run dart_mars --get');
print(
'and then start it with command: dart pub global run dart_mars --serve dev');
}
}
创建里面通过 path-content的模式 , 直接生成了模板项目的文件和内容 , 是不是简单粗暴~~ 每一个content 就是实际执行出来的代码拉~ 例如 Pubspec.dart 的content
class Pubspec {
static String content = '''
name: {package}
environment:
sdk: '>=2.10.0 <3.0.0'
dependencies:
yaml: 3.1.0
mysql1: 0.19.2
redis: 2.0.0
mime: 1.0.0
encrypt: 5.0.1
''';
}
我们默认生成项目的模板就是template目录下的所有文件拉
这里已有的模板是汤大佬写的 , 当然我们也可以在这里根据需要修改他的模板content或者生成我们的模板 , 超简单啊 .
我们再来看看生成项目后 , 项目内的控制模板 , 也就是controller-model-service模板 , 先上代码
class TemplateHelper {
String packageName;
bool forceWrite = false;
TemplateHelper({this.packageName, this.forceWrite});
void run(List<TemplateInfo> list) {
list.forEach((fileInfo) {
_createModelFile(fileInfo);
_createServiceFile(fileInfo);
fileInfo.controllerFileNameList.forEach((controllerFileName) {
_createControllerFile(fileInfo, controllerFileName);
});
});
}
void _createModelFile(TemplateInfo fileInfo) {
创建model,dart
}
void _createServiceFile(TemplateInfo fileInfo) {
创建service,dart
}
void _createControllerFile(TemplateInfo fileInfo, String controllerFileName) {
创建controller,dart
}
class TemplateInfo {
这里省略若干模板代码
}
class TemplateContent {
这里省略若干内容代码
}
''';
static String serviceContent = '''
这里省略若干脚手架代码
''';
static String controllerContent = '''
这里省略若干脚手架代码
''';
}
调用:
TemplateInfo(
tableName: 'comment',
keyName: 'commentId',
modelFile: '../extend/model/Comment.dart',
serviceFile: '../extend/service/CommentService.dart',
controllerFileNameList: [
'../app/open/controller/CommentController.dart',
'../app/user/controller/CommentController.dart',
'../app/admin/controller/CommentController.dart',
],
)
TemplateHelper helper = TemplateHelper(packageName: 'community');
helper.run([TemplateInfo]);
可以看到 , 想要创建modle 和service , controller是非常方便的 , 配置一个文件TemplateInfo即可 , 是不是非常方便~~ PS:这里还可以结合flutter本身的模板几个字母就快速生成上面代码喔
最后我们在看看功能划分吧 首先dart_mars , 非常简单 , 就是入口文件+helper+模板, 然后项目下面: 是不是一目了然非常清晰 . 最后附一下darmars的地址
四、不足之处 1.目前看, 受制于dart生态 , 可能各种第三方插件兼容不会那么好 , 但是作为普通开发者做常用小项目的服务端是完全够用的 . 2. 对服务器的各种压测还是有待研究的 , 另外文档还有些地方没写完 ; 3.大佬项目如果有web管理后台的基础功能 ,就更好拉~
这些都是小问题了 , 相信dart_mars的思路会给大家很好的服务端开发启示~
以上是我研究几天下来对于dart_mars的了解, 我希望基于dart_mars现在的基础 , 花几个月打磨出更适合自己的基础服务器框架 , 以填补自己的服务端短板 , 再往后完善对应的app 和管理后台
希望今年有1个较好的社交demo或者博客demo出来 , 明年有机会尝试研究一下一件生成前后端 , 酷酷酷
最后附地址
源码在此 文档在此
|