Hybrid框架UI重构之路:三、工欲善其事,必先利其器
工欲善其事,必先利其器,事是重构的目标,器是开发环境。
这篇文章将讲述重构时的UI框架的目录结构,且需要使用的开发工具。
目录结构

demo : 开发框架的模板(单页模式)
demo-muti : 开发框架的模板(多页模式)
demo-scene : 示例模板。一个完整的示例,目的是给使用者稍作修改就可以使用在项目上。
demo-template : 给使用者使用的开发模板。
demo-whole : 可在PC上演示的示例模板
dist : UI框架的提供的库
doc : 文档目录
libs : UI框架依赖的库,注明版本。
node_modules : node工具
src : UI框架源码
Gruntfile.js : Gruntfile.js配置css、image、javascript、html合并、压缩等
package.json : package.json文件来声明项目中使用的node模块
关于less的这个工具的文章很多,我也就不详细说,主要为了方便 CSS 的书写及维护、复用。
其实使用less,有利也有弊,但总归利大于弊。
1.一看就了解样式应用的范围(这是我觉得最好的地方),比纯css好理解。
.module {
div {
a {
//styles
}
}
}
2.LESS 在 CSS 的语法基础之上,引入了变量,Mixin(混入),运算以及函数等功能,大大简化了 CSS 的编写,并且降低了 CSS 的维护成本。
1.毕竟最后生成的样式跟最初less样式还是有些区别,当页面样式做调整的时候(一般是在chrome调试),调试完样式后,又要将自己修改的样式写成less样式,看起来麻烦很多。
例:
自己增加了
.module li {
line-height:18px;
}
后面写回less样式
.module {
li {
line-height:18px;
}
}
然后再重新生成css文件。
另外我使用的也只有两条简单的命令
lessc xxx.less > xxx.css
lessc -x xxx.less > xxx.min.css
后面那条是压缩后的文件。
grunt这个工具(nodeJs的命令行工具),我用来做Javascript文件的合并、压缩和复制。
以前UI框架的版本是一个大文件bingotouch.css,js也是。这是不利于我们开发的,于是我将他们拆分成模块,拆分之后又面临合并的问题,于是就使用grunt这个工具。
1、nodeJs环境
因为grunt是基于nodeJs的,所以首先需要安装nodeJS环境
2、安装grunt
安装grunt,因为我们可能在任何目录下运行打包程序,所以我们需要安装CLI
grunt的命令行:
npm install -g grunt-cli
3、编写package.json(声明项目中使用的node模块)
{
"name":"BingoTouch",
"version":"3.0.0",
"engines":{
"node":">= 0.8.0"
},
"devDependencies":{
"grunt":"~0.4.0",
"grunt-contrib-concat":"~0.3.0",
"grunt-contrib-copy" : "~0.4.1",
"grunt-contrib-cssmin" : "~0.6.0",
"grunt-contrib-uglify":"~0.2.0",
"express":""
}
}
grunt-contrib-concat : 文件合并
grunt-contrib-copy : 文件复制
grunt-contrib-cssmin : css压缩
grunt-contrib-uglify : js压缩
4、编写Gruntfile.js
module.exports = function(grunt){
grunt.initConfig({
pkg : grunt.file.readJSON('package.json'),
concat : {
'dist/bingotouch.js' :
['demo/js/ui.js',
"demo/js/module/ui.GarbageCollection.js",
'demo/js/module/ui.plugins.js',
'demo/js/module/ui.Utils.js',
'demo/js/module/ui.Element.js',
'demo/js/module/ui.Transition.js',
'demo/js/module/ui.Page.js',
'demo/js/module/ui.IScroll.js',
'demo/js/module/ui.alias.js',
'demo/js/module/ui.Popup.js',
'demo/js/module/ui.Skin.js',
'demo/js/module/ui.Menu.js',
'demo/js/module/ui.Tab.js',
'demo/js/module/ui.SwipeListview.js',
'demo/js/plugin/zepto.extend.js',
'demo/js/plugin/zepto.ui.js',
'demo/js/plugin/zepto.ui.slider.js',
'demo/js/plugin/zepto.ui.navigator.js',
'demo/js/plugin/zepto.ui.navigator.iscroll.js']/*,
'dist/bingotouch.css' : ['demo/css/base.css','demo/css/module/*.css']*/
},
uglify : {
target : {
files : {
'dist/bingotouch.min.js': 'dist/bingotouch.js'
}
}
}/*,
cssmin : {
target : {
files : {
'dist/bingotouch.min.css': 'dist/bingotouch.css'
}
}
}*/,
copy : {
target : {
files : [
{expand: true,cwd: 'dist/',src: ['bingotouch.js'],dest: 'demo/js/'} ,
{expand: true,cwd: 'dist/',src: ['bingotouch.js','bingotouch.min.js'],dest: 'demo-muti/js/'} ,
{expand: true,cwd: 'dist/',src: ['bingotouch.js'],dest: 'demo-scene/link/js/'} ,
{expand: true,cwd: 'dist/',src: ['bingotouch.js'],dest: 'demo-scene/news/js/'} ,
{expand: true,cwd: 'dist/',src: ['bingotouch.js'],dest: 'demo-scene/business/js/'} ,
{expand: true,cwd: 'dist/',src: ['bingotouch.js','bingotouch.min.js'],dest: 'demo-template/js/'} ,
{expand: true,cwd: 'dist/',src: ['bingotouch.js'],dest: 'demo-whole/js/'} ,
{expand: true,cwd: 'dist/',src: ['bingotouch.js'],dest: 'doc/api-doc/'} ,
{expand: true,cwd: 'demo/js/plugin/',src: ['linkplugins.js','sharesdkplugin.js'],dest: 'doc/api-doc/'},
{expand: true,cwd: 'demo/css/',src: ['bingotouch.css','bingotouch.min.css'],dest: 'demo-muti/css/'} ,
{expand: true,cwd: 'demo/css/',src: ['bingotouch.css'],dest: 'demo-scene/link/css/'} ,
{expand: true,cwd: 'demo/css/',src: ['bingotouch.css'],dest: 'demo-scene/news/css/'} ,
{expand: true,cwd: 'demo/css/',src: ['bingotouch.css'],dest: 'demo-scene/business/css/'} ,
{expand: true,cwd: 'demo/css/',src: ['bingotouch.css','bingotouch.min.css'],dest: 'demo-template/css/'} ,
{expand: true,cwd: 'demo/css/',src: ['bingotouch.css'],dest: 'demo-whole/css/'}
]
}
}
});
grunt.loadNpmTasks('grunt-contrib-concat');
grunt.loadNpmTasks('grunt-contrib-uglify');
/*grunt.loadNpmTasks('grunt-contrib-cssmin');*/
grunt.loadNpmTasks('grunt-contrib-copy');
grunt.registerTask('default', ['concat','uglify'/*,'cssmin'*/,'copy']);
}
这文件的配置是我重构后,css和js的合并、压缩、复制。细心的人会发现cssmin的功能我没使用,这是因为我的css是less编写的,所以css文件的合并压缩也就由less工具完成。
文档是作为框架必不可少的一部分,如果快捷方便生成文档也是我们考虑的。
这是我之前对文档化工具的调查:http://www.cnblogs.com/lovesong/p/3267047.html
我选择了yuidoc作为文档化工具,下面是我生成的文档。

在此说下一些YUIDoc的信息
YUIDoc是个NodeJS应用,能将你JS代码中的注释生成HTML格式的API文档。
事实上,不仅是JS,任何支持块注释(指/* */)的语言都能用。
只解析YUIdoc的注释块,不解析源代码。
1.安装NodeJS,下载地址:http://nodejs.org/download/
2.打开cmd,执行命令npm -g install yuidocjs,即可安装YUIDoc。
1.设定一个类即@class之后,YUI默认把之后函数或属性归属为这个类,直到有类重新定义。
2.注释方式
/**
YUIDoc会认这以两个星开头的
*/
/*
YUIDoc不认一个星开头的
*/
3.每个注释块中能有且仅有一个主标签
由于标签的介绍内容太多,就不在这里介绍了。
YUIDoc模板
页面生成模板。根据我们注释的标签(充当数据源),在根据页面模板(视图),生成文档。

github上有很多主题模板,而上面图片的使用的模板是我觉得最好看的,所以就选择了这个。
PS:github是好东西,善用能帮我们很多。
yuidoc.json
生成文档有个命令,一般我是准备好注释好的js文件,在加上一个yuidoc.json的配置文件,然后是控制台cd到这个目录,执行命令。
yuidoc .
简单描述下yuidoc.json的东西
{
"name": "BingoTouch API",
"description": "让开发人员可以使用Web开发技术,如:HTML5、CSS3、Javascript等,开发出与原生程序具有相同用户体验的移动终端应用",
"version": "3.1.0 Powered By 云应用平台部",
"url": "XXXXXXXXXXXXXXX",
"options": {
"linkNatives": "true",
"outdir": "./docs",
"paths":"code/",
"themedir": "../yuidoc-theme-blue-master"
}
}
这里有两个重要的属性
outdir : 生成的文档放置的文件路径。
themedir : 这个是之前所说的主题模板,如果没有设则模式使用yuidoc的默认模板。
这篇工具的说明就到此了,工具的使用无非就是为了方便开发,上面的描述也许不这么详细,希望是做到指引的作用。
Hybrid框架UI重构之路:三、工欲善其事,必先利其器的更多相关文章
- Hybrid框架UI重构之路:四、分而治之
上文回顾:Hybird框架UI重构之路:三.工欲善其事,必先利其器 上一篇文章有说到less.grunt这两个工具,是为了css.js分模块使用的.UI框架提供给使用者的时候,是一个大的xxx.js. ...
- Hybrid框架UI重构之路:六、前端那点事儿(Javascript)
上文回顾 :Hybird框架UI重构之路:五.前端那点事儿(HTML.CSS) 这里讲述在开发的过程中,一些JS的关键点. 换肤 对于终端的换肤,我之前一篇文章有说了我的想法. 请查看:http:// ...
- Hybrid框架UI重构之路:五、前端那点事儿(HTML、CSS)
上文回顾 :Hybird框架UI重构之路:四.分而治之 这里讲述在开发的过程中,一些HTML.CSS的关键点. 单页模式的页面结构 在单页模式中,弱化HTML的概念,把HTML当成一个容器,BODY中 ...
- Hybrid框架UI重构之路:二、事出有因
上文回顾:Hybird框架UI重构之路:一.师其长技以自强 一切的重构都是有原因的,或许为了更快速度.更好体验.更快捷开发等,于是就有了自己的开发目标,简单看看未重构前UI("中国移动式&q ...
- Hybrid框架UI重构之路:一、师其长技以自强
这两年在支撑公司的Hybrid框架的运维发展,让人确认这种移动开发方式确实是一条不错的路.混合应用这种开发方式降低开发难度,极大的提高开发效率,最重要的一点效果可以接近原生应用.框架的本身是需要持续不 ...
- quickhybrid】如何实现一个Hybrid框架
章节目录 [quickhybrid]如何实现一个跨平台Hybrid框架 [quick hybrid]架构一个Hybrid框架 [quick hybrid]H5和Native交互原理 [quick hy ...
- Android Studio重构之路,我们重新来了解一下Google官方的Android开发工具
Android Studio重构之路,我们重新来了解一下Google官方的Android开发工具 记得我的第一篇博客就是写Android Studio,但是现在看来还是有些粗糙了,所有重构了一下思路, ...
- 【quickhybrid】如何实现一个Hybrid框架
章节目录 [quickhybrid]如何实现一个跨平台Hybrid框架 [quick hybrid]架构一个Hybrid框架 [quick hybrid]H5和Native交互原理 [quick hy ...
- (转)Android项目重构之路:界面篇
在前一篇文章<Android项目重构之路:架构篇>中已经简单说明了项目的架构,将项目分为了四个层级:模型层.接口层.核心层.界面层.其中,最上层的界面,是变化最频繁的一个层面,也是最复杂最 ...
随机推荐
- 如何用Python输出PPT中的文字信息
在这里,会用到win32com模块 模块下载地址:http://sourceforge.net/projects/pywin32/files/pywin32/ 代码如下: import win32co ...
- RAC Concept
1. RAC的高可用性 RAC的高可用性主要包含以下几点: 1> 实现节点间的负载均衡. 2> 实现失败切换的功能. 3> 通过Service组件来控制客户端的访问路径. 4> ...
- Redis安装配置与Jedis访问数据库
一.NOSQL概要 NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,泛指非关系型的数据库.NoSQL数据库的四大分类 键值(Key-Value)存储数据库 这一类数据 ...
- Web 前端开发人员和设计师必读文章推荐【系列二十八】
<Web 前端开发精华文章推荐>2014年第7期(总第28期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...
- ProGuard代码混淆技术详解
前言 受<APP研发录>启发,里面讲到一名Android程序员,在工作一段时间后,会感觉到迷茫,想进阶的话接下去是看Android系统源码呢,还是每天继续做应用,毕竟每天都是画UI ...
- 如何用Ajax加载服务器的图片
用Ajax请求服务器的图片,并显示在浏览器中 前言 一直在数据库里面存的都是图片在服务器的地址,然后再到浏览器中显示,但是发现两个问题 第一:为了安全起见,js是无法读取本地的图片的,不然你写一个js ...
- Android反编译(三)之重签名
Android反编译(三) 之重签名 [目录] 1.原理 2.工具与准备工作 3.操作步骤 4.装X技巧 5.问题 1.原理 1).APK签名的要点 a.所有的应用程序都必须有数字证书 ,Androi ...
- asp.net App_Code文件夹相关操作
最近用到了App_Code文件夹,想要实现动态编译文件的方式,即替换文件夹中的类文件从而达到实时修改代码的效果,类似web.config,网上查到的资料基本都是把文件夹中的类文件修改属性为" ...
- 在SQL Server 2016里使用查询存储进行性能调优
作为一个DBA,排除SQL Server问题是我们的职责之一,每个月都有很多人给我们带来各种不能解释却要解决的性能问题. 我就多次听到,以前的SQL Server的性能问题都还好且在正常范围内,但现在 ...
- Android Studio的git功能的使用介绍
本文介绍Android Studio(下面简称AS)中git工具的一些简单使用.因为AS为git的使用提供了很多人性化的图形界面操作,在很大程度上可以增加开发效率.本文面向新手,题主自己也是新手一枚, ...