[转]基于AngularJS的前端架构(上)
模块化
怎么分模块
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之类的工具的话应该知道这根本不是问题。这样划分的好处在于,几乎任何一个文件夹都是一个完整的模块,你可以随便拷贝到任何地方去测试什么,或者在其他简单环境开发好了再丢到系统目录下。system和thirdParty这两个目录的划分是用来区分通用模块和业务逻辑模块的。其实这就是典型的服务器端框架目录划分。 不过实际应用中,这样目录结构还是有问题。特别是当你使用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的前端架构(上)的更多相关文章
- 【react】使用 create-react-app 构建基于TypeScript的React前端架构----上
写在前面 一直在探寻,那优雅的美:一直在探寻,那精湛的技巧:一直在探寻,那简单又直白,优雅而美丽的代码. ------ 但是在JavaScript的动态类型.有时尴尬的自动类型转换,以及 “0 == ...
- 基于AngularJS的前端云组件最佳实践
AngularJS是google设计和开发的一套前端开发框架,他能帮助开发人员更便捷地进行前端开发.AngularJS是为了克服HTML在构建应用上的不足而设计的,它非常全面且简单易学习,因此Angu ...
- 基于AngularJS的企业软件前端架构[转载]
这篇是我参加QCon北京2014的演讲内容: 提纲: 企业应用在软件行业中占有很大的比重,而这类软件多数现在也都采用B/S的模式开发,在这个日新月异的时代,它们的前端开发技术找到了什么改进点呢? B/ ...
- 基于 Angularjs&Node.js 云编辑器架构设计及开发实践
基于 Angularjs&Node.js 云编辑器架构设计及开发实践 一.产品背景 二.总体架构 1. 前端架构 a.前端层次 b.核心基础模块设计 c.业务模块设计 2. Node.js端设 ...
- 用“MEAN”技术栈开发web应用(一)AngularJs前端架构
前言 不知何时突然冒出“MEAN技术栈”这个新词,听起来很牛逼的样子,其实就是我们已经熟悉了的近两年在前端比较流行的技术,mongodb.express.angularjs.nodejs,由于这几项技 ...
- 基于AngularJS的个推前端云组件探秘
基于AngularJS的个推前端云组件探秘 AngularJS是google设计和开发的一套前端开发框架,帮助开发人员简化前端开发的负担.AngularJS将帮助标准化的开发web应用结构并且提供了针 ...
- 在基于AngularJs架构的ABP项目中使用UEditor
[前提须知] 读过此篇博客 了解angular-ueditor 了解ABP如何使用 会使用VS2017 [1.下载ABP模板] https://aspnetboilerplate.com/Templa ...
- 基于React的PC网站前端架构分析
代码地址如下:http://www.demodashi.com/demo/12252.html 本文适合对象 有过一定开发经验的初级前端工程师: 有过完整项目的开发经验,不论大小: 对node有所了解 ...
- 基于Vue2.x的前端架构,我们是这么做的
通过Vue CLI可以方便的创建一个Vue项目,但是对于实际项目来说还是不够的,所以一般都会根据业务的情况来在其基础上添加一些共性能力,减少创建新项目时的一些重复操作,本着学习和分享的目的,本文会介绍 ...
随机推荐
- Android开发如何去除标题栏title
虽然是一个小问题,今天遇到了,也就写下来吧.防止自己忘掉. 取消标题栏的方式有两种,一种是在代码添加,另一种是在AndroidManifest.xml里面添加. 1.在代码中实现:在此方法setCon ...
- 百度地图API示例之文本标注
代码 <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" cont ...
- JAVA语法细节(1)
1.变量的作用域 变量的作用域从变量定义的位置开始,到变量所在的那对大括号结束.变量定义内存开辟一块空间用于该变量,变量到达作用域时,该变量从内存中消失. 2.变量的数据类型 变量基本数据类型:byt ...
- spring+hibernate--直接修改数据库,再通过hibernate查询数据不变
这个问题已经很多天了,一直没有时间解决,不过还好是自己的项目,没什么影响. 刚好今天没事,想好好解决一下这个问题. hibernate主要配置如下: <property name="h ...
- ntfs安全权限和共享权限的区别
win xp 最大分区32G,最大文件大小4G. 共享权限是为网络用户设置的,NTFS权限是对文件夹设置的. 用户对文件夹有什么权限就是看NTFS权限的设置. 如果一个文件夹设置成共享,其具体的权限还 ...
- linq to xml 基本操作
使用XDocument类来进行简单的xml操作,用于软件参数的设置保存. using System; using System.Collections.Generic; using System.Li ...
- 支持在安卓中UI(View)的刷新功能
这是一款可以支持在安卓中UI(View)的刷新功能,Android中对View的更新有很多种方式,使用时要区分不同的应用场合.我感觉最要紧的是分清:多线程和双缓冲的使用情况. 现在可以尝试理解下 ...
- CSS3实现轮播图效果2
先前用CSS3做了一个一张图片实现的轮播,但是这样的图片很难找,于是又改进了一下. HTML: <div class="box"> <ul> <li& ...
- Sublime Text 使用 Emmet 补全错误问题
Sublime Text安装了Emmet后,使用Tab或者ctrl+e发现补全有问题,如: div.testClass#testId 变成了 div.<testClass id="te ...
- 配置Nginx服务
一,安装之前准备1.nginx依赖: gcc openssl-devel pcre-devel zlib-devel 安装依赖:yum install gcc openssl-devel pcr ...