前端自动化构建工具gulp记录

简介: 通过nodejs的npm安装gulp,插件也可以通过npm安装。windows系统是个.msi工具,只要一直下一步即可,软件会自动在写入环境变量中,这样就能在cmd命令窗口中直接使用node或npm指令。

一、安装


1)安装nodejs


通过nodejs的npm安装gulp,插件也可以通过npm安装。windows系统是个.msi工具,只要一直下一步即可,软件会自动在写入环境变量中,这样就能在cmd命令窗口中直接使用node或npm指令。


image.png


我上面的cmd,已经被git封装过了,字体都变成彩色的了。安装了这个工具后,还可以通过Git Bash打Linux的命令。git是版本控制的工具,这里也不多说了。


image.png


 

2)npm


npm(node package manager)nodejs的包管理器,用于node插件管理(包括安装、卸载、管理依赖等)

gulp赫然出现在npm的首页中。


image.png


命令提示符执行:

npm install <name> [-g] [--save-dev]


1. <name>:node插件名称。例:npm install gulp-less --save-dev

2. -g:全局安装。将会安装在C:\Users\Administrator\AppData\Roaming\npm,并且写入系统环境变量;

非全局安装:将会安装在当前定位目录;

全局安装可以通过命令行在任何地方调用它,本地安装将安装在定位目录的node_modules文件夹下,通过require()调用;

3. --save:将保存配置信息至package.json(package.json是nodejs项目配置文件);

4. -dev:保存至package.json的devDependencies节点,不指定-dev将保存至dependencies节点

配置文件package.json是为了方便下载相关的包,只需要在有这个文件的文件夹下面执行“npm install”(如果安装了cnpm就用“cnpm install”),则会根据package.json下载所有需要的包。【注:我用demo中的package文件在另外一台电脑上面直接安装,打“gulp watch”的时候出现了很多错误】

 

3)cnpm


因为npm安装插件是从国外服务器下载,受网络影响大,可能出现异常。

在国内推荐使用淘宝NPM镜像。“这是一个完整 npmjs.org 镜像,你可以用此代替官方版本(只读),同步频率目前为 10分钟 一次以保证尽量与官方服务同步”

安装指令如下:


npm install -g cnpm --registry=https://registry.npm.taobao.org


注意安装的时候会出现错误提示,你可以关闭命令窗口再打开,打入“cnpm -v”可以查看版本号。cnpm跟npm用法完全一致

0.gif

 

4)全局安装gulp


cnpm install gulp -g


如果在某个工程文件夹中提示错误,那就手动再安装下“gulp”:

1.gif

 

5)新建package.json文件


在命令窗口输入指令“cnpm init”。如果在Git Bash打这个指令,会报“No gulpfile found”的错误。


image.png

 

6)新建gulpfile.js文件


gulpfile.js是gulp项目的配置文件,里面是task的配置。简易代码如下:


var gulp = require('gulp');
gulp.task('default', function() {
  // 将你的默认的任务代码放在这
});


7)删除node_modules文件夹


当安装了各种插件后,在你相应的目录下面会出现node_modules文件夹,里面又嵌套了很深的文件夹目录,如果你用右键删除的方式,会变得很慢,并且还会提示错误“无法删除”。


image.png


这里有个方法,用npm里面一个专门用于删除的模块插件“rimraf”。


cnpm install -g rimraf


只需要打简单的指令就可删除:


1 cd xxx[include node_modules folder] //用cd指令将文件目录设置到包含nod_modules的位置
2 
3 rimraf node_modules


二、插件与功能


1)全局配置config


可以将需要在gulpfile中引用的参数,放到这里,包括一些路径,功能的开关等。例如

module.exports = {
    name : '.....',
    devPath : '.....',    //项目根路径,根路径下可以包含多个项目
    prodPath : '....', //生产路径根路径
    sassPath : '.....', //SASS包含文件路径
    rmHtmlWhitespace : false,//html中是否去除空格
    webpackEntry : {
        index : 'index.js'//js合并
    },
    server : {
        port : 8088
    }
};


注意下这里使用了module.exports,这是nodejs的语法。在gulpfile中将会用require引用config。

//加载项目配置
var config = require('./config');


2)监控gulp.watch


这个是gulp自带的,就是当你的文件改动了后,就做相应的task。还有一个插件gulp-watch

监控sass中的文件变化,一有变化就做sass的编译。“**”与“*”这种语法可以参考《Gulp:任务自动管理工具


gulp.task('watch', function() {
    livereload.listen();
    gulp.watch('**.html', ['html']);
      gulp.watch('./sass/*.scss', ['sass']);
      gulp.watch('./css/*.css', ['css']);
      gulp.watch('./js/*.js', ['js']);
});

监控了四个地方的修改,js、html、css和sass,并且有做了自动刷新livereload。这个是通过“gulp-livereload”来实现的。

firefox货chrome要分别安装插件才可运行。chrom插件如下:


2.png


安装完后会在浏览器中出现个小按钮,image.png,注意是黑色的时候才是在执行中。还有就是要在相应的task中加相应的代码:


.pipe(livereload())


3)sass编译与css压缩


通过sass编写css,能更模块化,多人协作比较方便。安装gulp-sass

plumber()”是引用了“gulp-plumber”,任务错误中断自动重传。在使用一段时间后发现,执行了“plumber()”后监控是还继续的,但是sass就不会自动编译了。

后面把“plumber()”去掉,添加红色部分,这样就不会出现不编译的情况了。


gulp.task('sass', function() {
    gulp.src('./sass/*.scss')
            .pipe(plumber())
            .pipe(sass().on('error', sass.logError))
            .pipe(gulp.dest('./css'))
            .pipe(livereload());
});

gulp-cssnano,压缩CSS代码。

gulp.task('css', ['sass'], function() {
    //先删除dist中的css,有时候会不更新
    gulp.src('./dist/css/*.css')
        .pipe(rimraf({force: true}));
    gulp.src('./css/*.css')
        .pipe(cssnano())
        .pipe(gulp.dest('./dist/css'))
        .pipe(livereload());
});


4)js压缩与模块化合并


使用gulp-uglify做js的压缩。gulpRimraf()用来删除文件夹,引用自gulp-rimraf


gulp.task('js', function() {
    //先删除dist中的css,有时候会不更新
    gulp.src('./dist/js/*.js')
        .pipe(rimraf({force: true}));
    gulp.src('./js/*.js')
        .pipe(plumber())
        .pipe(jshint())
        .pipe(jshint.reporter('default'))
        .pipe(uglify())
        .pipe(gulp.dest('./dist/js'))
        .pipe(livereload());
});


上面的jshint是用来分析代码的,例如分号没写。通过打指令“gulp-jshint

3.png

模块化合并使用webpack-stream点击查看文档。github上面还有篇说明教程


gulp.task('webpack', function(){
    var entry = {};
    for(var name in config.webpackEntry){
        entry[name] = './js/' + config.webpackEntry[name];
    }
    //排除bundle文件
    return gulp.src('./js/*[^bundle].js')
        .pipe(plumber())
        .pipe(webpack({
            entry: entry,
            output: {
                filename: '[name].bundle.js',
            }
        }))
        .pipe(gulp.dest('./js'));
});


5)image图片无损压缩


通过gulp-image压缩的图片,有时候能牙70%以上,非常给力。


gulp.task('image', function(){
    gulp.src('./img/*.+(jpg|png|gif|svg)')
         .pipe(imagemin())
       .pipe(gulp.dest('./dist/img'));
});


image.png

 

6)html压缩


经过gulp-htmlmin压缩过的html可以缩小很多,可以看到都挤到了一起,有很多参数可以选择,比如去除空格等。

还可以通过gulp-replace来给静态资源文件加个版本号。


gulp.task('html', function() {
    gulp.src('*.html')
        .pipe(replace('__VERSION', Date.now().toString(16)))
        .pipe(htmlmin({collapseWhitespace: true}))
        .pipe(gulp.dest('./dist'))
        .pipe(livereload());
});


7)fontmin字体压缩


网上有很多webfont,例如国外的Font Awesome,国内的iconfont。都能做出漂亮的自定义字体。

与西文字体不同,由于字符集过大,中文字体无法享受 webfont 带来的便利。为了让中文字体也乘上这道风,我们需要对其进行min。使用指令“gulp-fontmin”。


gulp.task('font', function() {
    gulp.src('font/*.+(eot|svg|ttf|woff)')
      .pipe(fontmin({
          text: '人晒'
      }))
      .pipe(gulp.dest('dist/font'));
});

配置的两个字“人晒”与没配置的“国”,明显有区别。


image.png

 


8)CSS自动加浏览器前缀


gulp-autoprefixer”可以自动加“-webkit”、“-moz”等的前缀,自己可以少写很多兼容代码。可以在上面的sass的编译中添加一个引用。

有多个参数,点击查看说明。“last 2 versions”是浏览器的过滤设置,还有多个值,可以查看这里。插件并不仅仅是加个前缀,还能编译出旧的语法。例如flex的不同写法。

后面又查到一个插件“autoprefixer”,用户量非常,这是一个PostCSS插件,需要引入“gulp-postcss”。更多的PostCSS插件可以查看这里


gulp.task('sass', function() {
    gulp.src('./sass/*.scss')
            .pipe(plumber())
            .pipe(sass().on('error', sass.logError))
            .pipe(autoprefix({
            browsers: ['last 2 versions', 'Firefox < 20'],
            cascade: false
           }))
            .pipe(gulp.dest('./css'))
            .pipe(livereload());
});


4.jpg

输出:

5.jpg

 

9)将px自动转换为rem

使用了一个PostCSS插件,“postcss-px2rem”。

如果不想编译成rem单位,就在属性后面写“/*px*/”或“/*no*/”,这两个值也有点不同,具体参考这里


var postcss = require('gulp-postcss');
var px2rem = require('postcss-px2rem');
gulp.task('sass', function () {
    var processors = [px2rem({remUnit: 75})];
    return gulp.src('./sass/*.scss')
        .pipe(gulpSass().on('error', gulpSass.logError))
        .pipe(postcss(processors))
        .pipe(gulp.dest('./css/')).pipe(livereload());
});


通过gulp-connect,可以做个server。如果你用notpad++这种开发页面,那这个指令会很有用。


gulp.task('server', function(){
    var option = {
        root : config.devPath,
        port : config.server.port
    };
    if(config.server.root){
        option.root = config.server.root;
    }
    connect.server(option);
});


image.png

上面的localhost可以改成本机的IP地址,手机与电脑在同一个网段的话,就可以直接用手机调试了。

 

11)node_modules目录

node_modules目录中的内容非常大,如果在每个工程下面都安装,会造成很大的浪费。可以将其放在各个工程的公共父级中,而在各个目录下面使用自己的gulpfile.js,config.js等配置文件。

例如工程都在public文件夹中,我就将node_modules放在public的平级。


 6.jpg


相关文章
|
9月前
|
前端开发 JavaScript UED
一看就懂的gulp操作指南:让前端工作变得更加轻松(二)
一看就懂的gulp操作指南:让前端工作变得更加轻松
|
9月前
|
缓存 前端开发 JavaScript
一看就懂的gulp操作指南:让前端工作变得更加轻松(一)
一看就懂的gulp操作指南:让前端工作变得更加轻松
|
9月前
|
JavaScript 前端开发 API
一看就懂的gulp操作指南:让前端工作变得更加轻松(三)
一看就懂的gulp操作指南:让前端工作变得更加轻松
|
3月前
|
缓存 监控 前端开发
前端工程化:Webpack与Gulp的构建工具选择与配置优化
【10月更文挑战第26天】前端工程化是现代Web开发的重要趋势,通过将前端代码视为工程来管理,提高了开发效率和质量。本文详细对比了Webpack和Gulp两大主流构建工具的选择与配置优化,并提供了具体示例代码。Webpack擅长模块化打包和资源管理,而Gulp则在任务编写和自动化构建方面更具灵活性。两者各有优势,需根据项目需求进行选择和优化。
114 7
|
3月前
|
缓存 前端开发 JavaScript
前端工程化:Webpack与Gulp的构建工具选择与配置优化
【10月更文挑战第27天】在现代前端开发中,构建工具的选择对项目的效率和可维护性至关重要。本文比较了Webpack和Gulp两个流行的构建工具,介绍了它们的特点和适用场景,并提供了配置优化的最佳实践。Webpack适合大型模块化项目,Gulp则适用于快速自动化构建流程。通过合理的配置优化,可以显著提升构建效率和性能。
98 2
|
4月前
|
JavaScript 前端开发 搜索推荐
Gulp:构建自动化与任务管理的强大工具
【10月更文挑战第13天】Gulp:构建自动化与任务管理的强大工具
132 0
|
7月前
|
缓存 前端开发 JavaScript
前端 JS 经典:构建工具
前端 JS 经典:构建工具
86 0
|
9月前
|
前端开发 JavaScript 开发者
【专栏】前端工程化的重要性,强调构建工具在其中的角色,如Webpack和Rollup
【4月更文挑战第27天】本文探讨了前端工程化的重要性,强调构建工具在其中的角色,如Webpack和Rollup。Webpack以其灵活性和插件系统适用于复杂SPA项目,建议开发者理解其核心概念并优化性能。Rollup则专注于JavaScript模块打包,生成更小、更快的代码,适合小型至中型项目和库创建,以其Tree-shaking技术减小代码体积。开发者应根据项目需求、团队技术和生态选择合适工具,掌握核心原理以提升开发效率和质量。
90 1
|
9月前
|
前端开发 JavaScript Java
npm与Maven:前端与后端构建工具深度对比学习
npm与Maven:前端与后端构建工具深度对比学习
241 0
|
9月前
|
前端开发 UED
探索前端工程化之路:Webpack、Rollup等构建工具对比与实践
在现代前端开发中,工程化成为不可或缺的一环。本文将深入探讨常用的前端构建工具Webpack和Rollup,并比较它们在实践中的优劣势。通过对功能、性能、插件生态等方面的评估,帮助读者选择适合自己项目需求的构建工具。
113 1

热门文章

最新文章

  • 1
    前端起dev从110秒减少到7秒, 开发体验大幅提升
    15
  • 2
    无前端经验如何快速搭建游戏站:使用 windsurf 从零到上线的详细指南
    29
  • 3
    【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
    37
  • 4
    VSCode AI提效工具,通义灵码前端开发体验
    90
  • 5
    开箱即用的GO后台管理系统 Kratos Admin - 前端权限
    11
  • 6
    以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
    45
  • 7
    大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
    79
  • 8
    【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
    33
  • 9
    巧用通义灵码,提升前端研发效率
    107
  • 10
    【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    155