如果你的前端项目很小或都者项目不需要通过专门的运维同学走流水线上线部署的话,那么可以略过以下的繁文。

ok,Let's go! 我们看看如何使用grunt来部署上线项目?
前端项目一般分为两种类型:The first,纯静态页面,都是html,类似WebApp(当然也有很多动态页面的WEBAPP); The second,包含一些动态页面,如jsp、php、 asp.net 或者是一些别的web服务语言。
由于第二种类型的前端的项目居多,那么我们先从第二种类型的项目上入手,使用grunt来操作项目的部署:
首先我们的目录假设为

      
有两个目录,一个src,用来放置我们源码,(使用GIT或SVN等版本管理器只需要维护src这个目录和项目根目录中的其它文件,如Gruntfile.js、package.json)。另外一个目录是release目录,用来存放针对src目录中的代码合并、压缩、添加指纹、发布的最终输出代码。(也就是线上代码)
 
Gruntfile任务操作
我们在这里先介绍最基本的任务:合并、JS混淆压缩、CSS压缩、清除、添加指纹、替换页面中的静态资源引用。
step 1:
安装grunt包和任务插件;
       grunt包安装 : npm install grunt --save-dev
       合并插件:npm install grunt-contrib-concat --save-dev
       按照上面的插件的安装方式继续安装其它插件
        JS混淆压缩 :grunt-contrib-uglify
        CSS压缩:grunt-contrib-cssmin
        清除:grunt-contrib-clean
     添加指纹:grunt-rev
   替换页面中的静态资源引用 :grunt-contrib-levin-usemin
 
   或者根据已有的package.json文件中的devDependencies依赖项进行一次安装
    npm install
step 2:
完成step1后,会在项目的根目录中生成一个node_modules的包,所有的插件还有grunt都在这个包下。
  

接下来我们完善Gruntfile.js文件中的任务

        先定义一个配置变量,可在后续的任务中直接使用
config :{
static_dest:'release/main/webapp/static/union/'
},
 
合并任务,将release/js/文件夹下的两个js文件合并为build.js
    concat:{
lib:{
files:{
'<%= config.static_dest %>js/build.js':[
'<%= config.static_dest %>js/zepto.min.js',
'<%= config.static_dest %>js/slip-min.js'
]
}
}
},

混淆压缩任务,将release/js/文件夹下的所有js文件进行混淆压缩

     uglify:{
options:{
banner:'/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %> */\n'
},
my_target:{
files:[
{
expand:true,
cwd:'<%= config.static_dest %>js/',
src:'*.js',
dest:'<%= config.static_dest %>js/'
}
]
} },

css压缩任务,将release/css/文件夹下的所有css文件进行压缩

     cssmin:{
options:{
banner:'/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %> */\n',
beautify:{
ascii_only:true
}
},
my_target:{
files:[{
expand:true,
cwd:'<%= config.static_dest %>css/',
src:'*.css',
dest:'<%= config.static_dest %>css/'
}]
}
},

消除任务,将release/js/文件夹下不合并之前的js文件清除

     clean:[
"<%= config.static_dest %>js/zepto.min.js",
"<%= config.static_dest %>js/slip-min.js"
],
添加指纹任务,将release/目录下的静态资源添加指纹(添加指纹是根据静态文件的内容生成md5其中的8位字符,所以同学们不用担心更新某一个静态文件,会导致别的静态文件的指纹发生变化
   rev: {
options: {
encoding: 'utf8',
algorithm: 'md5',
length: 8
},
assets: {
files: [{
src: [
'<%= config.static_dest %>img/**/*.{jpg,jpeg,gif,png}',
'<%= config.static_dest %>css/*.css',
'<%= config.static_dest %>js/**/*.js'
]
}]
}
},

替换动态页面中的静态文件引用任务(针对静态资源引用的地址进行替换,如果有同学需要使用CDN前缀地址的话,那么大家可以使用我发布的一个grunt插件grunt-contrib-levin-usemin,这个插件大家可以用其它插件的安装方法去安装,与grunt-usemin插件不同的地方是我加了一个替换方法filePrefixer,github地址:https://github.com/levincao1/grunt-contrib-levin-usemin/

            usemin:{
css:{
files:{
src:['<%= config.static_dest %>css/*.css']
}
},
js:['<%= config.static_dest %>js/**/*.js'],
html:['<%= config.views_dest %>**/*.jsp','<%= config.views_dest %>*.jsp'],
options:{
//替换静态文件引地址前缀
filePrefixer:function(url){
if(!url){
return '';
}
return url.replace('../..','<%=request.getContextPath()%>');
},
patterns: {
js: [
[/(img\.png)/, 'Replacing reference to image.png']
]
}
}
}

声明一个发布的task

grunt.registerTask('release',['concat','uglify','clean','cssmin','rev','usemin']);

运维同学添加的编译脚本build.sh

#!/bin/bash

/bin/rm -rf release  &&\
mkdir release && \
cp -r src/* release/ &&\
#执行grunt发布的release任务
grunt release

发布结果

通过运维的发布脚本会生成一个release目录(也就是我们上面指到的release目录)再执行grunt发布命令操作release目录下的静态资源

比较一下发布前

发布后的静态资源

动态页面中的静态资源引用发布前的

 
 
发布后的

前端项目部署之Grunt的更多相关文章

  1. Dockerfile + Nginx.conf文件记录(用于前端项目部署)

    Dockerfile + Nginx.conf文件记录(用于前端项目部署) 本教程依据个人理解并经过实际验证为正确,特此记录下来,权当笔记. 注:基于linux操作系统(敏感信息都进行了处理),默认服 ...

  2. 前后端分离之前端项目构建(grunt+require+angular)

    前言 前段时间做了一个项目,前端开发页面,然后把代码给到后端同学,后端同学通过vm再来渲染页面.后来才发现,这种方式简直是太low了,因为前端代码在服务端同学那里,每次前端需要更改的时候都需要去到服务 ...

  3. 前端项目构建工具---Grunt

    什么是Grunt? grunt是javascript项目构建工具,在grunt流行之前,前端项目的构建打包大多数使用ant.(ant具体使用 可以google),但ant对于前端而言,存在不友好,执行 ...

  4. Luffy之前端项目部署搭建

    1. 搭建前端项目 1.1 创建项目目录 cd 项目目录 vue init webpack lufei 根据需要在生成项目时,我们选择对应的选项, 效果: 根据上面的提示,我们已经把vue项目构建好了 ...

  5. 基于sentry的前端错误监控日志系统(部署sentry服务器/前端项目部署)-让前端最快的定位到生产问题

    背景 在这越来越发达的网络时代,web应用也是越来越复杂,尤其是前端的开发,也是越来越受重视. 所以在我们前端开发完成后,会有一些列的web应用的上线验证,如自测.QA测试.code review 等 ...

  6. 简单的利用nginx部署前端项目

    网上有很多教程写的一大堆东西,新手可能会有点看不懂,现在我写这篇文章是为了更好的帮助新手,如何将自己的前端项目部署到自己的服务器上. 首先我们必须要有一台自己的ubuntu服务器,如果没有可以去阿里云 ...

  7. .NET Core +Angular 项目 部署到CentOS

    前言: 最近公司需要开发项目能在Linux系统上运行,示例开发项目采用.Net Core + Angular开发:理论上完全支持跨平台. 但是实践才是检验真理的唯一标准:那么还是动手来验证实现下:过程 ...

  8. 基于SaaS平台的iHRM项目的前端项目介绍

    1.下载安装node.js 访问https://nodejs.org/en/,然后下载安装即可 2. 查看是否安装成功 打开cmd命令行,输入node -v 如果出现对应的版本号,即为安装成功 3.从 ...

  9. 如何使用Docker构建前端项目

    原文链接 Docker单独部署前端项目和Node项目是非常便捷的,在这里分享一下Docker的使用,主要聊聊它的部署实践.(我是window10专业版安装Docker) Docker Docker是一 ...

随机推荐

  1. 从头开始建网站(三)DNS

    前面介绍了站点搭建所须要的两大要素:域名和server,这次要说的是域名解析,也就是把域名和server进行绑定的过程. 我们在訪问网络时,网址会被发送到DNSserver,然后由DNSserver返 ...

  2. 利用__index和__newindex实现默认值表、监控表、只读表(转)

    __index和__newindex实际上相当于是在读写表的时候分别加了一道过滤的逻辑,让读写表的操作可以被监控或说回调,利用这个特性可以实现一些带有特殊功能的表. 带有默认值的表: setdefau ...

  3. freemarker错误九

    1.错误叙述性说明 五月 30, 2014 11:52:04 下午 freemarker.log.JDK14LoggerFactory$JDK14Logger error 严重: Template p ...

  4. ios 多线程开发(二)线程管理

    线程管理 iOS和OS X中每一个进程(或程序)由一个或多个线程组成.程序由一个运行main方法的线程开始,中间可以产生其他线程来执行一些指定的功能. 当程序产生一个新线程后,这个线程在程序进程空间内 ...

  5. hdu 5077 NAND(暴力打表)

    题目链接:hdu 5077 NAND 题目大意:Xiaoqiang要写一个编码程序,然后依据x1,x2,x3的值构造出8个字符.如今给定要求生成的8个字符.问 说Xiaoqiang最少要写多少行代码. ...

  6. ListView分页显示

    出在:http://blog.csdn.net/tu_bingbing/article/details/13275107         当ListView要显示的数据过多时,为了更快的响应用户,这个 ...

  7. java.lang.IllegalStateException: ActionBarImpl can only be used with a compatible window decor layou

    于Activity调用它们的定义dialog事件ActionBarImpl can only be used with a compatible window decor layout异常, 解决方法 ...

  8. Linux进程管理(-)

    一.进程的类型 能够将执行在Linux系统中的进程分为三种不同的类型: 交互进程:由一个Shell启动的进程.交互进程既能够在前台执行,也能够在后台   执行. 批处理进程:不与特定的终端相关联,提交 ...

  9. Android-用你自己的自定义图像资源(2)

    Android-自己定义图像资源的使用 2014年4月29日   上一篇博客.介绍前面几种图像资源的使用,本篇博客把剩下的所有介绍完: 普通图像资源 XML图像资源 Nine-patch图像资源 XM ...

  10. Event Sourcing - ENode(一)

    分布式系统 摩尔定律如果一直能实现,不管是涉及或者实现一个OLTP的系统,我们是不是都会轻松点,用硬件堆就可以了.但是现在硬件已经在求变了,那么我们也得求变,云的概念如此之火,本质就是设施虚拟化,也可 ...