前端自动化构建工具vGulp

Github地址:https://github.com/Alvin-Liu/...

开始之前

关于Gulp的介绍网上有许多,完整的Gulp自动化工作流配置也不少,但或多或少有不让人满意的地方,加上项目的需要,于是自己便开始尝试写一个自己的前端自动化工作流。项目需求不同,配置肯定有些许区别,所以不能保证vGulp能用于你的项目中。本文只做参考,希望能为你提供一些帮助,具体的配置请根据实际情况调整。vGulp需要打磨之处还有许多,欢迎各路大神指正。

关于vGulp

vGulp基于Gulp 3.9.1开发而成,用于处理前端项目文件的编译、压缩、合并、打包工作。HTML使用ejs模板编译而成,可根据自定义的语言包和命令编译成不同语言的HTML文件;css使用sass预处理编译而成,自动添加-webkit-、-moz-、-ms-等前缀;JS没有做过多处理,可以根据个人需要在gulpfile.js文件中添加JSLint或ESLint等。

什么情况下可以使用vGulp:

  • F5键坏了,手指不够长,懒...

  • Apaphe等环境下修改文件,找不到合适的自动刷新工具

  • 开发多语言版本的网站页面等

vGulp使用方法

1.安装Node.js,安装Gulp(Node.js安装方法请自行搜索,Gulp入门):


$ npm install --global gulp        // 全局安装
$ npm install --save-dev gulp    // 作为项目的开发依赖

2.克隆或者下载本项目,github地址:https://github.com/Alvin-Liu/vGulp:

$ git clone https://github.com/Alvin-Liu/vGulp.git

3.安装模块依赖:

npm install

4.根据需要简单配置自己的config.json,示例代码:


{
    "project" : "vGulp",    // 项目名   
    "src": {    // 源文件目录
        "ejs": "src/ejs", 
        "sass": "src/sass",
        "images": "src/images",
        "js": "src/js",
        "css": "src/css", 
        "source": "src/source",     //  其他文件,如视频,音乐,字体等
        "data": "language/data.json"     // 语言包路径
    },
    "dist": {    // 打包后文件目录
        "html": "html",
        "js": "static/js",
        "css": "static/css",
        "images": "static/images",
        "source": "static/source"
    },
    "localserver" : {    // 本地服务器
        "baseDir" : "src",    //    网站根目录
        "port" : "8081",    //  端口
        "proxy": false,        //  时候启用代理
        "target": "127.0.0.1"    // 代理地址
    },
    "lang":["zh","en"],        // 语言种类,HTML代码将编译到对应的文件夹中
    "data_use": 1,            // 指定data.json文件用那一种方式,目前可选0或者1,请看注意事项
    "displayInfo": false,    // 是否启用文件头部追加内容
    "pkg": {    // 追加内容模板请在gulpfile.js中修改
        "author":"",        
        "description":"",
        "version":"1.0.0",
        "homepage":"#",
        "license":""
    },
    "replaceWord": {    // 全局关键字替换
        "html": {
            "origin": "../",
            "dist": "../../static/"
        },
        "js": {
            "origin": "",
            "dist": ""
        },
        "css": {
            "origin": "",
            "dist": ""
        }
    },
    "concatCssFiles": {    // css合并,暂时只支持一个
        "filename": "init.min.css",        // 合并后的文件名
        "folder": "common",        // 合并该文件夹中的内容
        "files": ["init.css","header.css"]    //  指定合并后的文件的先后顺序
    },
    "concatJsFiles": {    // js合并
        "filename": "global.min.js",
        "folder": "common",
        "files": ["b.js","a.js"]
    }      
}

5.根据需要修改gulpfile.js(请尽量熟悉vGulp之后再尝试);

6.执行gulp任务:

gulp help   // gulp参数说明
gulp        // 开发,添加命令 --lang= 可以指定语言,例:gulp --lang=en
gulp build  // 打包
gulp ejs    // ejs模板编译
gulp sass   // sass编译
gulp js     // js合并
gulp clean  // 清理无用文件
gulp watch  // 监听文件改变

特别说明

1.在命令后添加 --lang=en 或者 --lang= 指定语言版本,可以执行该语言对应的命令操作,如:

gulp build --lang=en  // 只会打包en语言下的HTML文件 

2.多语言时,有两种方法应用页面数据,根据个人喜欢在config.json中配置data_use为0或者1;

  • data_use为0时,一个语言对应一个文件夹,且一个页面对应一个文件夹中的一个文件,如:index.ejs的数据对应index.json。使用该方式时,请先修改data文件的引用路径为 language ,不要指定具体的文件名;

  • data_use为1时(默认),所有文件对应同一个json文件,config中data.json文件的引用指定到具体的文件名。

3.多语言时,同一个页面由于字体长度等原因显示会有所差别,此时可以另外引入单独的针对该文件的css代码,所有ejs页面中都可以引用_lang这一全局变量,进行指定语言引入指定内容,如参考代码中的内容:

<%# 只有当语言为'zh'时,引入文件zh.css %>
<% if(_lang='zh'){ %>    
    <%- include('extra/zh.css') %>
<% } %>


如果了解Gulp或者只是需要一款刷新工具,下面内容可以忽略

vGulp 插件介绍

主要插件

以下插件由于使用频率较高且文档较多,使用简单,固仅做列表介绍(毕竟这篇文档主要目的不是用于介绍插件的,是吧):

  • gulp-ejs: 编译ejs文件(项目使用的是ejs,使用其他请自行更换);

  • gulp-data: 配合gulp-ejs等使用,用于引入文件数据,如json文件等;

  • gulp-sass: 编译sass;

  • gulp-clean-css: 压缩css文件;

  • gulp-concat: 合并文件;

  • gulp-autoprefixer: 自动处理浏览器前缀, 如添加 -webkit- ;

  • gulp-uglify: 压缩js文件;

  • gulp-clean: 进行多余文件的清理;

  • gulp-imagemin: 压缩图片;

  • gulp-css-spriter: 用于合成css雪碧图;

  • gulp-htmlmin: 压缩html;

辅助插件

browser-sync

Browsersync能让浏览器实时、快速响应您的文件更改(htmljscsssassless等)并自动刷新页面。

gulp-load-plugins

顾名思义,本插件的功能就是帮你自动require你在package.json中声明的依赖。只要一句var $ = require('gulp-load-plugins')(),则package.json中声明的gulp-gulp.开头的插件就会自动被放在变量$下面。如$.util就等于require('gulp-util')

gulp-if

这个插件的功能也很简单,可以条件性的添加stream,如.pipe($.if(flag, action1())),则只会在flag变量为true时才会将action1()添加到stream中去。

gulp-filter

gulp-filter可以把stream里的文件根据一定的规则进行筛选过滤。比如gulp.src中传入匹配符匹配了很多文件,可以把这些文件pipegulp-filter作二次筛选,如gulp.src('**/*.js').pipe($.filter(**/a/*.js)),本来选中了所有子文件下的js文件,经过筛选后变成名为a的子文件夹下的js文件。

gulp-plumber

这个插件的作用简单来说就是一旦pipe中的某一steam报错了,保证下面的steam还继续执行。因为pipe默认的onerror函数会把剩下的stream给unpipe掉,这个插件阻止了这种行为。

gulp-header

这个工具用来在压缩后的JS、CSS文件中添加头部注释,你可以包含任意想要的信息,通常就是作者、描述、版本号、license等。

gulp-order

gulp-order可以指定文件在stream中的执行顺序,例如本例中css合并时,可以指定合并后css文件的前后顺序,防止前面的样式被后面的覆盖。

gulp-replace

在项目中这个插件还是挺有用的,可以批量替换字符串,并且支持使用正则替换。

gulp-print

这个插件的作用很简单,打印出stream里面的所有文件名,通常调试的时候比较需要。

gulp-rename

该插件可以对文件进行重新命名。

其他Node.js模块简介

yargs

yargs是Node中处理命令行参数的通用解决方案。只要一句代码var args = require('yargs').argv;就可以让命令行的参数都放在变量args上,非常方便。它可以处理的参数类型也是多种多样的:

单字符的简单参数,如传入-m=5或-m 5,则可得到args.m = 5。
多字符参数(必须使用双连字符),如传入--lang=en或--lang en,则可得到args.lang = en。
不带值的参数,如传入--mock,则会被认为是布尔类型的参数,可得到args.mock = true。
除此之外,还支持很多其他类型的传参方式,具体可参考它的文档。

fs

fs是Node的文件系统模块,所有的方法都有异步和同步的形式。vGulp主要使用fs模块对文件进行判断存在和读取操作。

path

path模块用于对路径进行操作,如:

path.join([path1][, path2][, ...])

用于连接路径。该方法的主要用途在于,会正确使用当前系统的路径分隔符,Unix系统是"/",Windows系统是""。

path.dirname(p)

返回路径中代表文件夹的部分。

path.basename(p[, ext])

返回路径中的最后一部分。

path.extname(p)

返回路径中文件的后缀名,即路径中最后一个'.'之后的部分。如果一个路径中并不包含'.'或该路径只包含一个'.' 且这个'.'为路径的第一个字符,则此命令返回空字符串。

var path = require('path'),
    file = 'D:/git/vGulp/test.js';

console.log(path.join('/hi', 'test', '2s/1s', 'tab', '..'));    // \hi\test\2s\1s
console.log(__dirname);                // D:\git\vGulp
console.log(path.dirname(file));    // D:/git/vGulp
console.log(path.basename(file));    // test.js
console.log(path.extname(file));    // .js

补充

待改进

  • 配置好像有点繁琐(自我感觉)

  • 没有进行md5命名和寻找更好的路径替换方式等

  • Gulp 4.0好像快来了

更多

关于node的更多内容请参考官方文档。

Gulp中文网

参考内容:

常用gulp插件介绍

JGulp:利用Gulp 配置的前端项目自动化工作流

你可能感兴趣的:(前端构建,gulp)