AngularJS巩固实践-28-《AngularJS深度剖析与最佳实践》笔记-需求分析

从本节开始,学习《AngularJS深度剖析与最佳实践》, 主要对前面的学习进行巩固加强,深入理解概念,同时记录一些最佳实践和技巧。

实例是一个小论坛系统,用于读者相互交流。从前端到后台,后台采用Java,业务目标,即一个明确的功能列表,不仅包括“要做什么”,还要包含“不做什么”,防止“需求蔓延”。

同时展示使用FrontJet初始化一个ng项目的组织结构应该是怎么样的,FrontJet是一个基于node的前端工具集, FrontJet 的安装非常简单,使用 cnpm install -g fj 即可, fj 是 FrontJet 的缩写,

它主要有以下亮点:

  • 可独立安装、升级。
  • 去掉了很多选项,直接选用经过实践检验的固定技术栈,简化创建过程。
  • 自带一个种子工程,里面包含根据实战经验总结出来的目录结构和开发指南,可用于创建新工程。
  • 自动注入项目中的 JavaScript 文件和 Scss 文件,引入 JavaScript 文件时会加上charset=”utf-8” 选项。
  • 对文件进行增删改时都能正常触发 reload。
  • 增加编译 Web font 的功能,即把一个 svg 文件放入 icons 目录,就会自动编译成font 文件(ttf、woff 等),以及相应的 Scss 文件。
  • 增加 Forks 功能,可生成针对不同操作系统的文件,开发服务器会根据浏览器所在的操作系统返回相应分支下的文件,这特别适合于手机版调试。
  • 增加 Mock 功能,基于 node-restify 库,生成一个内置的 Mock 服务器,可在与真实服务端对接之前提供一个模拟服务器。这些 Mock 数据也会被自动用于单元测试。
  • 增加内置的启动为 https 服务的功能,可用于排查 https 的特有问题。
  • 增加针对特定 URL 的反向代理、模拟延迟功能。反向代理虽然在 gulp-angular 中也有实现,不过比较粗糙,需要修改 gulp 源码才能工作,将其移到 fj.conf.js 中。模拟延迟则用于模拟真实环境中的网络延迟,以便设计更好的用户体验。
  • 在 Linux/Mac 下增加了系统级错误提示框:当 FrontJet 编译过程中发现语法错误时,会通过系统本身的通知功能显示一个错误提示框,以免被忽略。

这个结构中有很多 README.md 文件,用于解释当前目录的结构以及用途,它们不会出现在编译结果中,并且可以随意删除。也可以自行编辑它,用于在项目组中保持共识。

本项目的结构简介如下:

|– app(源码的根目录)
| |– animations(自定义动画)
| | |– README.md
| | -- ease.js(动画样例) | |-- app.js(app模块的定义文件) | |-- components(组件型指令) | | |-- README.md | |– layout(外框架)
| | |– _layout.html(模板)
| | |– _layout.js(控制器)
| | |– _layout.test.js(与控制器对应的单元测试)
| | |– _layout.scss(样式)
| | |– footer.html
| | |– footer.js
| | |– footer.scss
| | |– header.html
| | |– header.js
| | |– header.scss
| | |– menu.html
| | |– menu.js
| | -- menu.scss | |-- configs(配置) | | |-- README.md | | |-- config.js(config阶段的代码) | | |-- router.js(路由定义) | |– run.js(run阶段的代码)
| |– consts(常量)
| | |– README.md
| | -- api.js(API定义) | |-- controllers(控制器) | | |-- README.md | |– home(首页)
| | |– index.html(模板)
| | |– index.js(控制器)
| | |– index.scss(样式)
| | |– notFound.html(模板)
| | |– notFound.js(控制器)
| | -- notFound.scss(样式) | |-- decorators(装饰器型指令) | |– README.md
| |– favicon.ico(网站图标)
| |– filters(过滤器)
| | -- README.md | |-- forks(系统分支) | | |-- README.md | | |-- android(适用于安卓浏览器的文件) | | |– README.md
| | |– default(适用于其他系统的文件)
| | | -- README.md | |– ios(适用于iOS浏览器的文件)
| | -- README.md | |-- icons(svg图标源文件) | |– README.md
| |– images(普通图片)
| | |– README.md
| | -- logo.png | |-- index.html(首页) | |-- libraries(第三方非Angular库、非bower文件,会被最先引用) | |– README.md
| |– services(服务)
| | |– interceptors(拦截器,用于过滤通过Ajax上传或下载的数据)
| | | |– AuthHandler.js(401的处理器)
| | | |– ErrorHandler.js(其他4xx、5xx错误码的处理器)
| | | |– LoadingHandler.js(加载中界面)
| | | -- README.md | | |-- sao(服务访问对象) | | |– README.md
| | -- utils(工具类服务) | |– README.md
| -- styles(样式定义) | |-- README.md | |-- _app.scss(应用程序的定义,自动引入所有具体页面的Scss) | |-- _bootstrap.scss(对Bootstrap的样式重定义) | |-- _common.scss(具有跨项目复用价值的样式) | |-- _icons.scss(根据svg图标编译出的样式文件) | |-- _variables.scss(变量定义,包括对Bootstrap的覆盖式样式定义) |– main.scss(总的CSS文件,用于依次引入其他文件,一般不在此处定义样式)
|– bower.json(bower库的名称及版本列表)
|– bower_components(bower库文件)
|– dist(编译结果/供最终发布的文件)
|– fj.conf.js(FrontJet的配置文件,详情见注释)
|– mock(Mock服务器)
| |– README.md
| |– package.json
| |– resources(资源数据定义)
| | -- users.js | |-- routers(服务端路由实现) | |– users.js
| |– routers.js(路由列表)
| |– server.js(服务器启动文件)
| -- utils(工具类) |– resourceMixin.js
|– test(测试)
| |– e2e(端到端测试)
| | |– demo.js
| | -- readme.md | |-- karma.conf.js(Karma的配置文件,用于单元测试) | |-- protractor.conf.js(Protractor的配置文件,用于端到端测试) |– unit(单元测试)
| -- readme.md |-- .bowerrc(bower的配置文件,用于指定bower路径等) |-- .editorconfig(编辑器配置,用于在不同的编辑器之间统一缩进等代码风格) |-- .gitignore(Git的忽略列表,匹配的不会被添加到Git库中) |-- .jshintrc(JavaScript代码风格检查工具jshint的配置文件,用于定制代码检查规则) |-- tsd.json(第三方库名称及版本列表)– typings(第三方库定义)

其中 app 目录的内部结构都是可以任意调整的,不会影响 FrontJet 的运行。当要对传统项目使用 FrontJet 时,可以将其源文件拷贝到 app 目录下。