一:bower介绍

1:全局安装安装bower

cnpm i -g bower

bower常用指令:

bower init    //初始化文件
bower install
bower uninstall

2:bower初始化配置:

bower init

后续的填写全部选yes

3:安装依赖(angularjs)这里可能会报没有安装git的错,所以我们还要安装git。

bower install -- save angular

4:创建.bowerrc

null>.bowerrc

这时候会提示null不是内部指令,但是没问题,已经创建好了。

然后在文件中输入:

{
"directory": "lib"
}

这段代码的意思是,接下来我们bower install后的依赖都会放在lib这个文件夹下

5:安装requirejs 

bower install --save requirejs

这时候我们发现angular和require都放到了lib这个文件夹下了

6:删除目录,卸载requirejs

刚才4、5步在项目中没啥用处,我们使用bower uninstall卸载requirejs,然后删除lib目录和bowerrc文件

bower uninstall --save requirejs

二:自动化构建工具gulp项目结构介绍

gulp新建目录

1:全局安装gulp

cnpm i -g gulp

2:定义node的安装模块文件package.json

npm init

后面需要填写的部分全部回车跳过

3:安装模块

模块安装的语法:cnpm i --save-dev xxxx

cnpm i --save-dev gulp

接下来我们批量安装其他的模块,多个模块之间用空格隔开:语法为cnpm i --save-dev xxxx xxxx xxxx xxxx

cnpm i --save-dev gulp-clean gulp-concat gulp-connect gulp-cssmin gulp-imagemin gulp-less gulp-load-plugins gulp-plumber gulp-uglify open

4:新建配置文件gulpfile.js

拷贝依赖文件的方法:

var gulp = require('gulp'); //引用gulp模块
var $ = require('gulp-load-plugins')(); //其他以gulp-开头的模块都不需要再定义变量了,可以直接用$引用
var open = require('open'); //这个不是以gulp开头,需要引用 var app = { //声明目录路径的全局变量
srcPath: 'src/',
devPath: 'build/',
prdPath: 'dist/'
};
gulp.task('lib', function() { //拷贝js的方法
gulp.src('bower_components/**/*.js') //读取bower_components路径下所有的js文件
.pipe(gulp.dest(app.devPath + 'vendor')) //dest()是写文件api
.pipe(gulp.dest(app.prdPath + 'vendor'))
});

接下来我们执行gulp lib。执行成功后会我们会将所有的依赖文件都拷贝到build和dist文件夹下

注意:如果这里报错:cannot find module xxx说明之前安装依赖时有的依赖没有安装上,那缺什么依赖我们就cnpm i xxx啥依赖

接下来写拷贝html的方法:

gulp.task('html', function() {
gulp.src(app.srcPath + '**/*.html') //读取app.srcPath路径下所有的html文件
.pipe(gulp.dest(app.devPath))
.pipe(gulp.dest(app.prdPath))
})

我们新建一个src文件夹,然后在src文件夹下新建index.html。view文件夹和view下的view.html

接着我们执行gulp html。执行成功后会我们会将index.html和view文件夹都拷贝到build和dist文件夹下

然后我们写拷贝json的方法,因为项目的数据没有和后台交互,所以我们要定义假的数据。

gulp.task('json', function() {
gulp.src(app.srcPath + 'data/**/*.json') //读取app.srcPath路径下所有的json文件
.pipe(gulp.dest(app.devPath + 'data'))
.pipe(gulp.dest(app.prdPath + 'data'))
});

在src文件夹下新建data文件夹,然后在data文件夹下新建1.json。 

接着我们执行gulp json。执行成功后会我们会将data文件夹和1.json都拷贝到build和dist文件夹下

接下来是拷贝less的方法:

gulp.task('less', function() {
gulp.src(app.srcPath + 'style/index.less') //读取app.srcPath路径下所有的less文件
.pipe($.less())
.pipe(gulp.dest(app.devPath + 'css'))
.pipe($.cssmin()) //生产环境压缩
.pipe(gulp.dest(app.prdPath + 'css'))
});

我们在src下新建style文件夹,然后在里面新建index.less

接着我们执行gulp less。执行成功后会我们会将css文件夹和index.css拷贝到build和dist文件夹下(这里的index.css是编译过后的index.less)

接下来是拷贝js的方法:

gulp.task('js', function() { //读取app.srcPath路径下所有的js文件
gulp.src(app.srcPath + 'script/**/*.js')
.pipe($.concat('index.js')) //合并js文件
.pipe(gulp.dest(app.devPath + 'js'))
.pipe($.uglify()) //生产环境压缩
.pipe(gulp.dest(app.prdPath + 'js'))
});

我们在src下新建script文件夹,然后在里面新建1.js和2.js,测试是否合并了js文件

接着我们执行gulp js。执行成功后会我们会将js文件夹和index.js拷贝到build和dist文件夹下(这里的index.js是合并过后的)

接下来是拷贝image的方法:

gulp.task('image', function() { //读取app.srcPath/image路径下所有的文件(jpg,png等)
gulp.src(app.srcPath + 'image/**/*')
.pipe(gulp.dest(app.devPath + 'image'))
.pipe($.imagemin()) //生产环境再压缩
.pipe(gulp.dest(app.prdPath + 'image'))
});

我们在src下新建image文件夹,然后在里面放入一个png格式的图片

接着我们执行gulp image。在这里可能会抛出一个unhanded error event。这个错误好像是这个图片压缩插件对win7不友好。

如果我们需要删除某个文件夹:

gulp.task('clean', function() {  //清除build和dist文件
gulp.src([app.devPath, app.prdPath])
.pipe($.clean());
});

接着我们执行gulp clean。执行完成后build和dist文件夹都被删除了。

合并上述方法:

gulp.task('build', ['image', 'js', 'less', 'lib', 'html', 'json']); //合并方法

执行gulp build后,会将执行合并的几个方法。

接下来是开启服务的方法:

gulp.task('serve', ['build'], function() {  //开启服务
$.connect.server({
root: [app.devPath], //根目录
livereload: true, // 热更新
port: 3000
});
open('http://localhost:3000'); gulp.watch('bower_components/**/*', ['lib']); //监控文件的变化,并实时编译
gulp.watch(app.srcPath + '**/*.html', ['html']);
gulp.watch(app.srcPath + 'data/**/*.json', ['json']);
gulp.watch(app.srcPath + 'style/**/*.less', ['less']);
gulp.watch(app.srcPath + 'script/**/*.js', ['js']);
gulp.watch(app.srcPath + 'image/**/*', ['image']);
});

执行gulp serve后,浏览器会打开http://localhost:3000。因为在win7上image这个方法会报错,所以我们得将build中的image和gulp.watch的image都去掉。编译成功后,我们直接修改index.html中的内容,保存一下发现页面已经刷新内容了(热更新)。gulp.watch这个方法使用的前提是需要给其监控的方法中加上一句代码

.pipe($.connect.reload());

:如html这个方法修改为:

gulp.task('html', function() {
gulp.src(app.srcPath + '**/*.html') //读取app.srcPath路径下所有的html文件
.pipe(gulp.dest(app.devPath))
.pipe(gulp.dest(app.prdPath))
.pipe($.connect.reload());
})

然后是默认的方法

gulp.task('default', ['serve']); //默认的方法

当我们执行gulp指令时,会执行默认的gulp serve。

三:页面的开发

模块划分: 本次应用划分为: 职位 搜索 用户

一:页面架构  :页面中的相对路径都是dist和build下的。

1:在index.html中引入angular.min.js和index.js

<script src="vendor/angular/angular.min.js" charset="utf-8"></script>
<script src="js/index.js" charset="utf-8"></script>

注意:这里的index.js是所有的js合并的js文件。

2:在script下新建app.js

'use strict';
angular.module('app', ['ui.router']); //全局对象angular,module方法可以创建模块,[]里面是模块的依赖。模块需要启动,第一种是angular.boostrap()

  

二:路由配置与安装 :

1:安装与引用

bower install --save angular-ui-router

之后我们在页面中引入: 这里的vendor其实是打包后dist和build下的文件目录。

<script src="vendor/angular-ui-router/release/angular-ui-router.min.js" charset="utf-8"></script>

然后在app.js中引入此模块

angular.module('app', ['ui.router']);

2:在script>config>router.js

'use strict'

angular.module('app').config(['$stateProvider', '$urlRouterProvider', function($stateProvider, $urlRouterProvider) {
$stateProvider.state('main', {
url: '/main',
templateUrl: 'view/main.html',
controller: 'mainCtrl'
})
$urlRouterProvider.otherwise('main');
}])

3:新建src>view>main.html

<div class="">
angular
</div>

4:新建script>controller>mainCtrl.js

'use strict';
angular.module('app').controller('mainCtrl', ['$scope', function($scope){ }]);

三:职位页面的开发

1:在main.html添加

<div app-head></div>
<div app-position-list></div>
<div app-foot></div>

2:添加head模板template>head.html

<div class="head">
<span>10秒定制职位</span>
<button>去登陆</button>
</div>

3:添加指令directive>head.js

'use strict';
angular.module('app').directive('appHead', [function(cache){
return {
restrict: 'A', //A是以属性方式调用指令
replace: true, //为true时,模板必须要有根元素
templateUrl: 'view/template/head.html'
};
}]);

4:添加样式文件style>template>head.less

@import '../variable.less';

.head {
background-color: @headBgColor;
.h(40);
.lh(40);
padding: 0 7px;
.text {
color: @defaultColor;
}
.custom {
background-color: @warnColor;
border-color: @warnColor;
color: @defaultColor;
border-style: dashed;
.mt(7);
.pl(15);
.pr(15);
}
.back-btn {
font-size: 20px;
width: 1rem;
left: 0;
}
}

样式文件需要在index.less中引用进来,我们也可以在index.less中将一些css方法写进去

@import 'template/head.less';

新建variable.less将主题颜色定义

@defaultColor: #fff;
@headBgColor: #12d5b5;
.............

新建property.less将一些具有固定值的css定义

.ta-l {
text-align: left;
}
.ta-c {
text-align: center;
}
.ta-r {
text-align: right;
}
。。。。。。

  

之后我们要在index.html中将css引入进来

  <link rel="stylesheet" href="/css/index.css" media="screen" title="no title" charset="utf-8">

四:搜索页面的开发

1:创建全局变量

在script>config>dict.js

'use strict';
angular.module('app').value('dict', {}).run(['dict', '$http', function(dict, $http){
$http.get('data/city.json').success(function(resp){
dict.city = resp;
});
$http.get('data/salary.json').success(function(resp){
dict.salary = resp;
});
$http.get('data/scale.json').success(function(resp){
dict.scale = resp;
});
}]);

如何使用全局变量:依赖注入并声明:

angular.module('app').controller('searchCtrl', ['dict', '$http', '$scope', function(dict, $http, $scope){

  

2:创建过滤器

新建script>filter>filterByObj.js

'use strict';
angular.module('app').filter('filterByObj', [function(){
return function(list, obj) {
var result = [];
angular.forEach(list, function(item){
var isEqual = true;
for(var e in obj){
if(item[e]!==obj[e]) {
isEqual = false;
}
}
if(isEqual) {
result.push(item);
}
});
return result;
};
}]);

使用:

找到需要使用的页面:

ng-repeat="item in data|filterByObj:filterObj"

这里的data是filterByObj的list参数(被过滤的对象),fliterObj是参数obj(过滤条件)。

 五:页面动画切换angular.animate.js

1:安装:

bower install --save angular-animate

2:使用:app.js中注入

angular.module('app', ['ui.router', 'ngCookies', 'validation', 'ngAnimate']);

  

 

项目文件夹:

bower_components:第三方依赖
src:源码
build: 编译后的开发环境代码
dist:压缩后生产环境代码
test:单元测试和集成测试代码
node_modules:node安装依赖包

  

基于angular+bower+glup的webapp的更多相关文章

  1. 我是如何基于angular+requirejs+node做SPA项目架构的

    本文章已经录制视频,地址是:http://v.youku.com/v_show/id_XODI3MjYyODI0.html 前端这两年技术飞速发展,各种优秀框架层出不穷.本文不是讨论各框架的比较,也不 ...

  2. 基于angular的route实现单页面cnodejs

    Angular ui-router 前言 之前不太理解前端怎么实现路由功能,以前知道有一种方式使用html5的pushState可以操作url才实现路由的功能,在实践项目中也用过一次,后来这种操作叫成 ...

  3. 基于ANGULAR.JS的下一代WEB应用开发-01-yeoman

    Angularjs 个人认为这是一款很好的框架!它将我们从AJAX应用的开发中解救了出来!嗯....废话就说道这里下面我们开始把! 首先我们必须了解一些核心的概念: 客户端模版 MVC 数据绑定 依赖 ...

  4. 项目演化系列--验证体系(基于angular的前端验证)

    前言 之前分享的<web项目演化--验证体系>中提到基于angular的验证,但是为了以防读者迷惑,能够好的理解验证体系,所以没有详细介绍. 今天特地补写一篇关于构建angular的验证. ...

  5. 基于 angular 规范的 commit

    基于 angular 规范的 commit commit格式如下: <type>: <subject> <BLANK LINE> <body> type ...

  6. 基于Angular和Spring WebFlux做个小Demo

    前言 随着Spring Boot2.0正式发布,Spring WebFlux正式来到了Spring Boot大家族里面.由于Spring WebFlux可以通过更少的线程去实现更高的并发和使用更少的硬 ...

  7. Ng-Matero:基于 Angular Material 搭建的中后台管理框架

    前言 目前市面上关于 Angular Material 的后台框架比较少,大多都是收费主题,而且都不太好用. 很多人都说 Material 是一个面向 C 端的框架,其实在使用其它框架做管理系统的时候 ...

  8. 推荐一款基于Angular实现的企业级中后台前端/设计解决方案脚手架

    ng-alain 是一个企业级中后台前端/设计解决方案脚手架,我们秉承 Ant Design 的设计价值观,目标也非常简单,希望在Angular上面开发企业后台更简单.更快速.随着『设计者』的不断反馈 ...

  9. Angular-chart.js 使用说明(基于angular.js工程)

    Angular-chart.js是基于Chart.js的angular组件,引入项目后直接操作数据即可. 引用方法:    分别将Chart.js.angular-chart.js.angular-c ...

随机推荐

  1. My collage goals

    PART ONE: THE GOALS OF GRADE ONE 1, Try my best to improve my GPA ,  keep it around 4.0 2, Learn mor ...

  2. 竞赛题解 - Karp-de-Chant Number(BZOJ-4922)

    Karp-de-Chant Number(BZOJ-4922) - 竞赛题解 进行了一次DP的练习,选几道题写一下博客~ 标签:BZOJ / 01背包 / 贪心 『题目』 >> There ...

  3. JSP/Servlet开发——第二章 JSP数据交互(一)

    1. JSP内置对象:JSP内置对象是 Web 容器创建的一组对象:   ●JSP常用的内置对象:out.request.application.session.response等: ●内置对象不需要 ...

  4. 5 替换空格 JavaScript

    题目描述 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy.   原来一个空格字符,替换之后 ...

  5. Linux入门——SSH免密登录

    SSH免密登录 1.简介 SSH是一种网络协议,用于计算机之间的加密登录. 本文针对的实现是OpenSSH,它是自由软件,应用非常广泛. 2.初始化公钥私钥 有rsa,dsa两种加密方式,生成的公钥私 ...

  6. 理解golang中的channel

    channel是goroutine之间的通信机制.可以类比线程间的通信,线程间的通信有多种方式,比如线程上下文.共享内存.IPC通信.socket实现不同机器间的通信. channel用起来很简单,绑 ...

  7. 常用数字信号的产生(C实现)-均匀分布&正态分布

    小白博主开始学DSP之路,为了激励自己能坚持下去,写一系列博客来记录下来,也欢迎与大家一起讨论.介于我能力所限,这里学习目标定为,学习一个基础知识,写一个C语言程序实现, 最后会形成一个C的函数库,方 ...

  8. linux之sed基础命令详解

    sed (Stream  EDitor)是一个强大的字符流编辑器,输入一般是来自文件,默认情况下不编辑原文件,仅对模式空间中的数据作处理;而后,将模式空间打印到屏幕显示 sed基础用法 sed [op ...

  9. 为什么我要放弃javaScript数据结构与算法(第九章)—— 图

    本章中,将学习另外一种非线性数据结构--图.这是学习的最后一种数据结构,后面将学习排序和搜索算法. 第九章 图 图的相关术语 图是网络结构的抽象模型.图是一组由边连接的节点(或顶点).学习图是重要的, ...

  10. 统一建模语言——UML

    一.UML概述 Unified Modeling Language (UML)又称统一建模语言或标准建模语言,是始于1997年一个OMG标准,它是一个支持模型化和软件系统开发的图形化语言,为软件开发的 ...