模块化

怎么分模块

AngularJS自己有模块的概念,但只是为controller、direcitive、service等提供一个集合的概念,并没有文件调度的功能。

官方推荐的模块分类方法是:

angular.module('app',['app.directive','app.controller','app.service'])

简单应用的话,这样分很方便。但是当controller、direcitive等都多了,并且互相有关联的时候(比如某个direcitive需要自己的controller),这样的分法就显得脏了。
改良方案很简单:将相关的directive、controller、service拆到一个同子文件夹中,形成以业务逻辑为关联的模块。如:

angular.module('app',['app.user','app.message']

怎么处理第三方模块

AngularJS的第三方模块都会有自己的模块名,如表格控件ngGrid就占用了ngGrid。这些模块名可能不符合我们的命名规则,但我的建议是不要去改动,免得升级什么的时候出问题。
那在哪里去声明对这些模块的依赖呢?我认为即使这个模块式所有子模块都要用的,也不要写成下面这样:

angular.module('app',['app.user','app.message','ngGrid']

而应该在直接需要这个第三方模块的模块里去写:

angular.module('app.user',['ngGrid'])

原因很简单,几乎所有的第三方模块都是不涉及到系统的业务逻辑的,当你把第三方模块和某一个业务逻辑模块混在一起的时候,其他模块也需要这个第三方模块时,你会很容易就去通过依赖这个混合的业务模块来获取第三方模块。或者说你的同事很可能会这么做。

目录结构

说道第三方模块就不得不说目录划分了。 大部分时候我们的目录结构是这样的:

--app
|--javascript
| |--*.js
|--css
| |--*.css
|--lib
| |--bootstrap

简单应用的话这样划分足够了。不过既然说到了模块化,你应该已经猜到我要说的结构了:

--app
|--thirdParty
| |--moduleA
| | |--js
| | |--css
| | |--lib
| | |--subModuleC
| |
| |--moduleB
|
|--system
| |--moduleC

不要说蛋疼,不要说“这在页面上加载脚本的时候还得一个一个去找js和css的位置”。如果你用grunt之类的工具的话应该知道这根本不是问题。这样划分的好处在于,几乎任何一个文件夹都是一个完整的模块,你可以随便拷贝到任何地方去测试什么,或者在其他简单环境开发好了再丢到系统目录下。systemthirdParty这两个目录的划分是用来区分通用模块和业务逻辑模块的。其实这就是典型的服务器端框架目录划分。 不过实际应用中,这样目录结构还是有问题。特别是当你使用less的时候,如果你的less文件依赖thirdParty中的less库,那你在测试的时候就不得不保持住这个相同的目录结构。
解决方法是将thirdPatry放在system里。如果你的模块不多,也可以把模块平行放置。

CSS和HTML

less

这里只讲less的规划。
首先在大应用里我不推荐直接使用bootstrap。虽然很好用,但是应用复杂了之后,必然会存在大量自己的样式。这时候html上的class就会乱成糊了。建议页面上只使用自己的class名,并且最好是有逻辑意义的。bootstrap可以作为底层。
这里值得一说的是命名规则。既然已经有了less,页面上就不再需要通过组合方式来控制元素的样式了,如果有class组合的话,应该都是有语言的。打个比方,以前的写法:

<div class="alert red">you are on fire.</div>

现在的写法:

<div class="message danger">you are on fire.</div>

less文件:

.message{.alert;} .danger{.red;}

怎么来区分模块和通用样式?很简单。每个模块占用同名的class名,首字母大写。当然你可以用其他的方式。在我的系统中,对通用class(如danger)添加具体样式是严格控制的。这样就能让样式的来源变得单一,当发现问题时,我马上就能知道到哪里去改。实例:

<div class="User"> <div class="User-name">Jason<div> <div class="User-signature important">Hahaha.</div> </div>

[转]基于AngularJS的前端架构(上)的更多相关文章

  1. 【react】使用 create-react-app 构建基于TypeScript的React前端架构----上

    写在前面 一直在探寻,那优雅的美:一直在探寻,那精湛的技巧:一直在探寻,那简单又直白,优雅而美丽的代码. ------ 但是在JavaScript的动态类型.有时尴尬的自动类型转换,以及 “0 == ...

  2. 基于AngularJS的前端云组件最佳实践

    AngularJS是google设计和开发的一套前端开发框架,他能帮助开发人员更便捷地进行前端开发.AngularJS是为了克服HTML在构建应用上的不足而设计的,它非常全面且简单易学习,因此Angu ...

  3. 基于AngularJS的企业软件前端架构[转载]

    这篇是我参加QCon北京2014的演讲内容: 提纲: 企业应用在软件行业中占有很大的比重,而这类软件多数现在也都采用B/S的模式开发,在这个日新月异的时代,它们的前端开发技术找到了什么改进点呢? B/ ...

  4. 基于 Angularjs&Node.js 云编辑器架构设计及开发实践

    基于 Angularjs&Node.js 云编辑器架构设计及开发实践 一.产品背景 二.总体架构 1. 前端架构 a.前端层次 b.核心基础模块设计 c.业务模块设计 2. Node.js端设 ...

  5. 用“MEAN”技术栈开发web应用(一)AngularJs前端架构

    前言 不知何时突然冒出“MEAN技术栈”这个新词,听起来很牛逼的样子,其实就是我们已经熟悉了的近两年在前端比较流行的技术,mongodb.express.angularjs.nodejs,由于这几项技 ...

  6. 基于AngularJS的个推前端云组件探秘

    基于AngularJS的个推前端云组件探秘 AngularJS是google设计和开发的一套前端开发框架,帮助开发人员简化前端开发的负担.AngularJS将帮助标准化的开发web应用结构并且提供了针 ...

  7. 在基于AngularJs架构的ABP项目中使用UEditor

    [前提须知] 读过此篇博客 了解angular-ueditor 了解ABP如何使用 会使用VS2017 [1.下载ABP模板] https://aspnetboilerplate.com/Templa ...

  8. 基于React的PC网站前端架构分析

    代码地址如下:http://www.demodashi.com/demo/12252.html 本文适合对象 有过一定开发经验的初级前端工程师: 有过完整项目的开发经验,不论大小: 对node有所了解 ...

  9. 基于Vue2.x的前端架构,我们是这么做的

    通过Vue CLI可以方便的创建一个Vue项目,但是对于实际项目来说还是不够的,所以一般都会根据业务的情况来在其基础上添加一些共性能力,减少创建新项目时的一些重复操作,本着学习和分享的目的,本文会介绍 ...

随机推荐

  1. 几款超实用的 CSS 开发工具

      当你开发一个网站或 web 应用程序的时候,有合适的工具,绝对可以帮助您节省大量的时间.在这篇文章中,我为大家收集了超有用的 CSS 开发工具. 对于 Web 开发人员来说,找到有用的 css 开 ...

  2. http 301、304状态码

    在利用httpwatch进行抓包分析时,我们经常会看到200.301.304这几个状态码.具本三者是什么意思呢? 200表示正常0k,这个是地球人都知道的了. 301 Moved Permanentl ...

  3. CThreadPool

    class CThreadPool { public: template <typename T> static void QueueUserWorkItem(void (T::*func ...

  4. VC++2010下编译STLport,Boost

    VC++2010下编译STLport,Boost 最近在想向Boost转移,努力掌握Boost代码的过程中, STLport版本:5.2.1 Boost版本:1.4.6.1 (1.4.7.0也OK) ...

  5. JSF 监听

    JSF项目中实现基于RBAC模型的权限管理设计(二) 转 4.3 权限验证模块设计 一个好的权限管理机制在项目中应用时,最好不要让程序员在具体业务代码的方法中来判断用户权限.因为这意味着大量重复的代码 ...

  6. rpm软件包

    安装软件:rpm -i software.rpm卸载软件:rpm -e software升级形式安装:rpm -U software-new.rpmrpm支持通过http.ftp协议安装软件:rpm ...

  7. IOS基础——IOS学习路线图(一)

    一.一个月 1.OC语法基础. 2.KVC和KVO 3.IOS UI基础 4.UI表视图与集合视图 5.UIStoryboard和autoLayout 6.Ipad API 二.10天 7.静态页面考 ...

  8. ASP.NET的错误处理机制之二(实例log4net)

    一.log4net下载:http://logging.apache.org/log4net/download_log4net.cgi 二.web.config配置如下: <?xml versio ...

  9. PHP中英文字符串截取函数无乱码(mb_substr)和获取中英文字符串字数函数(mb_strlen)

    mb_substr( $str, $start, $length, $encoding ) $str,需要截断的字符串 $start,截断开始处,起始处为0 $length,要截取的字数 $encod ...

  10. 基于Memcached的Session共享问题

    把Memcached的key(Guid)写入浏览器的cookie(类比SessionId) 存值: string sessionId = Guid.NewGuid().ToString(); Comm ...