You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
var gulpIf = require('gulp-if');
var minifyCSS = require('gulp-minify-css');
gulp.task('useref', function(){
return gulp.src('app/*.html')
// Minifies only if it's a CSS file
.pipe(gulpIf('*.css', minifyCSS()))
// Uglifies only if it's a Javascript file
.pipe(gulpIf('*.js', uglify()))
.pipe(useref())
.pipe(gulp.dest('dist'))
});
一般前端基础架构
1. 自动刷新
2. 文件合并
3. 资源压缩
任务自动化gulp
什么是gulp
理想中前端开发流程是
后两步(也就是 2 和 3)应该是自动化的, 交由构建工具来做, gulp就是一种流行的构建工具。
开发工作中痛苦耗时的任务有哪些?
这些痛苦的过程,gulp可以帮我们自动化的完成
如何使用gulp
全局安装和本地安装
根目录下新建gulpfile.js文件,是gulp的配置文件
最简单的gulp任务
gulpfile.js里面就是gulp脚本
然后在命令行里面执行
gulp sayhi
的命令就可以了。gulpfile.js和es6的关系
gulpfile.js里面不能写es6
gulp3.9版本之后可以和babel配合在gulpfile.babel.js里面写es6
1、 安装babel
2、 创建.babelrc文件
到现在,我们就可以在gulpfile.babel.js里面开心的使用es6的语法了
稍微难一点的gulp任务
通常会有两个特定的gulp方法和一些gulp插件
gulp.src()是打开路径的文件,gulp.dest()是把文件放在指定路径
下面以sass文件的编译为例:
安装gulp-sass
新建测试用的sass文件
编写脚本
app/css/styles.scss
目录里就会被编译到gulp.dest('app/css')里面Node中的通配符
使用通配符,计算机检查文件名和路径进行匹配。
常用的4种匹配模式:
*.scss
:*号匹配当前目录任意文件**/*.scss
:匹配当前目录及其子目录下的所有scss文件。!not-me.scss
:!号移除匹配的文件,这里将移除not-me.scss*.+(scss|sass)
:+号后面会跟着圆括号,里面的元素用|分割,匹配多个选项。这里将匹配scss和sass文件。上面的例子改造一下:
监听文件
Gulp提供watch方法给我们,语法如下:
我们把watch方法放在任务里面:
有了监听,每次修改文件,Gulp都将自动为我们执行任务。
自动刷新浏览器
Browser Sync 帮助我们搭建简单的本地服务器并能实时刷新浏览器
这里没有gulp-前缀,因为browser-sync支持Gulp,所以没有人专门去搞一个给Gulp用哈哈
我们创建一个broswerSync任务,我们需要告知它,根目录在哪里。
我们稍微修改一下之前的代码,让每次css文件更改都刷新一下浏览器:
我们可以在watch任务之前告知Gulp,先把browserSync和Sass任务执行了再说。
应用下来是这样:
现在你执行gulp watch命令,在执行完browserSync和Sass,才会开始监听。
优化CSS和JavaScript文件
我们需要想到:压缩,拼接。也就是减少体积和HTTP次数
开发者面临的主要问题是很难按照正确的顺序合并文件。
gulp-useref会将多个文件拼接成单一文件,并输出到相应目录。
type
可以是js,css,或者remove。如果你设为remove,Gulp将不会生成文件。path
指定产出路径。我们想最终产出main.min.js。可以这样写:
我们来安装gulp-useref。
引用
使用也非常简单
执行useref命令,Gulp将合并三个script标签成一个文件,并保存到dist/js/main.min.js。
合并完之后,我们再来压缩。使用gulp-uglify插件。
使用
注意:执行完useref后,html中的script路径将只剩下main.min.js。
gulp-useref同样可以用在css上。除了压缩,需要区分,其它内容同js一样。所以我们使用gulp-if来做不同处理。
使用gulp-minify-css压缩css。
优化图片
使用gulp-imagemin插件。
清理生成文件
我们不想旧文件掺杂进来,使用del
但是我们又不想图片被删除(图片改动的几率不大),启用新的任务。
组合Gulp任务
废话了这么多,我们主要有两条线路。
第一条是开发过程,我们便以Sass,监听文件,刷新浏览器。
第二条是优化,我们优化CSS,JavaScript,压缩图片,并把资源从app移动到dist。
开发过程上面已经写好了,下面我们主要来写优化过程
但是这样Gulp会同时触发[]的事件。我们要让clean在其他任务之前完成, 需要用到run-sequence
执行task-name时,Gulp会按照顺序执行task-one,task-two,task-thre。
RunSequence也允许你同时执行多个任务。
小结
上面的的内容搭建了一个基本的Gulp工作流。还有更精彩的内容等着你去开发。这里提供些插件:
开发过程:
使用 Autoprefixer,你不再需要写CSS浏览器内核前缀
增加 Sourcemaps,让你更方便的调试Sass,coffeescript
使用 sprity创建精灵图
gulp-changed 只允许通过修改的文件
Babel 或 Traceur 写ES6
Browserify , webpack , jspm 模块化JavaScript
Handlebars ,Swing 模块化Html
require-dir 分割gulpfile成多个文件
gulp-moderinizr 自动生成Modernizr脚本
优化:
unCSS 移除多余的CSS
CSSO 更深入地优化CSS
Critical 生成行内CSS
除了开发和优化过程,你可以使用gulp-jasmine写JavaScript单元测试,甚至使用gulp-rync直接部署dist文件到生产环境。
接下来是使用gulp更大型的一个项目:
假设我们的项目目录为:
项目目录
在server目录下,运行
express -e .
cd install
, 就可以初始化服务器的目录啦到目前为止,我们已经创建了app(前端代码)、server(服务器代码)、tasks(前端构建)
创建并配置package.json
在根目录下,运行npm init命令,生成package.json文件
创建.babelrc
在根目录下,运行touch .babelrc, 生成babel的配置文件
创建gulp文件
在根目录下,运行
touch gulpfile.babel.js
, 生成gulp文件。截止现在,我们的准备工作已经做好了。
编写脚手架工具
创建tasks/utils/args.js文件,处理命令行内容
使用watch模式可以更高效的开发,监听到改动就自动执行任务,但是如果过程中遇到错误,gulp就会报错并终止watch模式,必须重新启动gulp,简直神烦!
利用gulp-plumber可以实现错误自启动,这样就能开心的在watch模式下开发且不用担心报错了。
接下是监听编译模板
�
接下来是监听css文件
构建服务器脚本
接下来,我们需要让所有的任务都自动化,app是我们前端的原始目录,如何让我们app下的文件发生了变化,自动写入到public的目录下面呢�
同时,我们还需要要一个清空指定目录文件的脚本
build.js把任务都关联起来,处理任务之间的先后顺序,server.js启动之前,pages.js和script.js必须先执行。
gulp scripts
这个命令是执行名为scripts的gulp脚本,如果gulp
不指定脚本,则是执行default这个gulp脚本The text was updated successfully, but these errors were encountered: