Gulp学习指南之CSS合并、压缩与MD5命名及路径替换

澳门新葡亰手机版 5

这里主要记录一下用gulp来合并、压缩CSS以及进行MD5命名以及替换文件中引入的CSS文件,当然这一系列操作都是用基于gulp插件的,主要会用到下面的几个插件:

本章是《maven实战》最后一章啦,十四章走来,每天都在坚持,同时也简单的记录了自己每一天的点点滴滴,感谢大家支持,我会继续走下去,希望能在今后给大家带来更加精彩的故事接下来我准备向《高性能MySQL》进军啦,可能过程中笔记更新会不定期,但是我还是会按照章节的方式记录每一章重点并呈现给大家,所以前方路途虽远,但坚持就是胜利,一起加油吧!!!

varconcat=require(gulp-concat);//-多个文件合并为一个;varminifyCss=require(gulp-minify-css);//-压缩CSS为一行;varrev=require(gulp-rev);//-对文件名加MD5后缀varrevCollector=require(gulp-rev-collector);//-路径替换

澳门新葡亰手机版 1forgive.jpg

安装Gulp插件到本地项目

可以把archetype当做一个模板,当我们要创建一些项目的时候,可以通过简单的maven命令就可以快速生成项目的骨架

npminit//-生成一个package.json,里面是一些常规的配置信息npminstallgulpgulp-concatgulp-minify-cssgulp-revgulp-rev-collector--save-dev//-安装插件到项目目录内

使用archetype的一般步骤

mvn archetype:generate,mvn会列出一个列表供用户选择

澳门新葡亰手机版 2archetype项目列表.png

这个列表来自archetype-catalog.xml文件,在后续操作中,用户需要提供一些通用的基本参数,主要有groupId,artifactId,version,package,这样archetype插件就可以生成项目的骨架了

批处理方式不同在于使用上述命令时直接把参数给出来,同时使用-B参数要求archetype插件以批处理的方式运行,不过需要用户显示给出archetype的坐标信息

mvn archetype:generate -B -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.0 -DgroupId=com.zheng.mavenstudy-DartifactId=archetype-test -Dversion=1.0-SNAPSHOT -Dpackage=com.zheng.mavenstudy

完成上面两步后,会在我们的项目内生成一个package.json文件以及一个node_modules目录

常用的archetype介绍

maven-archetype-quickstart默认值
常用于一般javase项目结构maven-archetype-webapp
用于web项目架构appfuse archetype``appfuse是一个集成了很多开源工具的项目,在于帮助程序员快速高效的创建项目,它提供了大量archetype,方便用户使用各种类型的项目

创建配置文件 gulpfile.js

编写自己的archetype项目

一个archetype-maven项目需要包含以下几个重要部分pom.xml
archetype自身的pomsrc/main/resources/archetype-resources/pom.xml
基于该archetype生成的项目pom原型src/main/resources/META-INF/maven/archetype-metadata.xml
archetype的描述符文件src/main/resources/archetype-resources/
其他需要包含在archetype项目中的内容基本结构如下

澳门新葡亰手机版 3自定义archetype项目结构.png

archetypepom.xml文件,用于定义archetype项目的坐标archetype-test/pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.zheng.archetypestudy</groupId> <artifactId>archetype-test</artifactId> <version>1.0-SNAPSHOT</version></project>

生成的项目pom.xml用于描述生成项目中包含的一些配置,包括参数、依赖等,其中groupId,artifactId,version使用了属性替换文件位于archetype-test/src/main/resources/archetype-resources/pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>${groupId}</groupId> <artifactId>${artifactId}</artifactId> <version>${version}</version> <packaging>jar</packaging> <name>${artifactId}</name> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> </dependencies> <build> <pluginManagement> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.6.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>2.6</version> <configuration> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> </pluginManagement> </build></project>

archetype-metadata.xml文件,用于描述archetype项目哪些文件夹及目录需要被引入到项目中位于archetype-test/src/main/resources/META-INF/maven/archetype-metadata.xml其中通过fileSets设置了需要被用于项目中的文件,通过filtered,packaged分别设置指定目录下包含的文件是否需要属性值替换,同时对应的目录是否需要生成包目录

<?xml version="1.0" encoding="UTF-8"?><archetype-catalog xsi:schemaLocation="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-catalog/1.0.0 http://maven.apache.org/xsd/archetype-catalog-1.0.0.xsd" xmlns="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-catalog/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <fileSets> <fileSet filtered="true" packaged="true"> <directory>src/main/java</directory> <includes> <include>**/*.java</include> </includes> </fileSet> <fileSet filtered="true" packaged="true"> <directory>src/test/java</directory> <includes> <include>**/*.java</include> </includes> </fileSet> <fileSet filtered="true" packaged="false"> <directory>src/main/resources</directory> <includes> <include>**/*.properties</include> </includes> </fileSet> </fileSets> <requiredProperties> <requiredProperty key="groupId"> <defaultValue>com.zheng.archetypestudy</defaultValue> </requiredProperty> </requiredProperties></archetype-catalog>

上面配置的src/main/java,src/test/java,src/main/resources,分别指向目标项目的src/main/java,src/test/java,src/main/resources对应于archetype-test项目的archetype-test/src/main/resources/archetype-resources/src/main/java``archetype-test/src/main/resources/archetype-resources/src/test/java``archetype-test/src/main/resources/archetype-resources/src/main/resources其中配置的src/main/java目录,采用通配符方式包含所有当前包及其子包下的java文件,最终出现在目标项目project-name/src/main/java/[package-name]/**/*.java

自定义的一些项目文件archetype-test/src/main/resources/archetyperesources/src/main/java/dao/BaseDao.java

package ${package}.dao;import java.io.Serializable;import java.util.List;/** * 基础数据接口 * Created by zhenglian on 2017/8/21. */public interface BaseDao<T> { void save; void update; int delete(Serializable id); T findById(Serializable id); List<T> findAll();}

注意上面package引入通过${package}变量名方式,这样可以通过在命令行时动态指定,结合上面所提供的archetype-metadata.xml配置,对指定文件进行变量替换archetype-test/src/main/resources/archetype-resources/src/main/java/service/BaseService.java

package ${package}.service;import java.io.Serializable;import java.util.List;/** * 基础服务接口 * Created by zhenglian on 2017/8/21. */public interface BaseService<T> { void save; void update; int delete(Serializable id); T findById(Serializable id); List<T> findAll();}

配置完成后,项目总体结构如上面给出的图所示,通过mvn clean installarchetype项目打包到本地仓库中如此就可以通过mvn archetype:generate命令使用本地创建的archetype项目架构了mvn archetype:generate -DarchetypeGroupId=com.zheng.archetypestudy -DarchetypeArtifactId=archetype-test -DarchetypeVersion=1.0-SNAPSHOT

注意在运行该命令的时候,如果是在archetype-test项目根目录下,那么会报错,提示Unable to add module to the current project as it is not of packaging type 'pom',说明当前创建的项目为模块项目,而父级目录不是一个pom类型的项目,所以报错在上一级目录下运行即可

澳门新葡亰手机版 4自定义archetype运行结果.png

在项目根目录内创建一个gulpfile.js文件(必须是这个文件名哟~),内容就是上面几个插件的配置信息:

archetypeCatalog

在使用maven-archetype-plugin插件时,会得到一个列表供选择,这个列表的信息来源于一个名为archetype-catalog.xml的文件用户可以自定义这个archetype-catalog.xml中的内容,当然也可以通过扫描本地仓库自动生成基于该仓库的archetype-catalog.xml文件那么archetype-catalog.xml配置文件是从哪里来的呢,maven中有以下几种选择:internal
maven内置的archetypeCataloglocal
指向用户本地的archetype catalog,其位置为C:UsersAdministrator.m2archetype-catalog.xml,但是该文件默认是不存在的remote
指向了maven中央仓库的archetype catalog,具体地址为http://repo1.maven.org/maven2/archetype-catalog.xmlfile://…
用户可以指定本机任何位置的archetype-catalog.xml文件http://…
用户可以使用http协议指定远程的archetype-catalog.xml文件上面几种方式可以通过mvn archetype:generate命令的时候,使用archetypeCatalog指定插件使用的catalog,例如:mvn archetype:generate -DarchetypeCatalog=local

澳门新葡亰手机版 5使用本机archetypecatalog.png

上面的local指定使用C:UsersAdministrator.m2archetype-catalog.xml配置文件

<?xml version="1.0" encoding="UTF-8"?><archetype-catalog xsi:schemaLocation="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-catalog/1.0.0 http://maven.apache.org/xsd/archetype-catalog-1.0.0.xsd" xmlns="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-catalog/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <archetypes> <archetype> <groupId>org.apache.maven.archetypes</groupId> <artifactId>maven-archetype-mojo</artifactId> <version>1.0</version> <description>plugin</description> </archetype> <archetype> <groupId>org.apache.maven.archetypes</groupId> <artifactId>maven-archetype-quickstart</artifactId> <version>1.0</version> <description>quickstart</description> </archetype> <archetype> <groupId>org.apache.maven.archetypes</groupId> <artifactId>maven-archetype-quickstart</artifactId> <version>1.1</version> <description>quickstart</description> </archetype> <archetype> <groupId>org.apache.maven.archetypes</groupId> <artifactId>maven-archetype-webapp</artifactId> <version>1.0</version> <description>webapp</description> </archetype> <archetype> <groupId>org.appfuse.archetypes</groupId> <artifactId>appfuse-modular-spring</artifactId> <version>2.0</version> <description>appfuse-modular-spring</description> </archetype> </archetypes></archetype-catalog>

上面的archetype-catalog.xml是通过扫描本地仓库自动生成的,可以通过mvn archetype:crawl来浏览当前本地仓库的项目结构,默认会生成到本地仓库(localRepository)配置的根目录下当然也可以通过-Drepository澳门新葡亰手机版,指定本地仓库位置,-Dcatalog指定生成的archetype-catalog.xml生成的方式mvn archetype:crawl -Drepository=G:/workspace/repository -Dcatalog=C:/Users/Administrator/.m2/archetype-catalog.xml如果没有指定-Drepository参数时,maven会通过settings.xml中配置的本地仓库进行解析

通过学习上面,我相信大家应该可以通过自定义自己的archetype来生成属于自己的项目骨架啦,赶紧动起来吧!

vargulp=require(gulp);varconcat=require(gulp-concat);//-多个文件合并为一个;varminifyCss=require(gulp-minify-css);//-压缩CSS为一行;varrev=require(gulp-rev);//-对文件名加MD5后缀varrevCollector=require(gulp-rev-collector);//-路径替换gulp.task(concat,function(){//-创建一个名为concat的taskgulp.src([./css/wap_v3.1.css,./css/wap_v3.1.3.css])//-需要处理的css文件,放到一个字符串数组里.pipe(concat(wap.min.css))//-合并后的文件名.pipe(minifyCss())//-压缩处理成一行.pipe(rev())//-文件名加MD5后缀.pipe(gulp.dest(./css))//-输出文件本地.pipe(rev.manifest())//-生成一个rev-manifest.json.pipe(gulp.dest(./rev));//-将rev-manifest.json保存到rev目录内});gulp.task(rev,function(){gulp.src([./rev/*.json,./application/**/header.php])//-读取rev-manifest.json文件以及需要进行css名替换的文件.pipe(revCollector())//-执行文件内css名的替换.pipe(gulp.dest(./application/));//-替换后的文件输出的目录});gulp.task(default,[concat,rev]);

运行结果

通过以上的配置之后,就可以开始运行gulp对我们的项目进行相关的操作啦;

使用gulp命令,运行Gulp.js构建程序