Node.js 设计模式笔记 —— State 模式

JavaScript024

Node.js 设计模式笔记 —— State 模式,第1张

State 模式是一种特殊形式的 Strategy 模式:Context 选择的具体策略根据不同的 state 发生变化。

对于 Strategy 模式,可以基于不同的变量比如传入的参数来决定选择具体哪个策略,一旦选择确定后,直到 context 剩余的整个生命周期结束,该策略都保持不变。相反在 State 模式中,策略(或者在这里的语境下,叫做 状态 )在 context 的生命周期里是动态变化的,从而允许对象的行为可以根据内部状态的变化自适应地更改。

举例来说,我们需要创建一个宾馆预定系统,由一个 Reservation 类对预定房间的行为进行建模。

考虑如下一系列事件:

参考上图,可以实现 3 种 不同的策略,他们都实现了 confirm() 、 cancel() 、 delete() 这几个方法。每种策略的具体逻辑由不同的状态决定。 Reservation 对象只需要在每次状态切换时,激活对应的策略。

package.json :

failsafeSocket.js :

上述 FailsafeSocket 类主要由以下几个组件构成:

offlineState.js :

上述模块负责定义 socket 处于离线状态时的行为。

onlineState.js :

OnlineState 模块实现了当 socket 处于在线状态时的行为。

server.js :

client.js :

Node.js Design Patterns: Design and implement production-grade Node.js applications using proven patterns and techniques, 3rd Edition

今年七月份,我和几个小伙伴们合伙建立了一个开发团队。业务开展如火如荼的同时,团队宣传就提上了日程,所以迫切需要搭建公司网站出来。确

定目标后我们就开始考虑如果构建一个企业网站。先是进行业内调查,看了看别人家的网站是怎么做的。总体来讲,国外网站的设计和使用的技术总能比国内高很大

一截,国内很多公司,甚至是很多软件公司都不注重公司网站的构建,网站千篇一律,没有特色。很多网站都是使用Wordpress,然后自定义皮肤。也有一

些设计类公司,网站页面做的很漂亮,设计也前卫,但是前端源代码写的一塌糊涂。我们起初的方案也是想使用Wordpress作为基础来设计网站,网站UI

从已有开源的皮肤基础上修改。这样既能节省开发成本,又能体现独一无二。其实,刚开始也是这么做的,并且已经做出来了第一版了。只是实在是觉得和别人家的

网站差别不大,太普通了,并且网站也没有任何体现我们专注于Web开发这一特质。权衡再三之后,决定从头开发一个企业网站出来,使用我们团队擅长的技术重

新开发一个网站出来。决定前端使用AngularJS和Bootstrap构建,后端使用node.js和Express构建。经过一个多月的努力完成的项目的第一版。下面将详细介绍这个项目的基础结构设计。

项目整体设计

技术上,项目前端使用AngularJS和Bootstrap,后端使用node.js和Express。网站自动化构建工具使用grunt。网站整体应用了流行扁平化设计和响应式设计。当然,UI设计是我们团队的弱项,所以很多都是借鉴(抄袭)了别人的设计。网站前端代码基于HTML5,支持Chrome、Safari、Firefox及IE9+,使用IE8浏览器打开网站会自动跳转到引导用户下载现代浏览器的页面中。网站应用了响应式设计,所以在智能手机上也可以愉快地浏览。

项目是完全开源的,github上的地址是:eRealm,项目演示地址:eRealm Info &Tech。

代码结构介绍

推荐使用Webstorm打开项目。打开项目后,代码结构如下图所示:

在主体结构中从上到下介绍。app文件夹包含了所有后端代码;build文件夹中包含了最新数据库备份;config包含有网站整体的配置;logs文件夹包含网站后端记录的日志文件;node_modules是包含所有的node.js依赖包(源代码中初始没有此文件夹,运行npm install命令后所有加载的依赖包放置在此文件夹中);public文件夹包含了所有的前端代码,包括JavaScript、less、图片、Webfont等;.bowerrc中定义了bower管理前端库的下载地址;bower.json则配置了项目需要的前端库;.jshintre-client和.jshintrc-server分别为前后端JavaScript代码规范检查规则;.travis.yml为[travis](https://travis-ci.org/)自动编译配置;app.js为node.js启动脚本文件;build.sh为单独编写的自动发布bash命令;gruntfile.js为grunt配置文件;newrelic.js为newrelic的配置文件,用于监控网站性能;package.json包含了所有node.js依赖包配置。

项目后端结构

项目后端代码架构如下图所示:

主要分为两大部分:app和config。app里面按照职责不同来分类,每个脚本文件对应于不同的模块;api文件夹包含了所有api对应的业务逻辑代码,helper放置一些公用方法,如邮件发送、日志记录、数据库连接等等;templates放置的是静态邮件模板;views是后端页面模板,使用了handlebar模板引擎,其中http中放置系统错误显示页面,layouts放置模板页;routes是express对应的路由配置,所有的页面和API的路由配置都在这个文件中。config文件夹中为系统配置,按照不同环境分为开发和现场两个环境配置,all.js放置共通配置,development.js放置开发环境对应配置而production.js放置线上环境配置。配置内容包括邮件发送、数据库连接及一些第三方API所需的key等等。

项目前端结构

项目前端代码结构如下所示:

前端代码全部放置于public文件夹下。data目录包含一些静态json格式数据,后期可能会考虑放到数据库中。helper中是浏览器下载引导页面;images包含了所有项目中用到的图片,我们尽量使用第三方的图片服务器保存图片,一些小图标也尽量使用webfont。JavaScripts文件夹包含所有JavaScript文件,其中app子目录放置业务代码,业务代码都是按照业务不同封装成了不同的angularjs?controller;debug子目录放置调试用代码,而libs方式前端JavaScript库,项目中使用得JavaScript库有angularjs、jQuery及一些插件;clients.js是所有ajax请求函数;erealm.js是angularjs的主模块;language.js包含了所有多语言配置,目前支持中英文。stylesheets包含了所有的css样式及webfont,除了第三方库之外,自定义的样式全部使用了less。作为一种惯例,项目中添加了humans.txt文件,表明项目的作者信息。有关humans.txt,可以参考官方网站humans.txt。

自动化构建工具

项目自动化构建使用grunt。grunt的使用涉及开发、调试、发布阶段。开发阶段使用了图片压缩和前端代码格式美化,使用的工具是imagemin和jsbeautifier,运行grunt prepare命令。调试阶段使用了代码规范检查、less编译、自动添加浏览器前缀、自动加载运行nodejs并打开浏览器、实时监控代码变化并刷新页面等。开发中,使用grunt命令即可,为默认grunt命令。发布阶段包含了JavaScript及css合并压缩,并在文件路径上添加哈希值来避免浏览器缓存问题,同时删除开发环境中使用的代码,使用grunt build命令即可把代码切换为发布环境。

具体的使用grunt方法及相关工具的介绍,后期会有专门的技术文章讲解,这里不会详细设计技术细节。

后期持续的改进点

项目完成的比较仓促,但是我们尽量保持代码的整洁和可维护性,一些编码方式也借鉴当前流行的最佳实践。但理想是美好的,现实总是不会做到那么完美,需要不断的完善。目前存在的问题是后端代码结构不够清晰、整体代码中无用代码还没有来得及移除。框架上期望把jQuery去掉,只使用Angularjs,目前只做到了尽量不用jQuery中的方法。小图标的使用上Bootstrap和?Font Awesome重复,后期会逐步删除Font Awesome而只使用Bootstrap中带的小图标。目前,最大的问题是项目没有完整的自动化测试,这个后期会逐步添加。

总结

以上是这个开源项目的整体技术结构介绍。在这个项目中,我们会持续使用最流行的Web技术,希望得到大家的持续关注,如果有开发者能一块贡献一些代

码,我们将会非常高兴。我们已经在github.io上构建了一个技术平台来发布Web技术文章,网址是blog.erealm.cn。博客网址也同样开

源,使用了Jekyll构建。Jekyll非常强大,最大的特点是使用markdown格式来发布文章。博客的代码在这里:github。

我们做这个开源的项目的目的有两个,其一是通过这个项目来展示我们做Web项目的实力,及培养团队技术水平。其二是借助这个项目,能和同行们有个技

术上的互动和交流。如果我们的项目能让一些新手们学到一些做Web项目的经验,我们就很知足了。技术是不断革新的,而国内Web技术向来是落后于国外好几

年,这个是不争的事实。我们erealm团队乐意为国内Web贡献自己的力量,也欢迎国内同行们和我们交流Web开发经验。

前后端分离,前端nodejs运行环境,使用koa2集成负责资源分配与用户交互,实现token验证用户身份,路由控制。等!

自行 百度 解决;

"program": "${workspaceFolder}\app.js"

此处就是是将app.js作为启动文件。${workspaceFolder}代表根目录,vsc启动时会在根目录下找到并加载app.js文件。

参数介绍: name 项目名称、 version 版本号、 description 项目描述、 main 项目启动文件、 scripts 启动快捷设置, author 作者, dependencies 第3方中间件名称及版本。

最重要的

dependencies ”这里添加一些要用到的包,以上是这次要用到的所有的包,版本自己更改。

scripts ”这里是一些nodejs的便捷命令,上线的时候会用到,直接在终端中,package.json同级目录 ,执行‘npm start’ 即 可启动app.js。

别的没啥太大作用瞎写即可。

启动相关配置,封装到config/init.js中,启动文件直接引用即可

3-6-1、init.js项目核心。

异常友好处理方法封装

路由配置

视图渲染

核心集成

3-6-2、config.js项目参数配置。为什么不用json文件 因为json不能加注释

3-6-3、token.js项目token相关方法封装。

执行后项目结构会增加两个文件

新增

src/hello.js。

views/index.html

浏览器访问: http://127.0.0.1:3000/koa/login

输入值获取token

获取的token如图:

先不用带token进行访问: http://127.0.0.1:3000/koa/ hello/jiaobaba,被token拦截,返回401

带上token访问: http://127.0.0.1:3000/koa/ hello/jiaobaba

测试页面渲染,及跳转html页面,直接访问 http://127.0.0.1:3000/koa /views

结束!!!!!!

需要源码联系我