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插件, ...
随机推荐
- CG之基本光照模型计算公式
在一个基本模型里,一个物体表面的颜色是由放射(emissive).环境反射(ambient).漫反射(diffuse)和镜面反射(specular)等光照作用的总和.每种光照作用取决于表面材质的性质( ...
- (译)Windsor入门教程---第五部分 添加日志功能
介绍 现在我们已经有了基础的框架了,是时候添加内容了,那么我们首先应该考虑的就是在应用程序中添加日志功能.我们会使用Windsor来配置,在这一部分,你将学习Windsor之外的其他功能. L ...
- (中等) HDU 4725 The Shortest Path in Nya Graph,Dijkstra+加点。
Description This is a very easy problem, your task is just calculate el camino mas corto en un grafi ...
- Manacher 最长回文子串。
最长回文子串就是一个字符串的一个子串,他从左往右读和从右往左读是一样的. 可以用 Manacher 算法来求,他的复杂度是 O(n) . 可以看这篇文章 http://blog.csdn.net/yw ...
- EHCache分布式缓存集群环境配置
EHCache分布式缓存集群环境配置 ehcache提供三种网络连接策略来实现集群,rmi,jgroup还有jms.同时ehcache可以可以实现多播的方式实现集群,也可以手动指定集群主机序列实现集群 ...
- CKeditor使用js验证不得为空
if (CKEDITOR.instances.TextArea1.getData() == '') { alert('警告:详细内容不得为空!'); CKEDITOR.instances.TextAr ...
- Laravel 用户验证Auth::attempt fail的问题
1.在laravel项目中,当使用Auth::attempt()用于用户验证时,Auth::attempt()会把密码通过Hash进行转换,变成一串不知啥的长字符,如果你在数据库里事先设置了明文的密码 ...
- FMDB的一些基本操作小结
http://blog.csdn.net/iunion/article/details/7204625 仅供自己记录使用, h文件 #import <Foundation/Foundation. ...
- Web开发中需要了解的东西
在StackExchange上有人问了这样一个问题:What should every programmer know about web development?(关于Web开发,什么是所有程序员需 ...
- matlab find函数
find函数用来获取向量或矩阵中非0元素的索引 假设X是行向量,则find(X)返回的是一个行向量:X'为列向量,find(X')返回的是一个列向量. 看一个例子:A是一个行向量,B是一个列向量,将B ...