Angular.js项目中使用gulp实现自动化构建以及压缩打包详解


Posted in Javascript onJuly 19, 2017

gulp介绍

基于流的前端自动化构建工具,利用gulp可以提高前端开发效率,特别是在前后端分离的项目中。使用gulp能完成以下任务:

  • 压缩html、css和js
  • 编译less或sass等
  • 压缩图片
  • 启动本地静态服务器
  • 其他

目标

  • 一键安装项目所有的依赖模块
  • 一键安装项目所有的依赖库
  • 代码检查确保严格语法正确
  • 能将angularjs的html装换成js模块并且压缩到js文件中
  • 将所有css文件合并压缩
  • 将所有的js文件合并压缩
  • 动态引入资源文件
  • 拥有开发环境和生产环境两种打包方式

工具

  • npm基于node的包管理器
  • gulp基于node文件流的构建系统
  • bower是Web开发中的一个前端文件包管理器

实现过程

1、一键安装项目所有的依赖模块

创建项目使用命令(项目目录下)

npm init
//生成package.json
{
 "name": "leason",
 "version": "1.0.0",
 "description": "test for angular and gulp and unit testing",
 "main": "gulpfile.js",
 "dependencies": {
 },
 "devDependencies": {
 },
 "scripts": {
 "test": "echo \"Error: no test specified\" && exit 1"
 },
 "repository": {

 },
 "keywords": [
 "leason"
 ],
 "author": "leason",
 "license": "ISC",
 "bugs": {
 },
}

npm安装依赖模块采用命令

npm install xxx --save  //保存到dependencies(生产)
npm install xxx --save-dev //保存到devDependencies(开发)

package.json中保存相应模块,项目重新部署只需要命令

npm install //安装package中所有模块

一键安装项目所有的依赖模块使用bower管理器,用法和npm类似

2、语法检查

npm install gulp-jshint --save-dev
//代码语法检查命令--gulp jshint
var jshint = require('gulp-jshint'); //代码检查
gulp.task('jshint', function () {
 return gulp.src(paths.js)
 .pipe(jshint())
 .pipe(jshint.reporter('default'));
});

转换html为js模块

npm install gulp-angular-templatecache --save-dev
//合并html模板命令--gulp template
var templateCache = require('gulp-angular-templatecache');
gulp.task('template', function () {
 return gulp.src(['./templates/**/*.html','./templates/*.html'])
 .pipe(templateCache({module: 'templates'}))
 .pipe(gulp.dest('./js'))
});

3、将所有css文件合并压缩

npm install gulp-cssmin --save-dev
//合并压缩css命令--gulp deployCSS
var cssmin = require('gulp-cssmin');
gulp.task('deployCSS', function() {
 return gulp.src(paths.css)
 .pipe(cssmin())
 .pipe(concat('all.css'))
 .pipe(gulp.dest('./build'));
});

4、将所有js文件合并压缩

npm install gulp-uglify --save-dev  //压缩
npm install gulp-concat --save-dev  //合并
npm install gulp-sourcemapsy --save-dev //处理 JavaScript 时生成 SourceMap
npm install gulp-strip-debug --save-dev //去除打印
//测试生产两种js压缩命令--生产gulp js --prod测试gulp js --dev
gulp.task('js', function(type) {
 console.log(type);
 if (type == 'dev') { // dev
 return gulp.src(paths.js)
  .pipe(concat('all.js'))
  .pipe(gulp.dest('./build'));
 } else { // prod
 return gulp.src(paths.js)
  .pipe(sourcemaps.init())
  .pipe(stripDebug())
  .pipe(uglify())
  .pipe(concat('all.min.js'))
  .pipe(sourcemaps.write())
  .pipe(gulp.dest('./build'));
 }
});

5、根据现有文件想index中引入

npm install gulp-inject --save-dev

index.html中标识写入的位置如:

<!doctype html>
<html>
<head>
 <meta charset="utf-8">
 <title ng-bind="headTitle"></title>
 <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
 <!-- bower:css -->
 <!-- endinject -->
 <!-- inject:css -->
 <link rel="stylesheet" href="build/all.css" rel="external nofollow" >
 <!-- endinject -->
 <!-- bower:js -->
 <!-- endinject -->
 <!-- inject:js -->
 <script src="build/all.min.js"></script>
 <!-- endinject -->
</head>
<body ng-app="starter">
 <div ui-view></div>
</body>
</html>

开发环境

//dev资源引用命令--gulp devIndex
gulp.task('devIndex', ['clean', 'jshint'], function () {
 // It's not necessary to read the files (will speed up things), we're only after their paths:
 return gulp.src('./index.html')
 .pipe(inject(gulp.src(paths.js, {read: false}), {relative: true}))
 .pipe(inject(gulp.src(paths.css, {read: false}), {relative: true}))
 // .pipe(inject(gulp.src(bowerFiles(), {read: false}), {name: 'bower', relative: true}))
 .pipe(gulp.dest('./'));
});

生产环境

//生产环境资源引用命令--gulp deployIndex
gulp.task('deployIndex', ['clean', 'jshint', 'template', 'js', 'deployCSS'], function () {
 // It's not necessary to read the files (will speed up things), we're only after their paths:
 return gulp.src('./index.html')
 .pipe(inject(gulp.src(paths.buildjs, {read: false}), {relative: true}))
 .pipe(inject(gulp.src(paths.buildcss, {read: false}), {relative: true}))
 // .pipe(inject(gulp.src(bowerFiles(), {read: false}), {name: 'bower', relative: true}))
 .pipe(gulp.dest('./'));
});

注意点

代码混淆过会使angular的依赖注入无法识别,所以代码编写的过程中要使用严格依赖的写法。如

angularApp.config(['$routeProvider','$stateProvider','$urlRouterProvider',function($routeProvider,$stateProvider,$urlRouterProvider) {
 $stateProvider
 .state('sidebar', {
  url: '/sidebar',
  // abstract: true,
  templateUrl: 'templates/sidebar.html',
  controller: 'sidebarCtrl'
 })
 $urlRouterProvider.otherwise('/sidebar/tab1');
}]);

总结

以上就是这篇文章的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
jquery 单击li防止重复加载的实现代码
Dec 24 Javascript
Javascript弹出窗口的各种方法总结
Nov 11 Javascript
jquery.mobile 共同布局遇到的问题小结
Feb 10 Javascript
js/jquery判断浏览器类型的方法小结
May 12 Javascript
JavaScript实现的类字典插入或更新方法实例
Jul 10 Javascript
Angular2 多级注入器详解及实例
Oct 30 Javascript
js封装tab标签页实例分享
Dec 19 Javascript
javascript 网页进度条简单实例
Feb 22 Javascript
vue轮播图插件vue-concise-slider的使用
Mar 13 Javascript
全面解析vue router 基本使用(动态路由,嵌套路由)
Sep 02 Javascript
关于Vue Router中路由守卫的应用及在全局导航守卫中检查元字段的方法
Dec 09 Javascript
layui实现数据分页功能
Jul 27 Javascript
JS+canvas实现的五子棋游戏【人机大战版】
Jul 19 #Javascript
Vue学习笔记进阶篇之vue-router安装及使用方法
Jul 19 #Javascript
Vue学习笔记进阶篇之单元素过度
Jul 19 #Javascript
jQuery实现可编辑表格并生成json结果(实例代码)
Jul 19 #jQuery
jQuery实现导航栏头部菜单项点击后变换颜色的方法
Jul 19 #jQuery
利用require.js与angular搭建spa应用的方法实例
Jul 19 #Javascript
ztree简介_动力节点Java学院整理
Jul 19 #Javascript
You might like
深入解析php中的foreach问题
2013/06/30 PHP
实例讲解php将字符串输出到HTML
2019/01/27 PHP
使用swoole 定时器变更超时未支付订单状态的解决方案
2019/07/24 PHP
jquery1.4.2 for Visual studio 2010 模板文件
2010/07/14 Javascript
不要使用jQuery触发原生事件的方法
2014/03/03 Javascript
javascript实现时间格式输出FormatDate函数
2015/01/13 Javascript
JavaScript使用yield模拟多线程的方法
2015/03/19 Javascript
JavaScript获取网页表单action属性的方法
2015/04/02 Javascript
js比较日期大小的方法
2015/05/12 Javascript
JS实现新浪微博效果带遮罩层的弹出框代码
2015/10/12 Javascript
jQuery ajax调用后台aspx后台文件的两种常见方法(不是ashx)
2016/06/28 Javascript
Angular指令封装jQuery日期时间插件datetimepicker实现双向绑定示例
2017/01/22 Javascript
深入理解Javascript中的观察者模式
2017/02/20 Javascript
JavaScript运动框架 链式运动到完美运动(五)
2017/05/18 Javascript
微信jssdk踩坑之签名错误invalid signature
2020/05/19 Javascript
layui实现显示数据表格、搜索和修改功能示例
2020/06/03 Javascript
python获取文件版本信息、公司名和产品名的方法
2014/10/05 Python
Python编写百度贴吧的简单爬虫
2015/04/02 Python
python利用dir函数查看类中所有成员函数示例代码
2017/09/08 Python
python实现xlsx文件分析详解
2018/01/02 Python
pandas实现选取特定索引的行
2018/04/20 Python
mac安装pytorch及系统的numpy更新方法
2018/07/26 Python
Python设计模式之抽象工厂模式原理与用法详解
2019/01/15 Python
Python 实现文件打包、上传与校验的方法
2019/02/13 Python
Python chardet库识别编码原理解析
2020/02/18 Python
CSS3实现文字波浪线效果示例代码
2016/11/20 HTML / CSS
H5最强接口之canvas实现动态图形功能
2019/05/31 HTML / CSS
J2EE相关知识面试题
2013/08/26 面试题
跟单文员的岗位职责
2013/11/14 职场文书
1亿有多大教学反思
2014/05/01 职场文书
银行给客户的感谢信
2015/01/23 职场文书
教师学习心得体会范文
2016/01/21 职场文书
JavaScript实现淘宝商品图切换效果
2021/04/29 Javascript
Python爬取英雄联盟MSI直播间弹幕并生成词云图
2021/06/01 Python
Python实现随机生成迷宫并自动寻路
2021/06/13 Python
pd.DataFrame中的几种索引变换的实现
2022/06/16 Python