如何打开电脑正在运行的程序
按组合键ctrl+alt+del就能看到或者在屏幕下面的任务栏的空白处(没有运行软件提示的地方)里点右键。就能看到有‘任务管理器’点任务管理器就能看到正在运行的所有程序。点击管理器里的‘进程’就能看到所有的系统的和非系统的运行程序使用CPU、内存的情况,如果你有些基础知识,就能在这个地方找到运行的病毒和资源占用很大的程序。顺便说一下。有的时候电脑因为运行某个程序中断。导致不能正常关闭该程序的时候在管理器里可以直接强行关闭
如何保存网页上的 !所有的! 图片及资源 /HTML CSS
1、打开一个IE的浏览器的功能,进入到一个网页的页面上,在左上角的位置,点击“文件”选项的功能。2、在弹出下拉菜单中,然后点击“另存为”的选项功能。3、在保存到电脑时候,对保存类型进行修改,修改为“网页,全部(*.htm;*.html)”,这样就可以把网页全部网页内容保存下来,包括图片,js等内容,4、保存的图片会直接保存在文件夹内,也有其它的内容。
电脑运行程序的顺序是什么
在一台最常见的计算机上,程序从某种外部设备,通常是硬盘,被加载到计算机之内。 如果是我们现在使用的普通电脑结构,那么程序就被加载入内存。 指令串行顺序执行,直到一条跳转或转移指令被执行,或者一个中断出现。所有这些指令都会改变指令寄存器的内容。基于这种体系的计算机,如果没有程序的支持,将无法工作。一个计算机程序是一系列指令的集合。程序里的指令都是基于机器语言;程序通常首先用一种计算机程序设计语言编写,然后用编译程序或者解释执行程序翻译成机器语言。 有时,也可以用汇编语言编程,汇编语言实质就是表示机器语言的一组记号-在这种情况下,用于翻译的程序叫做汇编程序。
也就是说,当你双击某个程序时:
1、首先由CPU发出指令,从硬盘读取数据,然后调入内存中执行。
2、程序控制指令:也称转移指令。
执行程序时,有时机器执行到某条指令时,出现了几种不同结果,这时机器必须执行一条转移指令,根据不同结果进行转移,从而改变程序原来执行的顺序。
这种转移指令称为条件转移指令。除各种条件转移指令外,还有无条件转移指令、转子程序指令、返回主程序指令、中断返回指令等。 转移指令的转移地址一般采用直接寻址和相对寻址方式来确定。
如何实现Activiti的分支条件的自定义配置
一、Activiti的流程分支条件的局限
Activiti的流程分支条件目前是采用脚本判断方式,并且需要在流程定义中进行分支条件的设定,如下图所示:
${input == 1}
${input == 2}
${input == 3}
从上面的定义可以看到,流程的分支条件存在以下两个致命的局限性:
1.分支条件需要在流程定义(XML)中设定,这要求流程定义必须由开发人员来设计及编写
2.分支条件比较简单,一般为boolean表达式,表达式里的为单变量的判断处理。
以上两个局限性限制了流程的分支判断处理必须由开发人员来设定,而国内的大部分的流程应用都要求是普通的业务人员即可处理,或者是由有一定计算机基础的人员来设置处理。这要求我们对流程的条件设置提出了更高的要求,上一节我们通过修改Activiti的流程定义的XML中的分支条件表达式,同时刷新流程定义的引擎缓存,如下的代码就是基于这种方式:
JsonNode jsonObject=objectMapper.readTree(configJson);
JsonNode configsNode=jsonObject.get("configs");
BpmSolution bpmSolution=bpmSolutionManager.get(solId);
BpmDef bpmDef=bpmDefManager.getLatestBpmByKey(bpmSolution.getDefKey(), ContextUtil.getCurrentTenantId());
ActProcessDef processDef=actRepService.getProcessDef(bpmDef.getActDefId());
String processDefXml=actRepService.getBpmnXmlByDeployId(bpmDef.getActDepId());
System.out.println("xml:"+processDefXml);
ActNodeDef sourceNode=processDef.getNodesMap().get(nodeId);
ByteArrayInputStream is=new ByteArrayInputStream(processDefXml.getBytes());
Map map = new HashMap();
map.put("bpm","http://www.omg.org/spec/BPMN/20100524/MODEL");
map.put("xsi","http://www.omg.org/spec/BPMN/20100524/MODEL");
SAXReader saxReader = new SAXReader();
saxReader.getDocumentFactory().setXPathNamespaceURIs(map);
Document doc = saxReader.read(is);
//Document doc=Dom4jUtil.load(is, "UTF-8");
Element rootEl=doc.getRootElement();
if(configsNode!=null){
//取得分支条件列表
JsonNode configs=configsNode.get("conditions");
if(configs!=null){
Iterator it=configs.elements();
while(it.hasNext()){
ObjectNode config=(ObjectNode)it.next();
String tmpNodeId=config.get("nodeId").textValue();
String tmpCondition=config.get("condition").textValue();
Element seqFlow=(Element)rootEl.selectSingleNode("/bpm:definitions/bpm:process/bpm:sequenceFlow[@sourceRef='"
+sourceNode.getNodeId()+"' and @targetRef='"+tmpNodeId+"']");
if(seqFlow==null) continue;
Element conditionExpress=(Element)seqFlow.selectSingleNode("bpm:conditionExpression");
if(conditionExpress==null){
conditionExpress=seqFlow.addElement("conditionExpression");
conditionExpress.addAttribute("xsi:type", "tFormalExpression");
}else{
conditionExpress.clearContent();
}
conditionExpress.addCDATA(tmpCondition);
}
}
}
//修改流程定义的XML,并且清空该流程定义的缓存
actRepService.doModifyXmlAndClearCache(bpmDef.getActDefId(),bpmDef.getActDepId(), doc.asXML());
【说明】
1.基于这种方式容易出错,因为流程的分支条件写回流程定义的XML是比较容易出问题的,同时不清楚人员填写什么条件回XML文件中。
2.对于Jsaas中的一个流程定义可用于多个流程解决方案中使用配置不同的条件不太适合,因为一个流程定义是一样,但可能会分支的条件设置不一样。
基于以上的要求,为此我们对Activiti进行扩展,以使得我们可以允许流程引擎在分支判断处理中,执行我们的条件设置,其原理如下:
当流程引擎跳至分支条件判断处理时,可以让它执行我们的脚本设置条件,条件满足时,则跳至我们的设置的目标节点,从而实现干预流程引擎本身的执行方式,为了不影响Activiti的原的运行机制,我们还是保留其旧的执行判断方式。
二、Activiti的扩展点
Activiti的流程扩展是比较灵活的,我们通过改写这个ExclusiveGateway的节点的行为方法即可,其实现方法如下:
package com.redxun.bpm.activiti.ext;
import java.util.Iterator;
import javax.annotation.Resource;
import org.activiti.engine.impl.bpmn.behavior.ExclusiveGatewayActivityBehavior;
import org.activiti.engine.impl.pvm.PvmTransition;
import org.activiti.engine.impl.pvm.delegate.ActivityExecution;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.redxun.bpm.core.entity.config.ExclusiveGatewayConfig;
import com.redxun.bpm.core.entity.config.NodeExecuteScript;
import com.redxun.bpm.core.manager.BpmNodeSetManager;
import com.redxun.core.script.GroovyEngine;
import com.sun.star.uno.RuntimeException;
/**
* 对网关的条件判断,优先使用扩展的配置
* @author keitch
*
*/
@SuppressWarnings("serial")
public class ExclusiveGatewayActivityBehaviorExt extends ExclusiveGatewayActivityBehavior{
protected static Logger log = LoggerFactory.getLogger(ExclusiveGatewayActivityBehaviorExt.class);
//节点的设置管理器
@Resource
BpmNodeSetManager bpmNodeSetManager;
//脚本引擎
@Resource GroovyEngine groovyEngine;
@Override
protected void leave(ActivityExecution execution) {
log.debug("enter ExclusiveGatewayActivityBehaviorExt=======================");
if (log.isDebugEnabled()) {
log.debug("Leaving activity '{}'", execution.getActivity().getId());
}
String solId=(String)execution.getVariable("solId");
String nodeId=execution.getActivity().getId();
log.debug("solid is {} and nodeId is {}",solId,nodeId);
if(StringUtils.isNotEmpty(solId)&& StringUtils.isNotBlank(nodeId)){
ExclusiveGatewayConfig configs=bpmNodeSetManager.getExclusiveGatewayConfig(solId, nodeId);
for(NodeExecuteScript script:configs.getConditions()){
String destNodeId=script.getNodeId();
String condition=script.getCondition();
log.debug("dest node:{}, condition is {}",destNodeId,condition);
//执行脚本引擎
Object boolVal=groovyEngine.executeScripts(condition, execution.getVariables());
if(boolVal instanceof Boolean){
Boolean returnVal=(Boolean)boolVal;//符合条件
if(returnVal==true){
//找到符合条件的目标节点并且进行跳转
Iterator transitionIterator = execution.getActivity().getOutgoingTransitions().iterator();
while (transitionIterator.hasNext()) {
PvmTransition seqFlow = transitionIterator.next();
if(destNodeId.equals(seqFlow.getDestination().getId())){
execution.take(seqFlow);
return;
}
}
}
}else{
throw new RuntimeException("表达式:\n "+condition+"\n返回值不为布尔值(true or false)");
}
}
}
//执行父类的写法,以使其还是可以支持旧式的在跳出线上写条件的做法
super.leave(execution);
}
}
我们通过继续改写了这个分支节点的跳出机制,并且通过脚本引擎来执行其条件分支的判断处理,但流程引擎并不了解我们扩展的类,这时我们需要配置Activiti流程引擎的行为动作工厂类,如下所示:
package com.redxun.bpm.activiti.ext;
import org.activiti.bpmn.model.ExclusiveGateway;
import org.activiti.engine.impl.bpmn.behavior.ExclusiveGatewayActivityBehavior;
import org.activiti.engine.impl.bpmn.parser.factory.DefaultActivityBehaviorFactory;
/**
* 扩展缺省的流程节点默认工厂类,实现对Activiti节点的执行的默认行为的更改
* @author keitch
*
*/
public class ActivityBehaviorFactoryExt extends DefaultActivityBehaviorFactory {
private ExclusiveGatewayActivityBehaviorExt exclusiveGatewayActivityBehaviorExt;
/**
* 通过Spring容器注入新的分支条件行为执行类
* @param exclusiveGatewayActivityBehaviorExt
*/
public void setExclusiveGatewayActivityBehaviorExt(ExclusiveGatewayActivityBehaviorExt exclusiveGatewayActivityBehaviorExt) {
this.exclusiveGatewayActivityBehaviorExt = exclusiveGatewayActivityBehaviorExt;
}
//重写父类中的分支条件行为执行类
@Override
public ExclusiveGatewayActivityBehavior createExclusiveGatewayActivityBehavior(ExclusiveGateway exclusiveGateway) {
return exclusiveGatewayActivityBehaviorExt;
}
如何实现Activiti的分支条件的自定义配置
一、Activiti的流程分支条件的局限Activiti的流程分支条件目前是采用脚本判断方式,并且需要在流程定义中进行分支条件的设定,如下图所示: ${input == 1} ${input == 2} ${input == 3} 从上面的定义可以看到,流程的分支条件存在以下两个致命的局限性:1.分支条件需要在流程定义(XML)中设定,这要求流程定义必须由开发人员来设计及编写2.分支条件比较简单,一般为boolean表达式,表达式里的为单变量的判断处理。 以上两个局限性限制了流程的分支判断处理必须由开发人员来设定,而国内的大部分的流程应用都要求是普通的业务人员即可处理,或者是由有一定计算机基础的人员来设置处理。这要求我们对流程的条件设置提出了更高的要求,上一节我们通过修改Activiti的流程定义的XML中的分支条件表达式,同时刷新流程定义的引擎缓存,如下的代码就是基于这种方式: JsonNode jsonObject=objectMapper.readTree(configJson); JsonNode configsNode=jsonObject.get("configs"); BpmSolution bpmSolution=bpmSolutionManager.get(solId); BpmDef bpmDef=bpmDefManager.getLatestBpmByKey(bpmSolution.getDefKey(), ContextUtil.getCurrentTenantId()); ActProcessDef processDef=actRepService.getProcessDef(bpmDef.getActDefId()); String processDefXml=actRepService.getBpmnXmlByDeployId(bpmDef.getActDepId()); System.out.println("xml:"+processDefXml); ActNodeDef sourceNode=processDef.getNodesMap().get(nodeId); ByteArrayInputStream is=new ByteArrayInputStream(processDefXml.getBytes()); if(configsNode!=null){ //取得分支条件列表 JsonNode configs=configsNode.get("conditions"); if(configs!=null){ Iterator it=configs.elements(); while(it.hasNext()){ ObjectNode config=(ObjectNode)it.next(); String tmpNodeId=config.get("nodeId").textValue(); String tmpCondition=config.get("condition").textValue(); Element seqFlow=(Element)rootEl.selectSingleNode("/bpm:definitions/bpm:process/bpm:sequenceFlow[@sourceRef='" +sourceNode.getNodeId()+"' and @targetRef='"+tmpNodeId+"']"); if(seqFlow==null) continue; Element conditionExpress=(Element)seqFlow.selectSingleNode("bpm:conditionExpression"); if(conditionExpress==null){ conditionExpress=seqFlow.addElement("conditionExpression"); conditionExpress.addAttribute("xsi:type", "tFormalExpression"); }else{ conditionExpress.clearContent(); } conditionExpress.addCDATA(tmpCondition); } } }//修改流程定义的XML,并且清空该流程定义的缓存 actRepService.doModifyXmlAndClearCache(bpmDef.getActDefId(),bpmDef.getActDepId(), doc.asXML());
做3dmax的电脑配置?
3dsmax是三维建模的入门级别软件,对于本地电脑配置有一定要求。这主要是因为3dsmax操作预览主要靠CPU、内存、显卡,渲染主要靠CPU和内存,显卡越好,CPU频率越高,实时预览越流畅。内存足够大的前提下,CPU线程越多,渲染速度会越快。以下是比较推荐的配置:CPU:4核或者6核以上,主频在2.4GHZ或者3.0GHZ;显卡:4G或者6G以上独立显卡,芯片最好是最新的一代或者二代;内存:16G以上,最好选择双通道内存或者高频内存;固态硬盘:建议选择512G以上;屏幕:尽量选择高色域核高分辨率的,比如100%SRGB;散热:尽量选择热管数和通风口多的设备,因为渲染时电脑发热量比较大。
如何做3dmax的电脑配置?
QUADRO 600这显卡太老了
不如上个技嘉的GTX660 OC版的
推荐配置
CPU E3 1230 V2 1200
CPU风扇 超频三红海 50
主板 微星B75 450
内存 光威8G DDR3 210
显卡 技嘉GTX660 OC 1500
硬盘 st 1tb 440
机箱 游戏悍将核武器 119
电源 游戏悍将红星R500 299
显示器 dell2340m 23寸 1199
总价5467
比你的6K预算少了5百多
这钱你可以再加内存或者硬盘
买鼠标键盘耳机音箱什么的
理由
QUADRO系列显卡最起码上Q2000以上的
Q600这卡丽台都1700了,真不如上个好点的GTX系列显卡
Q600这卡先不说核心和核心赫兹,就显存DDR3这一点很多人就接受不了
买Q600不如去买Q450,反正都差不多还便宜一点
但是真心浪费
买专业卡,对显卡的预算绝对不能低于1W,不然买回来就是浪费
现在的Q6000都是有价无市,基本上都是跟着服务器走的不散卖。
Q600这种是过时的显卡拆下来零卖的,所以不推荐
主板买不起华硕的就用微星,二者做工都差不多
机箱千万别听楼下说的
先马机箱只能用一个卧槽来形容
不能走背线不支持ATX板材还很垃圾
更不用担心散热问题,散热从来都不是机箱的问题。
而且INTER平台的8K一下的电脑基本不用担心散热问题。
显示器只有dell
无色偏IPS,比那种业余显示器强太多了
这个不用我废话,你到你专业群里问问就知道了
三星曝光王,宏基色偏王,别的显示器没那么大毛病但是也比不了
不懂欢迎追问
或者我给你推荐几个不错的CG群你去学习一下。
以上纯手打望采纳。
linux操作npm install forever -g提示错误-bash: npm: command not found
要确定你的PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/zend/bin存在于以下任何一个文件中。
//如果你想让root跟所有人都共享PAT变量,请在这里添加你的PATH变量:
/etc/login.defs
// 如果不想改root权限,请在这里添加你的PATH变量
/etc/environment
// 如果只想改某个用户的,请在这里添加你的PATH变量
(用户)/.profile
懂NPM的进来一下,为什么我的NPM不能start
npm start 失败的解决方法如下:unable to start server:See https://git.io/v5vcn for more information, either install watchman or run the following snippet:sudo sysctl -w kern.maxfiles=5242880sudo sysctl -w kern.maxfilesperproc=524288NPM 使用介绍NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种:允许用户从NPM服务器下载别人编写的第三方包到本地使用。允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用。由于新版的nodejs已经集成了npm,所以之前npm也一并安装好了。同样可以通过输入 "npm -v" 来测试是否成功安装。命令如下,出现版本提示表示安装成功:$ npm -v2.3.0如果你安装的是旧版本的 npm,可以很容易得通过 npm 命令来升级,命令如下:$ sudo npm install npm -g/usr/local/bin/npm -> /usr/local/lib/node_modules/npm/bin/[email protected] /usr/local/lib/node_modules/npm如果是 Window 系统使用以下命令即可:npm install npm -g使用淘宝镜像的命令:cnpm install npm -g
请问美国各州的著名城市分别是????
1、纽约(New York):是美国第一大都市和第一大商港,它不仅是美国的金融中心,也是全世界金融中心之一。纽约位于纽约州东南哈得孙河口,濒临大西洋。纽约在商业和金融的方面也发挥着巨大的影响力。纽约的金融区以曼哈顿下城及华尔街为龙头,被称为世界的金融中心,世界500强企业中,有17家企业的总部位于纽约。2、洛杉矶(Los Angeles):座落在美国西海岸加利福尼亚州南部,濒临太平洋东侧的圣佩德罗湾和圣莫尼卡湾沿岸,背靠圣加布里埃尔山,面积 1200多平方公里。2017年12月,洛杉矶获得2017年“世界春城十佳”的称号。2018年10月,第十七届“全球城市竞争力排行榜”发布,洛杉矶排名第五。3、芝加哥(Chicago):是美国第三大城市,五大湖地区最大工业中心。位于伊利诺伊州东北部,密歇根湖西南端。芝加哥是世界著名的旅游胜地,2016年共接待全世界超过5000万名游客。4、休斯敦(Houston):美国第四大城市,位于德克萨斯州东南墨西哥湾平原上部,距墨西哥湾80公里,海拔49英尺(14.94米)。休斯敦港是世界第六大港口,美国最繁忙的港口,外轮吨位第一,不分国籍则居第二位。5、费城(Philadelphia):美国第五大城,宾夕法尼亚州最大城市,位于该州东南缘,特拉华河与斯库尔基尔河的交汇处,东距大西洋142公里。现大市区内有2万余家零售、批发商,商业职工占总就业人口的1/5,有商业银行58家,互助储蓄银行7家,为美国第三联邦储备区银行总部所在地。6、旧金山(San Francisco):位于加利福尼亚州西北部,美国西海岸中点,是太平洋沿岸仅次于洛杉矶的第二大港市。旧金山湾区是世界最重要的科教文化中心之一,拥有的世界著名高等学府包括公立型的加州大学伯克利分校和私立型的斯坦福大学,以及世界顶级医学中心加州大学旧金山分校 。7、底特律(Detroit):密歇根州最大城市,世界著名的汽车城。8、亚特兰大(Atlanta):是美国东南部最大城市,佐治亚州首府。位于该州北部蓝岭东南的山麓台地上,海拔302米。9、波士顿(Boston):是美国东北部新英格兰地区最大港口城市,马萨诸塞州首府。10、达拉斯(Dallas):美国南部工业城市,是州内仅次于休斯敦的第二大城市。位于得克萨斯州北部,跨特里尼蒂河两岸,西距沃思堡48公里。参考资料来源:百度百科-美国
美国都有哪些州?哪些大的城市?
城市
美国有著数十个主要城市,大多数的人口都居住在这些城市里,这些城市也形塑了美国的文化、传统、和经济。在2004年,全美有251个超过了十万人口的都市,9个超过一百万人口的大都市,50个超过了一百万人口的大都会。
最大城市纽约(New
York
City),美国第一大都市和第一大商港,全世界金融中心之一。纽约大都会人口18,976,457。
其他主要城市有洛杉矶(Los
Angeles)、芝加哥(Chicago)、休斯敦(Houston)、费城
(Philadelphia)、旧金山(San
Francisco)、底特律(Detroit)、亚特兰大(Atlanta)、波士顿(Boston)、达拉斯(Dallas)、巴尔的摩(baltimore)、菲尼克斯(Phoenix)、克利夫兰(Cleveland)、新奥尔良(New
Orleans)、西雅图(Seattle)、丹佛
(Denver)、圣路易斯(St.Louis)、明尼阿波利斯(Minneapolis)、火奴鲁鲁(Honolulu)、布法罗(Buffalo)、盐湖城(Salt
Lake
City)、朱诺(Juneau)。
行政区划
全国分十大地区:新英格兰地区、中央地区、中大西洋地区、西南地区、阿巴拉契亚山地区、高山地区、东南地区、太平洋沿岸地区、大湖地区和阿拉斯加与夏威夷;
全国共分50个州和1个特区(华盛顿哥伦比亚特区),有3042个县或郡(county,路易斯安那州的郡是parish);
联邦领地包括波多黎各自由联邦和北马里亚纳;
海外领地中有人居住的为:美属萨摩亚、关岛、中途岛、美属维尔京群岛;
无人居住的为:贝克岛、豪兰岛、贾维斯岛、约翰斯顿岛、金曼礁、纳弗沙岛、帕尔米尔岛、威克岛;
50个州分别为:亚拉巴马州、阿拉斯加州、亚利桑那州、阿肯色州、加利福尼亚州、科罗拉多州、康涅狄格州、特拉华州、佛罗里达州、佐治亚州、夏威夷州、爱达荷州、伊利诺伊州、印第安纳州、艾奥瓦州、堪萨斯州、肯塔基州、路易斯安那州、缅因州、马里兰州、马萨诸塞州、密歇根州、明尼苏达州、密西西比州、密苏里州、蒙大拿州、内布拉斯加州、内华达州、新罕布什尔州、新泽西州、新墨西哥州、纽约州、北卡罗来纳州、北达科他州、俄亥俄州、俄克拉何马州、俄勒冈州、宾夕法尼亚州、罗得岛州、南卡罗来纳州、南达科他州、田纳西州、得克萨斯州、犹他州、佛蒙特州、弗吉尼亚州、华盛顿州、西弗吉尼亚州、威斯康星州、怀俄明州。
gulp压缩合并css/js时,怎么自动修改引用压缩后的css/js的路径
记录一下用 gulp 来合并、压缩CSS以及进行 MD5命名以及替换文件中引入的CSS文件,当然这一系列操作都是用基于gulp插件的,主要会用到下面的几个插件:
var concat = require('gulp-concat');//- 多个文件合并为一个;var minifyCss = require('gulp-minify-css');//- 压缩CSS为一行; var rev = require('gulp-rev');//- 对文件名加MD5后缀var revCollector = require('gulp-rev-collector');//- 路径替换
安装Gulp插件到本地项目
npm init//- 生成一个 package.json,里面是一些常规的配置信息npm install gulp gulp-concat gulp-minify-css gulp-rev gulp-rev-collector --save-dev//- 安装插件到项目目录内
完成上面两步后,会在我们的项目内生成一个package.json文件以及一个node_modules目录
创建配置文件 gulpfile.js
在项目根目录内创建一个 gulpfile.js 文件(必须是这个文件名哟~),内容就是上面几个插件的配置信息:
var gulp = require('gulp');var concat = require('gulp-concat'); //- 多个文件合并为一个;var minifyCss = require('gulp-minify-css'); //- 压缩CSS为一行;var rev = require('gulp-rev'); //- 对文件名加MD5后缀var revCollector = require('gulp-rev-collector'); //- 路径替换gulp.task('concat', function() { //- 创建一个名为 concat 的 task
gulp.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 构建程序
首先运行 concat 这个 task 生成一个 rev-manifest.json 文件
然后再运行 rev 这个 task 替换掉文件中引入的 css
YuanWingdeMacBook-Pro:m YuanWing$ gulp concat
[11:47:02] Using gulpfile ~/SVN/JKD/m/gulpfile.js
[11:47:03] Starting 'concat'...
[11:47:03] Finished 'concat' after 12 msYuanWingdeMacBook-Pro:m YuanWing$ gulp rev
[11:47:17] Using gulpfile ~/SVN/JKD/m/gulpfile.js
[11:47:17] Starting 'rev'...
[11:47:17] Finished 'rev' after 10 msYuanWingdeMacBook-Pro:m YuanWing$
rev-manifest.json文件内容:
{ "wap.min.css": "wap.min-c49f62a273.css"}
header.php替换前后对比:
替换前:
替换后:
gulp-rev-collector进行文件路径替换是依据 rev-manifest.json 的,所以要先成生 .json 文件,然后再进行替换;