【Node.js学习笔记】使用Gulp项目自动化构建工具
刚接触node.js,对前端的一些东西还不是很清楚,据说Gulp这东西很强大,先来看看从网上抄的一段关于自动化构建的描述:
在为数众多的中小型软件作坊中,不存在自动化构建和发布工具。构建、交付准备环境、代码发布全由手工完成,同样还有运行测试、备份旧版本、新版本打标签以及许多其他重复的事情。毕竟你可能认为这全是非常简单的工作,集成开发环境通过按钮或快捷键就可构建项目,你开启两个窗口拖放少许文件或文件夹即可完成网站发布。但当你在维护代码库和应用时所有这些事情加在一起,这里几分钟,那里几分钟,最终会浪费几个小时。
后续:
经过本人最近一段时间的尝试和探索,发现Gulp的作用如下(纯个人观点,很可能误导):
1.重构正式运行的文件夹目录结构,因为有时候在开发时候的最优选择未必是发布时候的最优目录结构。
2.自动压缩CSS/JS
3.配合Browser-Sync这类的浏览器自动工具,还有一些测试工具,从而实现真正的自动化测试。
本人尝试Gulp的过程如下:
所用IDE:VS 2012 并安装node.js tools插件
1.新建一个Node.Js express 4项目,会给新建一个welcome的node.js程序。
2.通过npm引用相关包,我用到的包有:
gulp、del、run-sequence、gulp-jade、gulp-concat、gulp-uglify、gulp-rename
3.在原来新建好的welcome的项目基础上,我再public/javascripts下面新建了个js文件,叫test.js,内容随便写几行js。
4.根目录下新建个gulpfile.js,然后在cmd中cd到网站根目录下,或者直接右键点击项目,选择open command xxxx,然后敲个gulp(如果报错,先全局安装gulp再试)相信里面的注释已经比较清楚了。
'use strict';
var gulp=require('gulp');//引用类库,相当于.net中的using
var plugins = {
del: require('del'),
runSequence: require('run-sequence'),
jade: require('gulp-jade'),
concat: require('gulp-concat'),
uglify: require('gulp-uglify'),
rename:require('gulp-rename')
};
var jade = plugins.jade;
var concat = plugins.concat;
gulp.task('default', function (callback) {//default是入口
plugins.runSequence(
'task-clean',
['task-script'],
'task-jade',
callback
);
});
gulp.task('task-clean', function (callback) {
plugins.del(['./dist/*.*'],callback());//清理dist文件夹中原来的东西
});
gulp.task('task-script', function () {
gulp.src('public/javascripts/*.js', { base:'public'})
.pipe(plugins.uglify())//js压缩
.pipe(plugins.rename({extname:'.min.js'}))//重命名
.pipe(gulp.dest('dist'));//输出到dist目录
});
var watcher= gulp.watch('public/javascripts/*.js', ['task-script']);//监控这个文件夹,有变化了运行task-script task
watcher.on('change', function (e) {
console.log('File ' + e.path + ' was ' + e.type + ', running tasks...');//变化了之后控制台打印一下,方便调试
});
===========后续,文件更改自动刷新浏览器=====================
5.既然文件都变了,那肯定要重置当前的浏览器状态,让他自己来刷新,免得我们每次都得手动去做这件事情,这时候我们就需要引入Browser-Sync,直接贴代码比较清晰一点
//构建Gulp Task,用来启动一个mini Server,Host你的网站
gulp.task('browser-sync', function () {
plugins.browserSync.init({
server: {
baseDir: './dist'
},
port: 8888
})
});
//gulp task:刷新浏览器
gulp.task('bs-reload', function () {
plugins.browserSync.reload();
console.log("模块重新构建成功".green);
});
var watcher = gulp.watch(
['public/javascripts/*.js','index.html'],
['task-script', 'task-index', 'bs-reload']);//监控这个文件夹,有变化了运行task,最后刷浏览器
6.JS/CSS加上时间戳,防止因为浏览器缓存造成的各种操蛋的问题。
//在构建Html的时候,去给Html中的引用加上版本号,而不是在构建JS的时候,我犯过这错误
gulp.task('task-index', function () {
var version = (new Date).valueOf() + '';
gulp.src('index.html')
.pipe(plugins.replace('.js"></script>', '.min.js?v=' + version + '"></script>'))
.pipe(gulp.dest('dist'));
console.log('task-index 构建成功'.green);
});
7. 参数化构建,把一些东西写到配置里面,优化一把
var gulp=require('gulp');
var del=require('del');
var runSequence=require('run-sequence');
var concat=require('gulp-concat');
var uglify=require('gulp-uglify');
var rename=require('gulp-rename');
var colors=require('colors');
var browserSync=require('browser-sync').create();
var appConfig={
appPath:require("./browser.json").appPath||'src', //配置源文件路径
dist:'dist',//配置打包路径
isDebug:true//配置编译方式
};
var assets= appConfig.appPath+'/assets/';
var watchPath={
scripts:[assets+'scripts/**/*.js'],
styles:[assets+'styles/**/*.css'],
plugins:[assets+'plugins/**/*.*'],
images:[assets+'images/**/*.*']
};
gulp.task('main',function(){
runSequence();
});
gulp.task('clean',function(callback){
del([appConfig.dist+'/*.*'],callback);
});
gulp.task('scripts',function(){
var gulpStream=gulp.src(watchPath.scripts,{base:appConfig.appPath});
if(appConfig.isDebug){
gulpStream=gulpStream.pipe(uglify());
}
return gulpStream.pipe(gulp.dest(appConfig.dist));
console.log('scripts bulid complete'.green);
});
8.Bower自动添加引用到首页。
gulp.task('bower', function () {
return gulp.src([paths.views.main])
.pipe(wiredep({
directory: 'bower_components',
//exclude: [],
//ignorePath: '/^(\.\.\/)*\.\./'
ignorePath: '..'
}))
.pipe(gulp.dest('app'));
});
9.模块化构建项目,自动刷新浏览器
var gulp=require('gulp');
var del=require('del');
var runSequence=require('run-sequence');
var concat=require('gulp-concat');
var uglify=require('gulp-uglify');
var rename=require('gulp-rename');
var colors=require('colors');
var cssnano = require('gulp-cssnano');
var browserSync=require('browser-sync').create();
var wiredep=require("wiredep").stream;
var mainBowerFiles = require('main-bower-files');
var appConfig={
appPath:require("./bower.json").appPath||'src', //配置源文件路径
dist:'dist/',//配置打包路径
isDebug:true//配置编译方式
};
var assets= appConfig.appPath+'/assets';
var bowerPath=assets+"/plugins";
var watchPath={
scripts:[assets+'/scripts/**/*.js'],
styles:[assets+'/styles/**/*.css'],
plugins:[assets+'/plugins/**/*.*'],
images:[assets+'/images/**/*.*'],
main:appConfig.appPath+'/index.html',
views:appConfig.appPath+'/views/**/*.html',
js:appConfig.appPath+'/js/**/*.js',
theme:appConfig.appPath+'/theme/**/*.html'
};
gulp.watch(watchPath.scripts,['scripts','reload']);
gulp.watch(watchPath.styles,['styles','reload']);
gulp.watch(watchPath.plugins,['plugins','reload']);
gulp.watch(watchPath.images,['images','reload']);
gulp.watch('./bower.json',['bower','main-bower-files','reload']);
gulp.watch([watchPath.views,watchPath.main],['views','reload']);
gulp.watch(watchPath.js,['js','reload']);
gulp.watch(watchPath.theme,['theme','reload']); gulp.task('clean',function(){
del([appConfig.dist+'/*.*']);
console.log('clean task complete!'.green);
});
gulp.task('scripts',function(){
var gulpStream=gulp.src(watchPath.scripts,{base:appConfig.appPath});
if(!appConfig.isDebug){
gulpStream=gulpStream.pipe(uglify());
}
console.log('scripts bulid complete'.green);
return gulpStream.pipe(gulp.dest(appConfig.dist));
});
gulp.task('styles',function(){
var gulpStream=gulp.src(watchPath.styles,{base:appConfig.appPath});
if(!appConfig.isDebug){
gulpStream=gulpStream.pipe(cssnano());
}
console.log('styles bulid complete'.green);
return gulpStream.pipe(gulp.dest(appConfig.dist));
});
gulp.task('bower', function () {
return gulp.src([watchPath.main])
.pipe(wiredep({
directory: bowerPath,
//exclude: [],
//ignorePath: '/^(\.\.\/)*\.\./'
}))
.pipe(gulp.dest(appConfig.appPath));
});
gulp.task('js',function(){
gulp.src(watchPath.js,{base:appConfig.appPath})
.pipe(gulp.dest(appConfig.dist));
});
gulp.task('theme',function(){
gulp.src(watchPath.theme,{base:appConfig.appPath})
.pipe(gulp.dest(appConfig.dist));
});
gulp.task('views',['bower'],function(){
gulp.src([watchPath.views,watchPath.main],{base:appConfig.appPath})
.pipe(gulp.dest(appConfig.dist));
console.log('Html bulid complete'.green);
});
gulp.task("main-bower-files", function(){
return gulp.src(mainBowerFiles(), { base: appConfig.appPath })
.pipe(gulp.dest(appConfig.dist));
});
gulp.task('images',function(){
gulp.src(watchPath.images,{base:appConfig.appPath})
.pipe(gulp.dest(appConfig.dist));
});
gulp.task('reload', function () {
browserSync.reload();
console.log("模块重新构建成功".green);
}); gulp.task('serve', ['clean','views','theme','images', 'js','styles', 'scripts','main-bower-files'], function() {
console.log('Build Complate!Server Strarting......');
browserSync.init({
server: {
baseDir: './dist'
},
port: 8888
})
}); gulp.task('default', ['serve']);
【Node.js学习笔记】使用Gulp项目自动化构建工具的更多相关文章
- 一点感悟:《Node.js学习笔记》star数突破1000+
写作背景 笔者前年开始撰写的<Node.js学习笔记> github star 数突破了1000,算是个里程碑吧. 从第一次提交(2016.11.03)到现在,1年半过去了.突然有些感慨, ...
- Node.js学习笔记(3):NPM简明教程
Node.js学习笔记(3):NPM简明教程 NPM常用操作 更新NPM版本 npm install npm -g -g,表示全局安装.我们可以指定更新版本,只需要在后面填上@版本号即可,也可以输入@ ...
- Node.js学习笔记(1):Node.js快速开始
Node.js学习笔记(1):Node.js快速开始 Node.js的安装 下载 官方网址:https://nodejs.org/en/ 说明: 在Windows上安装时务必选择全部组件,包括勾选Ad ...
- Node.js学习笔记(4):Yarn简明教程
Node.js学习笔记(4):Yarn简明教程. 引入Yarn NPM是常用的包管理工具,现在我们引入是新一代的包管理工具Yarn.其具有快速.安全.可靠的特点. 安装方式 使用npm工具安装yarn ...
- 系列文章--Node.js学习笔记系列
Node.js学习笔记系列总索引 Nodejs学习笔记(一)--- 简介及安装Node.js开发环境 Nodejs学习笔记(二)--- 事件模块 Nodejs学习笔记(三)--- 模块 Nodejs学 ...
- Node.js学习笔记(2):基本模块
Node.js学习笔记(2):基本模块 模块 引入模块 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式.在No ...
- 前端项目自动化构建工具——Webpack入门教程
参考资料:https://www.webpackjs.com/(中文文档) https://www.webpackjs.com/(官方文档) 首先有必要说明一下,本文侧重讲解webpack基本配置 ...
- gulp前端自动化构建工具新手入门篇
很久没有更新博文了. 经过了一次年前吐血的赶项目,终于在年后回血了.趁着有空,新学到了一个前端自动化构建工具-gulp. 现在我们通过这3个问题来学习一下: 1.什么是gulp? 2.为什么要用gul ...
- gulp前端自动化构建工具
博主不易,不求赞赏,希望把自己遇到的难点写出来,以及希望自己能有能力写出一篇不错的博文. 前端构建工具本人 bootstrap+jquery用gulp vue+element 用webpack 引文 ...
随机推荐
- hibernate下Session的获取方式
Session是应用程序与数据库之间的一个会话,其重要性不言而喻.初学Hibernate,使用SessionFactory,老老实实地打开事务,提交,回滚,关闭session. 1.直接通过Sessi ...
- 第1章 初识CSS3
什么是CSS3? CSS3是CSS2的升级版本,3只是版本号,它在CSS2.1的基础上增加了很多强大的新功能. 目前主流浏览器chrome.safari.firefox.opera.甚至360都已经支 ...
- ccf-201809-2 买菜
问题描述 小H和小W来到了一条街上,两人分开买菜,他们买菜的过程可以描述为,去店里买一些菜然后去旁边的一个广场把菜装上车,两人都要买n种菜,所以也都要装n次车.具体的,对于小H来说有n个不相交的时间段 ...
- Python-网络编程(一)
首先我们python基础部分已经学完了,而socket是我们基础进阶的课程,也就是说,你自己现在完全可以写一些小程序了,但是前面的学习和练习,我们写的代码都是在自己的电脑上运行的,虽然我们学过了模块引 ...
- xml文件读取到数据库
xml文件读取到数据库 第一步,导包 c3p0,dom4j,jaxen,MySQL-connector 第二步 xml文件,config文件 第三步 javabean 第四步 c3p0的工具类 ...
- eclipse svn使用
简单介绍一些基本操作 1.同步在Eclipse下,右击你要同步的工程->team->与资源库同步->这时会进入同步透视图,会显示出本机与SVN上内容有不同的文件,双击文件名,会显示出 ...
- ajax 请求调用问题
http://localhost/dev/list 和 http://127.0.0.1/dev/list 最近在架构整体常规通用系统的解决方案,遭遇AJAX请求不执行的问题,刚开始以为Spring ...
- git中忽略文件权限或文件拥有者的改变
在发布项目到线上时,很多时候需要修改文件的权限,如果是使用git版本管理软件来发布的话,那么下次更新线上文件的时候就会提示文件冲突.明明文件没有修改,为什么会冲突呢?原来git把文件权限也算作文件差异 ...
- xlwings: Write Excel macro using python instead of VBA
i want to write Excel macros to deal with the data, but i am not familiar with VBA language. so i de ...
- SQL Server 有序GUID,SequentialGuid,
问题描述 有序的GUID性能对比,堪比自增ID integer 一个大神告诉我NEWSEQUENTIALID() 在数据迁移的时候会有问题(感谢大神指点),所以我就深挖一下这个函数. 关于NEWSEQ ...