Grunt + Bower—前端构建利器
目前比较流行的WEB开发的趋势是前后端分离。前端采用重量级的Javascript框架,比如Angular,Ember等,后端采用restful API的Web Service服务,通过JSON格式进行数据交互。
对于后端服务语言来说,不论是Ruby的rack,Java中的Maven或Gradle,或是Scala中的SBT,他们都能够提供编译运行、运行测试、打包部署、依赖管理等功能。再加上强大的插件系统,让它可以插拔式的使用很多强大的功能,像数据迁移工具(liquibase),测试覆盖率插件以及一些代码样式检查的工具。
但是对于前端Javascript和CSS而言,很少有工具可以做到前面所述功能的集合。那么我们怎么样才能达到前面所说的说有功能呢?——Grunt + Bower
Grunt号称自己是JavaScript世界的构建工具,它提供了强大的自动化功能。对于需要反复重复的任务,例如压缩(minification)、编译、单元测试、linting等,自动化工具可以减轻我们的劳动。Grunt同样拥有强大的插件系统,你所需要的大多数task都已经作为Grunt插件被开发了出来,并且每天都有更多的插件诞生。
但这还不够完美。
我们知道,在JavaScript开发当中,我们经常需要引入大量的开源工具。不可避免的会遇到不同版本之间的兼容性问题,例如Bootstrap所依赖的JQuery不是1.10,而是2.03。如果你正在做JS版本升级,那么我想你一定会到各个网站上把他们最新的包下载下来,然后小心翼翼的替换它的版本。但是这些功能在Gradle和其他后端的版本管理工具里已经不再是问题。Bower的出现,完美的解决了这一难题。
在javascript的世界里,很多东西都是由社区提供的,所以每一种工具都相当独立。比如,工具都有着自己独立的配置文件,自己的命令行参数,有时候还需要有一些额外的插件把两个工具结合起来。所以下面将会有很多命令,我们需要一一了解。不过好在我们了解之后,下次就可以使用已经配置好的文件,通过几条命令将把有的东西都准备好,很方便。
第一步:安装nodejs
在Windows中,我们可以到官网下载安装包:https://nodejs.org/dist/v4.4.7/node-v4.4.7-x64.msi
在Mac中,我们可以使用brew来安装。
brew install node
Nodejs可以让我们在服务器端使用javascript编程,它是很多js工具的基础。请确保它是最新的:
brew upgrade node
Npm是node官方提供的包依赖管理工具。我们下面使用的Grunt,Bower等,都是以插件形式下载安装的。当我们安装好nodejs后, npm 就自动可用了。查看版本:
npm -v
接下来新建一个目录cos-form,然后运行npm init,根据提示,最后会产生一个package.json如下:
{
"name": "cos-form",
"version": "1.0.0",
"description": "This is for grunt and bower",
"main": "index.js", "repository": {
"type": "git",
"url": "https://github.com/yeahyangliu/grunt_bower.git"
}
}
第二步:安装Grunt
你需要先将Grunt命令行(CLI)安装到全局环境中。安装时可能需要使用sudo:
npm install -g grunt-cli
上述命令执行完后,grunt 命令就被加入到你的系统路径中了,以后就可以在任何目录下执行此命令了。
注意,安装grunt-cli并不等于安装了 Grunt!Grunt CLI的任务很简单:调用与Gruntfile在同一目录中 Grunt。这样带来的好处是,允许你在同一个系统上同时安装多个版本的 Grunt。
在Grunt项目里一般需要在你的项目中添加两份文件:package.json 和 Gruntfile。其中package.json中里面已经包含了一些Grunt常用的插件,比如 grunt-contrib-jshint 等,我们可根据需要删减一些用不上的。那么现在我们的文件应该长成这样:
{
"name": "cos-form",
"version": "1.0.0",
"description": "This is for grunt and bower",
"main": "index.js",
"engines": {
"node": ">= 0.10.0"
},
"devDependencies": {
"grunt": "^1.0.1",
"grunt-bower-task": "^0.4.0",
"grunt-contrib-concat": "^1.0.1",
"grunt-contrib-jshint": "^1.0.0",
"grunt-contrib-qunit": "^1.2.0",
"grunt-contrib-uglify": "^1.0.1",
"grunt-contrib-watch": "^1.0.0"
}
}
下面,我们需要一个gruntfile,gruntfile中定义了插件的功能,并且可以自定义一些任务来管理我们Javascript代码。通过执行下面命令生成一个gruntfile:
npm install grunt-init -g
git clone https://github.com/gruntjs/grunt-init-gruntfile.git ~/.grunt-init/gruntfile
grunt-init ~/.grunt-init/gruntfile
接下来只需要把所有package.json中的插件通过npm装在本目录,我们就可以使用Grunt来帮我们运行,管理我们的Javascript代码了。
第三步:安装Bower
Bower跟npm在某种意义上相似,它是用来管理常用的js库的依赖的,比如jquery, underscore, angularjs等。同样我们可以通过npm安装它:
npm install bower -g
同样,Bower也有自己的配置文件bower.json
{
"name": "cos-form",
"version": "1.0.0",
"authors": [
"shencq <shencq@g-soft.com.cn>"
],
"license": "MIT",
"ignore": [
"**/.*",
"node_modules",
"bower_components",
"test",
"tests"
]
}
接下来就是我们见证奇迹的时刻:
bower install angularjs --save
bower insall jquery --save
我们就可以看到angular和JQuery已经被下载到本地。同时bower.json中多了两个依赖:
"dependencies": {
"angularjs": "~1.2.20", "jquery": "~2.1.1"
}
而且,我们的目录里,两个版本的js文件也被下载到了本地。如果你觉得现在已经大功告成了,那么你就错了,bower只负责把依赖下载到本地的 bower_components 目录,并不负责把它们拷贝到我们项目中实际使用的地方,比如 public/js/lib 目录下。
为了实现这样的功能,我们还需要另一个插件的帮助:
npm install grunt-bower-task --save-dev
然后打开其文档,按照上面的提示进行配置。首先在 Gruntfile 中合适位置添加:
grunt.loadNpmTasks('grunt-bower-task');
然后在 grunt.initConfig({...}) 参数中,添加相应的配置项,把bower下载的js库拷贝到 public/js/lib 下:
{ "bower": { "install": { "options": { "targetDir": "./public/js/lib", "layout": "byComponent", "install": true, "verbose": false, "cleanTargetDir": false } } }}最后我们只需要运行一行简单的命令,就可以讲grunt和bower完美结合起来:
grunt bower
最后
有了这样两大利器,我们已经达到了从管理依赖,编译部署,压缩打包,运行测试的所有功能,并且非常清晰的配置,让项目上的人都拥有同一份配置,这种方式,大大的简化了团体的管理效率和维护成本,非常值得推崇!
再次感谢大家读到这里。
Grunt + Bower—前端构建利器的更多相关文章
- Grunt + Bower—前端构建利器(转)
目前比较流行的WEB开发的趋势是前后端分离.前端采用重量级的Javascript框架,比如Angular,Ember等,后端采用restful API的Web Service服务,通过JSON格式进行 ...
- 前端构建利器Grunt—Bower
runt + Bower—前端构建利器 目前比较流行的WEB开发的趋势是前后端分离.前端采用重量级的Javascript框架,比如Angular,Ember等,后端采用restful API的Web ...
- 仿async/await(一)and Gulp:新一代前端构建利器
NET 4.5的async/await真是个神奇的东西,巧妙异常以致我不禁对其实现充满好奇,但一直难以窥探其门径.不意间读了此篇强文<Asynchronous Programming in C# ...
- Gulp:新一代前端构建利器
1.什么是Gulp gulp.js 是一种基于流的,代码优于配置的新一代构建工具. Gulp 和 Grunt 类似.但相比于 Grunt 的频繁的 IO 操作,Gulp 的流操作,能更快地完成构建. ...
- Grunt Bower构建前端
Grunt + Bower—前端构建利器 目前比较流行的WEB开发的趋势是前后端分离.前端采用重量级的Javascript框架,比如Angular,Ember等,后端采用restful API的W ...
- 前端开发环境搭建 Grunt Bower、Requirejs 、 Angular
现在web开发的趋势是前后端分离.前端采用某些js框架,后端采用某些语言提供restful API,两者以json格式进行数据交互. 如果后端采用node.js,则前后端可以使用同一种语言,共享某些可 ...
- Gulp, 比Grunt更好用的前端构建工具
Gulp, 比Grunt更好用的前端构建工具 本文主要从两个方面介绍Gulp:一,Gulp相对于Grunt的优势: 二,Gulp的安装和使用流程 Gulp相对于Grunt的优势 gulp.js 的作者 ...
- 前端构建工具 Grunt 入门
之前也介绍过前端构建工具 Ant 和 Yeoman,其中 Yeoman 工具就包含了 Grunt 所以就不多说.那么与 Ant 相比 Grunt 有这么几个优点: Javascript 语法,相比 A ...
- 用Laravel+Grunt+Bower管理你的应用
来源:http://yansu.org/2014/03/10/grunt-bower-and-laravel.html 为什么这么选择? 如今开源盛行,从后端的各个类库,到如今前端的jQuery插件, ...
随机推荐
- 【BZOJ 1572】 1572: [Usaco2009 Open]工作安排Job(贪心+优先队列)
1572: [Usaco2009 Open]工作安排Job Description Farmer John 有太多的工作要做啊!!!!!!!!为了让农场高效运转,他必须靠他的工作赚钱,每项工作花一个单 ...
- Apriori算法第一篇
摘要: Apriori算法是产生k项高频项目组的一般手段.算法概要:首先产生k项高频项目集合Lk,自身链接形成k+1项的项目结合C(k+1),然后剪枝(去掉以前去掉的不满足支持度的高频),生成K=1项 ...
- struts2-----新建项目
1. 建立界面原型 2. 建立Struts.xml 确定namespace, package, action, 空方法, result, 界面原型修改, 匹配现有设置, 测试, 做好规划 3. 建立数 ...
- NULL、nil、Nil、NSNull的区别
标志 值 含义 NULL (void *)0 C指针的字面零值 nil (id)0 Objecve-C对象的字面零值 Nil (Class)0 Objecve-C类的字面零值 NSNull [NSNu ...
- 在阿里云ECS(CentOS6.5)上安装tomcat
切换到你要安装的目录下 命令: cd /home/ 下载你要安装的tomcat 命令: wget http://mirror.bit.edu.cn/apache/tomcat/tomcat-7/v7. ...
- lpc1768ADC使用
Lpc1768内置有一个ad外设,该外设有八路复用输入,所以,可以同时接八路ad设备,同时还支持触发转换模式,由外部端口进行ad触发,ad转换完成之后可以产生中断 Lpc1768支持的转换模式有两种, ...
- IOS 股票K线图、分时图
IOS 股票K线图.分时图,网上开源项目很少,质量也是参差不齐:偶尔搜索到看似有希望的文章,点进去,还是个标题党:深受毒害.经过一段时间的探索,终于在开源基础上完成了自己的股票K线图.分时图: 先放出 ...
- Centos 修改时间地区及NTP同步北京时间
在我们使用CentOS系统的时候,也许时区经常会出现问题,有时候改完之后还是会出错,下面我们就来学习一种方法来改变这个状况.如果没有安装,而你使用的是 CentOS系统 那使用命令 yum insta ...
- 【动态规划】Gym - 101102A - Coins
Hasan and Bahosain want to buy a new video game, they want to share the expenses. Hasan has a set of ...
- readystate, 异步
EventUtil.addHandler(window, "load", function(){ //create a new <script/> element. v ...