天天看点

前端ThinkJS框架解析

Thinkjs里面很多特性来源于ThinkPHP,同时根据Node.js的特点,使用了Promise, WebSocket等特性,让代码更简洁、优雅。

Thinkjs最大的特色是对目前比较潮的语法特性支持的特别好,比如es6、es7、typescript等,有了这些,对aysnc/await等特性支持,让代码更加fashion。

安装命令行工具:

然后使用thinkjs new demo创建一个新项目。为了确保用户错误操作导致现有文件被覆盖,thinkjs new 命令仅适用于文件夹不存在的,或者空文件夹。否则会报如下错误:

实现这一特性其实是依赖一个项目根目录下的隐藏文件 .thinkjsrc ,使用 ls -a 可以查看隐藏文件,打开这个文件可以看到如下内容:

使用命令后,系统就开始构建项目了:

需要注意的是,新建项目的时候需要好多babel,所以项目的构建会比较慢,依赖的包主要有:

1)启动命令

那使用start后系统做了什么呢?

即使用Node执行www/development.js,这是env环境处理,thinkjs采用了3中env,比较常见的有:

development 开发模式

production 线上模式

testing 测试模式

thinkjs是把www当成node项目目录,而www下的static才是静态资源文件目录。

www/development.js目录如下:

当然,可以使用“tree src -L 3” 命令来查看项目的目录:

常见模块配置(后文会具体涉及):

此时目录结构如下:

3)业务模块目录

4)路由和view识别

路由识别,默认根据 模块/控制器/操作/参数1/参数1值/参数2/参数2值 其实就是一个约定。

比如/解析为:

默认模块是home

控制是index

操作是indexAction

那如果再来一个呢?

增加myAction,报错[Error] Error: can’t find template file /Users/sang/workspace/github/nodewebframework/demo/view/home/index_my.html

将view/home/index_index.html复制为view/home/index_my.html。原理是my要对应index_my.html模块。即index是controller,而my是action。

理解了这个,你就会觉得index_index这样的命名也不是很怪异了。剩下的就是view编写之类的,此处就不在熬述。

前面提到了,开发阶段采用babel写的,所以效率不会很高。

点惨,是吧?但是这是开发模式啊,我们肯定要拿线上的production模式来测试。

下面以同样的功能express + ejs模板的方式。

创建项目之后,基本的代码框架已经建立起来了,其中默认的 home 和 common 肯定是无法满足要求的。我们需要给自己的项目建立起相关的层次结构。这里给大家列举一些常见的模块分类方式。仅供参考。

官方网站、博客、社区等,这类系统结构较为简单,通常一个前端一个后端管理即可满足要求。通常需要包含以下模块:

电商平台系统主要考虑到入驻的商户、注册的客户、管理人员、运营人员等使用人群,还需要考虑到较大的功能模块切分(如果足够大到类似京东、天猫那种体量的系统,则需要进行数据、功能、服务、位置等角度的分割)。

实时推送平台不仅仅要处理 WebSocket 连接和消息囤积发送,还要处理多用户购买相应服务套餐、统计连接数、统计下行流量、进行连接鉴权等。通常包含的模块如下:

在线教育或直播平台通常具备实时音视频上传、转码、存储、广播等硬性要求,因此系统除了管理相关课件、学生、教师、选课等,还要负责处理相关媒体文件。

官网是这么描述配置文件加载顺序的:框架默认的配置 -> 项目模式下框架配置 -> 项目公共配置 -> 项目模式下的公共配置 -> 模块下的配置。

第三个和第四个则是在不同的项目创建模式下的默认 config 配置文件夹,位置在:

最后一个是指的在 module mode 下的项目,每个 module 自己的 config,位置在:

明白了多个地方多个配置文件的玩法之后,你可以创建多个 module,并给每个 module 配置自身独特的配置参数。

需要注意的是:thinkjs 加载配置文件是有顺序的!!!多个配置文件最终会在 thinkjs 运行时被全部加载,并合并在一起。所以当存在多个配置文件时,需要注意配置参数的 key(即属性名)尽量不要重复,因为按照加载顺序,后加载的 key 的值会覆盖先加载的 key 的值,导致出现不希望的结果。

举例来说,有两个配置文件 src/common/config/assets.js 和 src/home/config/assets.js,

开发时的工作代码都在 src 下面,运行时才会编译到 app 下面成为运行脚本(经过 Babel 编译),如果不想自己写的各种注释也出现在 app 下面的代码中,可以修改项目目录下的一个隐藏文件 .babelrc 增加相应 comments 参数。

目前,thinkJs支持两种控制器:普通的控制器和多级控制器。

支持__before和__after这样的回调钩子,对于app和controller控制来说是非常实用的。使用co来实现也是可圈可点,此处如果使用koa可以更加优雅。例如:

它的强大之处在于不仅可以作为 Node.js 项目的守护进程,还具备可配置化启动、分布式支持、内存监控、热重载(优雅重载)、支持数据统计、运行日志记录、实时运行监控、API 和脚本支持等强大的特性。

默认生成的 pm2 配置文件不含日志记录部分,如果不单独配置,pm2 的日志将会保存在安装目录中,查找起来很不方便。普遍的做法是:在项目目录下建立 logs 文件夹,用来放置 pm2 以及其他(诸如 log4js 等等)日志,打开 pm2.json ,给 apps[0] 增加如下几行配置参数:

error_file pm2 捕捉到的致命错误记录在这里

out_file pm2 接收到的 console 输出记录在这里

log_date_format 日期和时间格式

merge_logs 是否给日志文件增加进程id的后缀

主要优势:

完全自己实现,对已有框架很少借鉴

内置各种adapter,db,中间件,hook,插件,非常丰富,all in one 比组装更适合新手

遵循mvc和coc

使用最潮的es6/es7/ts特性,对aysnc函数,exports等都非常好的支持

支持i18n等实用功能

内置pm2和nginx集成,部署方便

有自己的脚手架,稍弱

性能不错,虽然比express稍弱,但功能强大许多

测试丰富,代码质量有保障

文档健全,是经过设计的,支持多语言

背后有75团和李成银支持,最近一周内有更新,代码提交2600+,35人贡献,整体来说算健康

继续阅读