一、Gulp
开发和部署前端项目:
在开发Web应用中为加速客户端资源响应(js和css),减少对js和css的请求,通过bundles来实现。
在ASP.NET5中放弃该特性,被其他类似的组件所代替。比如使用Gulp, npm和bower等。
一、安装Node
访问http://nodejs.org,然后点击大大的绿色的install
按钮,下载完成后直接运行程序。npm会随着安装包一起安装
为了确保Node和Npm已经正确安装,查看安装版本命令:
node -v npm -v
NPM是基于命令行的node包管理工具。
使用gulp自动化构建工具
为什么要使用gulp?
你在项目部署到服务器上之前是否还在一个个的压缩js和css文件?如果是,那你就out了;因为gulp可以实时监控你的每个文件,同时生成对应压缩、合并后的文件,为开发提速不少。当然gulp的功能还远不止如此!
其实就是通过gulp组件,或者说通过gulp这个配置管理文件,去管理你的资源文件,而不需要你手动去一个一个引用绑定以及压缩文件。
1、NPM下使用Gulp(npm是一个项目管理依赖包的工具,Gulp是对资源管理工具)
全局安装gulp。
npm install --global gulp
-g
表示全局安装,这样你在电脑上任何位置都能只用gulp 命令。
(仅限了解)npm init 初始化创建npm项目并生成一个package.json一个保存项目依赖信息。
我们局部安装Gulp。使用—save-dev,将通知计算机在package.json中添加gulp依赖,并将依赖资源下载。
npm install gulp --save-dev
执行完成后,gulp将会默认创建一个json文件和一个node_modules文件夹。
2、在项目根目录下创建一个名为 gulpfile.js
的文件
var gulp = require('gulp'); gulp.task('default', function() {
// 将你的默认的任务代码放在这
console.log("Gulp_Start");
});
3、运行gulp。(默认的名为 default 的任务(task)将会被运行,想要单独执行特定的任务(task),请输入 gulp <task> <othertask>)
gulp
二、Gulp操作()
1、合并JS
→ 在项目根目录下创建src文件夹
→ 在src下创建a.js, b.js, c.js
a.js:
console.log('a.js'); b.js:
console.log('b.js'); c.js:
console.log('c.js');
→ npm install gulp-concat
→ 在gulpfile.js中编写如下
var gulp = require('gulp');
var concat = require('gulp-concat'); gulp.task('js', function(){
gulp.src('src/*.js')
.pipe(concat('all.js')) //合并的文件名
.pipe(gulp.dest('dist')); //合并后文件所在的目录
});
在项目根目录下多了dist文件夹,里面有一个all.js文件:
console.log('a.js');
console.log('b.js');
console.log('c.js');
合并JS(源头文件,以数组形式)
var gulp = require('gulp');
var concat = require('gulp-concat'); gulp.task('js', function(){
gulp.src('src/*.js')
.pipe(concat('all.js')) //合并的文件名
.pipe(gulp.dest('dist')); //合并后文件所在的目录
}); gulp.task('other-js', function(){
gulp.src(['src/a.js', 'src/b.js']) //源头文件,以数组形式
.pipe(concat('two.js'))
.pipe(gulp.dest('dist'));
});
→ 在控制台输入:gulp other-js
在dist下多了two.js文件:
console.log('a.js');
console.log('b.js');
合并JS(多个任务执行)
var gulp = require('gulp');
var concat = require('gulp-concat'); gulp.task('js', function(){
gulp.src('src/*.js')
.pipe(concat('all.js')) //合并的文件名
.pipe(gulp.dest('dist')); //合并后文件所在的目录
}); gulp.task('other-js', function(){
gulp.src(['src/a.js', 'src/b.js']) //源头文件,以数组形式
.pipe(concat('two.js'))
.pipe(gulp.dest('dist'));
}); gulp.task('default',['js', 'other-js'], function(){
console.log('hello');
});
→ 删除dist下的所有文件
→ 在控制台输入:gulp default(也可以输入gulp,因为default是默认的任务名称)
dist文件夹下又多了all.js和two.js文件,说明js和other-js两个任务已经被运行。
2、监控文件变化,实现自动化
→ 修改gulpfile.js,增加一个任务,监控src中的文件变化,一旦有变化执行default任务
var gulp = require('gulp');
var concat = require('gulp-concat'); gulp.task('js', function(){
gulp.src('src/*.js')
.pipe(concat('all.js')) //合并的文件名
.pipe(gulp.dest('dist')); //合并后文件所在的目录
}); gulp.task('other-js', function(){
gulp.src(['src/a.js', 'src/b.js']) //源头文件,以数组形式
.pipe(concat('two.js'))
.pipe(gulp.dest('dist'));
}); gulp.task('default',['js', 'other-js'], function(){
console.log('hello');
}); gulp.task('watch', function(){
gulp.watch('src/*',['default']);
});
→ 控制台运行:gulp watch
控制台提示正在watching
→ 打开a.js文件修改并保存
console.log('a.js');
console.log('updated');
在all.js中也有了相应的变化:
console.log('a.js');
console.log('updated');
console.log('b.js');
console.log('c.js');
4、优化css, javascript,以及图片
→ 先终止监控
ctrl+c
→ npm install gulp-uglify gulp-minify-css gulp-imagemin
→ 在src文件夹下加入图片和css文件
→ 修改gulpfile.js
var gulp = require('gulp');
var concat = require('gulp-concat');
var uglify = require('gulp-uglify');
var minify = require('gulp-minify-css');
var imagemin = require('gulp-imagemin'); //优化js文件
gulp.task('js',function(){
gulp.src('src/*.js')
.pipe(concat('all.js'))
.pipe(uglify())
.pipe(gulp.dest('dist'));
}); //优化css文件
gulp.task('css',function(){
gulp.src('src/*.css')
.pipe(minify())
.pipe(gulp.dest('dist'));
}); //优化图片
gulp.task('images',function(){
gulp.src('src/*.jpg')
.pipe(imagemin())
.pipe(gulp.dest('dist'));
}); gulp.task('default',['js','css','images'])
→ 控制台运行:gulp
进入到dist文件夹下的所有js, css, image文件都是经过压缩的。
5、同时输出压缩和未压缩js文件
var gulp = require('gulp');
var concat = require('gulp-concat');
var uglify = require('gulp-uglify'); gulp.task('js', function(){
gulp.src('src/*.js')
.pipe(concat('all.js'))//导出一个没有压缩的文件
.pipe(gulp.dest('dist'))
.pipe(uglify()) //压缩
.pipe(concat('all.min.js'))//导出一个压缩文件
.pipe(gulp.dest('dist'));
});
→ 控制台运行:gulp js
在dis下同时输出all.js和all.min.js文件。
6、使用gulp-htmlbuild替代html中的某个部分
→ npm install gulp-htmlbuild
→ 在src下创建index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body> <!-- htmlbuild:js -->
<script src="a.js"></script>
<script src="b.js"></script>
<script src="c.js"></script>
<!-- endbuild -->
</body>
</html>
<!-- htmlbuild:js -->和<!-- endbuild -->之内的可以被替换掉。
→ 修改gulpfile.js文件
var gulp = require('gulp');
var htmlbuild = require('gulp-htmlbuild'); gulp.task('html', function(){
gulp.src('src/index.html')
.pipe(htmlbuild({
js: htmlbuild.preprocess.js(function(block){
block.write('hello.js');
block.end();
})
}))
.pipe(gulp.dest('dist'));
});
→ 控制台运行:gulp html
在dis下多了一个index.html文件如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body> <script src="hello.js"></script>
</body>
</html>
7、使用Jasmine检测代码
→ npm install gulp-jasmine
→ 在src文件夹下创建一个multiply.js文件
module.exports = function(left, right){
return left * right;
};
→ 在项目根目录下创建一个spec文件夹
→ 在spec文件夹下创建multiplye.js用来测试src文件夹下的multiply.js文件中的方法
var multiply = require('../src/multiply'); describe('multiply', function(){
it('multiplies two numbers together', function(){
expect(multiply(2,3)).toEqual(6);
});
});
→ 修改gulpfile.js文件
var gulp = require('gulp');
var jasmine = require('gulp-jasmine'); gulp.task('test', function(){
gulp.src('spec/*.js')
.pipe(jasmine());
});
→ 在控制台运行:gulp test
控制台显示:1 spec, 0 failures
8、预编译less和CoffeeScript文件
→ 在src下添加一个app.coffee文件
add = (a, b) -> a + b; result = add 2,2
console.log result
→ 在src下添加一个style.less文件
@nice-color:#593AD; #header{
color: @nice-color;
}
→ npm install gulp-coffee gulp-less
→ 修改gulpfile.js文件
var gulp = require('gulp');
var coffee = require('gulp-coffee');
var less = require('gulp-less'); gulp.task('coffee', function(){
gulp.src('src/*.coffee')
.pipe(coffee())
.pipe(gulp.dest('dist'));
}); gulp.task('less', function(){
gulp.src('src/*.less')
.pipe(less())
.pipe(gulp.dest('dist'));
}); gulp.task('default',['coffee','less']);
→ 控制台运行:gulp
在dist文件夹下多了app.js和style.css文件
8、搭建本地服务器
→ npm install gulp-connect
→ src目录下有一个index.html文件
→ 修改gulpfile.js文件
var gulp = require('gulp');
var connect = require('gulp-connect'); gulp.task('copy', function(){
return gulp.src('src/index.html')
.pipe(gulp.dest('dist/'))
.pipe(connect.reload());
}); gulp.task('watch', function(){
gulp.watch('src/index.html',['copy']);
}); gulp.task('connect', function(){
connect.server({
port: 8000,
root: 'dist/',
livereload: true
});
}); gulp.task('default',['copy','watch','connect']);
以上,把src下的index.html文件拷贝到dist下,并对src下的index.html文件进行监控,并搭建了一个服务器。
→ 控制台运行:gulp
→浏览器输入http://localhost:8000/
可以看到页面内容。
→ 修改src下的index.html内容,并保存
http://localhost:8000/中的页面内容也有相应的变化。
9、文件流
→ 在项目根目录下创建doc.txt
→ 在项目根目录下创建uppercase.js,用来在根目录下创建另外一个txt文件吧doc.txt中的字母转换成大写
var fs = require('fs');
var input = fs.createReadStream('doc.txt');
var output = fs.createWriteStream('doc-uppercase.txt'); input.on('readable', function(){
output.write(input.read().toString().toUpperCase());
}); input.on('end', function(){
output.end();
});
→ 控制台运行:node uppercase.js
在根目录下多了一个doc-uppercase.txt文件,里面的内容大写。
10、捕获异常
→ 修改gulpfile.js文件
var gulp = require('gulp');
var coffee = require('gulp-coffee');
var concat = require('gulp-concat'); function handleError(error){
console.log(error);
this.emit('end');
} gulp.task('coffee', function(){
return gulp.src('src/*.coffee')
.pipe(coffee())
.on('error', handleError)
.pipe(concat('all.js'))
.pipe(gulp.dest('dist/'));
}); gulp.task('watch',['coffee'], function(){
gulp.watch('src/*.coffee',['coffee']);
});
→ 控制台运行:gulp watch
→ 在src下的app.coffee文件中故意制造错误
在控制台出现错误提示
11、自写一个插件
→ npm install through2
→ 在根目录下创建gulp-capitalize.js文件
var through = require('through2'); module.exports = function gulpCapitalize(){
return through.obj(function(file, enc, cb){
if(file.isNull()){
return cb(null, file);
} if(file.isStream()){
this.emit('error', new PluginError('gulp-capitalize','Streams are not supported'));
return cb();
} if(file.isBuffer()){
file.contents = new Buffer(file.contents.toString(enc).toUpperCase());
} cb(null, file);
});
};
→ 修改gulpfile.js文件
var gulp = require('gulp');
var capitalize = require('./gulp-capitalize'); function handleError(error){
console.log(error);
this.emit('end');
} gulp.task('default', function(){
return gulp.src('*.txt')
.pipe(capitalize())
.on('error', handleError)
.pipe(gulp.dest('dist'));
});
→ 控制台运行:gulp
在src下多了txt后缀的文件,并且内容都为大写。
一、Gulp的更多相关文章
- 构建一个基本的前端自动化开发环境 —— 基于 Gulp 的前端集成解决方案(四)
通过前面几节的准备工作,对于 npm / node / gulp 应该已经有了基本的认识,本节主要介绍如何构建一个基本的前端自动化开发环境. 下面将逐步构建一个可以自动编译 sass 文件.压缩 ja ...
- 常用 Gulp 插件汇总 —— 基于 Gulp 的前端集成解决方案(三)
前两篇文章讨论了 Gulp 的安装部署及基本概念,借助于 Gulp 强大的 插件生态 可以完成很多常见的和不常见的任务.本文主要汇总常用的 Gulp 插件及其基本使用,需要读者对 Gulp 有一个基本 ...
- 在windows下安装gulp —— 基于 Gulp 的前端集成解决方案(一)
相关连接导航 在windows下安装gulp —— 基于 Gulp 的前端集成解决方案(一) 执行 $Gulp 时发生了什么 —— 基于 Gulp 的前端集成解决方案(二) 常用 Gulp 插件汇总 ...
- 执行 $Gulp 时发生了什么 —— 基于 Gulp 的前端集成解决方案(二)
前言 文章 在windows下安装gulp —— 基于 Gulp 的前端集成解决方案(一) 中,已经完成对 gulp 的安装,由于是window环境,文中特意提到了可以通过安装 gitbash 来代替 ...
- gulp详细入门教程
本文链接:http://www.ydcss.com/archives/18 gulp详细入门教程 简介: gulp是前端开发过程中对代码进行构建的工具,是自动化项目的构建利器:她不仅能对网站资源进行优 ...
- 做一个gulp+webpack+vue的单页应用开发架子
1.目标 最近项目上的事情不多,根据我自己的开发习惯,决定开发一些简单的开发架子,方便以后事情多的时候直接套用.本文讲的一个gulp+webpack+vue的单页应用架子,想要达到的目的: 可以通过命 ...
- 前端自动化构建工具gulp记录
一.安装 1)安装nodejs 通过nodejs的npm安装gulp,插件也可以通过npm安装.windows系统是个.msi工具,只要一直下一步即可,软件会自动在写入环境变量中,这样就能在cmd命令 ...
- gulp初学
原文地址:gulp初学 至于gulp与grunt的区别,用过的人都略知一二,总的来说就是2点: 1.gulp的gulpfile.js 配置简单而且更容易阅读和维护.之所以如此,是因为它们的工作方式不 ...
- gulp批量打包文件并提取公共文件
gulp是前端开发过程中对代码进行构建的工具,是自动化项目的构建利器. browseriyf是模块化打包工具. 一般情况下,Browserify 会把所有的模块打包成单个文件.单个文件在大多数情况下是 ...
- 使用gulp解决RequireJS项目前端缓存问题(二)
1.前言 这一节,我们主要解决在上一节<使用gulp解决RequireJSs项目前端缓存问题(一)>末尾提到的几个问题: 对通过require-config.js引入的js文件修改后,没有 ...
随机推荐
- Codeforces Round #454 (Div. 1) CodeForces 906D Power Tower (欧拉降幂)
题目链接:http://codeforces.com/contest/906/problem/D 题目大意:给定n个整数w[1],w[2],……,w[n],和一个数m,然后有q个询问,每个询问给出一个 ...
- ansible笔记(二)--配置文件详解
配置文件ansible.cfg约有350行语句,大多数为注释行默认配置项.该文件遵循INI格式,分为如下几类配置.(1)[defaults] [defaults] # inventory = /etc ...
- poj 2505 乘法博弈论
转自:http://hzwer.com/1921.html 题目大意: 题意:Stan从1开始,可以乘上2~9中任何一个数,Ollie也如此操作,只到某个人本回合的操作超过N为之..1<N< ...
- Java使用文件通道复制文件
两种文件通道复制文件方式的性能比较 import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IO ...
- 【leetcode】714. Best Time to Buy and Sell Stock with Transaction Fee
题目如下: Your are given an array of integers prices, for which the i-th element is the price of a given ...
- python使用qq邮箱向163邮箱发送邮件、附件
在生成html测试报告后 import smtplib,time from email.mime.text import MIMEText from email.mime.multipart impo ...
- 超微主板IPMI的使用
https://blog.nicky1605.com/supermicro-motherboards-use-ipmi.html IPMI(智能平台管理接口)现在大部分都是集成到主板上了,我们利用IP ...
- 2017 山东一轮集训 Day2 Shadow (三维凸包点在面上投影)
在三维坐标中,给定一个点光源,一个凸多面体,以及一个平面作为地面. 求该凸多面体在地面上阴影的面积. 这三个点共同确定了一个平面,这个平面就是地面.保证这三个点坐标互异且不共线.前三行每行三个实数,每 ...
- BZOJ 4238 电压 解题报告
BZOJ 4238 电压 考虑一条边成为答案以后,删去Ta后剩下的图是一个或很多个二分图,即没有奇环 则一条边可以成为答案,当且仅当自己在所有奇环的交上且不在偶环上. 考虑建出dfs树,那么返祖边一定 ...
- 27 October in ss
Contest A. chrono 计算某年的干支纪年法年份. Too easy. 然而我忘记 C++ 取模运算是向0取整.然而数据太水,还是有 90 分. B. clock 计算某时刻时针和分针的夹 ...