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 相关文章推荐
新浪刚打开页面出来的全屏广告代码
Apr 02 Javascript
innerHTML在IE中报错解决方案
Dec 15 Javascript
原生JS实现响应式瀑布流布局
Apr 02 Javascript
AngularJS基础 ng-paste 指令简单示例
Aug 02 Javascript
AngularJS入门教程之REST和定制服务详解
Aug 19 Javascript
纯JavaScript手写图片轮播代码
Oct 20 Javascript
BootStrap中
Dec 10 Javascript
Bootstrap3下拉菜单的实现
Feb 22 Javascript
快速搭建React的环境步骤详解
Nov 06 Javascript
使用async、enterproxy控制并发数量的方法详解
Jan 02 Javascript
通过cordova将vue项目打包为webapp的方法
Feb 02 Javascript
vue实现表单未编辑或未保存离开弹窗提示功能
Apr 08 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
Optimizer与Debugger兼容性问题的解决方法
2008/12/01 PHP
php empty函数判断mysql表单是否为空
2010/04/12 PHP
thinkPHP5.0框架URL访问方法详解
2017/03/18 PHP
PHP输出Excel PHPExcel的方法
2018/07/26 PHP
Laravel jwt 多表(多用户端)验证隔离的实现
2019/12/18 PHP
EditPlus注册码生成器(js代码实现)
2013/03/25 Javascript
JavaScript的事件绑定(方便不支持js的时候)
2013/10/01 Javascript
JS实现控制表格行文本对齐的方法
2015/03/30 Javascript
jquery分隔Url的param方法(推荐)
2016/05/25 Javascript
JavaScript实现点击文本自动定位到下拉框选中操作
2016/06/15 Javascript
JS实现添加,替换,删除节点元素的方法
2016/06/30 Javascript
JS中数组与对象的遍历方法实例小结
2018/08/14 Javascript
JS实现水平遍历和嵌套递归操作示例
2019/08/15 Javascript
基于JavaScript伪随机正态分布代码实例
2019/11/07 Javascript
jquery ajax 请求小技巧实例分析
2019/11/11 jQuery
Python3中的真除和Floor除法用法分析
2016/03/16 Python
Python利用QQ邮箱发送邮件的实现方法(分享)
2017/06/09 Python
详解Python 协程的详细用法使用和例子
2018/06/15 Python
python如何使用Redis构建分布式锁
2020/01/16 Python
详解pycharm2020.1.1专业版安装指南(推荐)
2020/08/07 Python
使用python库xlsxwriter库来输出各种xlsx文件的示例
2020/09/01 Python
Python与C/C++的相互调用案例
2021/03/04 Python
CSS3教程(3):border-color网页边框色彩
2009/04/02 HTML / CSS
整理HTML5的一些新特性与Canvas的常用属性
2016/01/29 HTML / CSS
使用placeholder属性设置input文本框的提示信息
2020/02/19 HTML / CSS
武汉某公司的C#笔试题面试题
2015/12/25 面试题
财务部出纳岗位职责
2013/12/22 职场文书
银行办理业务介绍信
2014/01/18 职场文书
转预备党员政审材料
2014/02/06 职场文书
鼓励运动员的广播稿
2014/02/08 职场文书
经理助理岗位职责
2014/03/05 职场文书
预备党员表决心书
2014/03/11 职场文书
仓库管理员岗位职责
2014/03/19 职场文书
教师党员承诺书2015
2015/01/21 职场文书
「玫瑰之王的葬礼」舞台剧主视觉图公开
2022/03/21 日漫
MySQL 数据 data 基本操作
2022/05/04 MySQL