用Laravel+Grunt+Bower管理你的应用
来源:http://yansu.org/2014/03/10/grunt-bower-and-laravel.html
为什么这么选择?
如今开源盛行,从后端的各个类库,到如今前端的jQuery插件,前端框架等,越来越多优秀的组件可以被我们选择应用在现有的项目中。随着开源组件 的更新迭代,它们互相之间的依赖也越来越复杂。旧的框架对于新的变化总是显得难以适从,就算为了新的特性改变旧的框架,也会显的略显牵强。于是就会有新的 框架和工具,在这个时候凸现出来。
每个项目开始的方向是很重要的,良好的开始可以避免之后的各种问题。下面要说的三个工具,就是现有应用开发的一个良好开端。
Laravel
Laravel是一个非常新的PHP框架,借鉴了很多前辈的优秀特性,以PHP5为起点,引入了Composer作为包管理工具,号称为WEB艺术家创造的PHP框架。
Grunt
基于JavaScript的自动化构建工具,可以将重复的任务,例如压缩(minification),编译,单元测试,linting等自动化。
Bower
Web前端开发的包管理工具,解决前端框架间的依赖关系,方便模块化和重用。
优势
- 使用Laravel可以更好的利用最新版PHP的优势,排除了一些历史问题。
- 利用Composer可以极大减少”轮子”的数量,优秀的包可以去Packagist找到,这些包几乎都利用Github来托管,利用Github的issue和request可以辅助提高包的质量。
- Bower可以帮助统一管理开源前端库,如Bootstrap和jQuery等,同样这些包也在Github上托管。
- Grunt帮助粘合前后端的开源组件,将合并编译压缩等工作自动化。
安装使用
前提
有些需要提前安装的组件这里不在赘述,请自行Google。
- Composer
- Node & npm
- Grunt
- Bower
Laravel
有了Composer后安装一个Laravel项目非常容易
composer create-project laravel/laravel myproject
安装完成后在myproject目录下就生成了laravel的框架结构,入口文件在public中。在myproject根目录下,有一个composer.json文件,这个文件看起来是这样的:
{
"name": "laravel/laravel",
"description": "The Laravel Framework.",
"keywords": ["framework", "laravel"],
"license": "MIT",
"require": {
"laravel/framework": "4.1.*"
},
//...
}
这个文件可以控制项目的一些依赖关系,我们需要一些组件的时候直接在require下添加即可,composer会帮我们去查找这个组件所需的依赖包。
接着为了安装前端框架,我们先来创建几个公共目录,在public下,创建类似的目录
.
|-- assets
| |-- css
| |-- fonts
| `-- js
|-- favicon.ico
|-- index.php
|-- packages
`-- robots.txt
这里只有assets目录是我新创建的
Bower
准备好后端框架以后,可以安装前端框架了,例如Bootstrap。利用Bower安装的前端库是其整个工程,并不是我们需要的个别文件,所以可以讲它们先放在一个位置,之后利用Grunt来统一处理。
首先配置一下安装路径,在myproject根目录下配置文件.bowerrc为
{
"directory": "public/assets/bower"
}
这个文件告诉bower,将下载的包都安装到public/assets/bower下。
接着在根目录创建一个bower的配置文件bower.json为
{
"name": "myproject"
}
接着添加前端库
bower install bootstrap -S
这个命令将会利用配置文件管理整个库依赖,这个时候再看一下配置文件,bower已经帮助我们自动安装好了Bootstrap依赖的包–jQuery,同时修改了配置文件
{
"name": "myproject",
"dependencies": {
"bootstrap": "~3.1.1"
}
}
在看一下目标目录,public/assets下,生成了一个bower目录,其中包含了Bootstrap和jQuery。
Grunt
根据上面的步骤,我们很方便的建立了后端框架和前端框架,但是前端框架在使用的时候直接用bower下的文件并不是非常方便,而且还可能会涉及到一些库的合并压缩等步骤。这些问题都可以交给Grunt去做.
首先在myproject根目录下利用npm init初始化一个配置文件。根据提示一步一步填写即可,最后生成的配置文件package.json应该如下所示:
{
"name": "myproject",
"version": "0.0.1",
"description": "",
"main": "Gruntfile.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC"
}
有不一样的地方不用担心,尽管修改即可。
接着我们要安装一些Grunt的插件,帮助我们更好的完成所需功能。
npm install grunt --save-dev
npm install grunt-contrib-concat --save-dev
npm install grunt-contrib-less --save-dev
npm install grunt-contrib-uglify --save-dev
npm install grunt-contrib-watch --save-dev
npm install grunt-contrib-copy --save-dev
npm install grunt-contrib-cssmin --save-dev
这里的每个插件我会在下面的配置中介绍。上面命令中的--save-dev选项的作用是将安装的这些包放入配置文件依赖项中,方便以后安装。下面是安装后的配置文件:
{
"name": "myproject",
"version": "0.0.1",
"description": "",
"main": "Gruntfile.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"devDependencies": {
"grunt": "~0.4.3",
"grunt-contrib-concat": "~0.3.0",
"grunt-contrib-less": "~0.10.0",
"grunt-contrib-uglify": "~0.4.0",
"grunt-contrib-watch": "~0.5.3",
"grunt-contrib-cssmin": "~0.9.0"
"grunt-contrib-copy": "~0.5.0"
}
}
注意在安装后有了一个node_modules目录,这个是node项目依赖包的位置,我们一般都在本地进行文件的合并和压缩,所以可以将这个包保留在本地。另外对于bower生成的目录,在Grunt处理过以后也是可以不上传到正式环境中的。所以修改.gitignore文件,将这两个文件夹排除出去:
/bootstrap/compiled.php
/vendor
composer.phar
composer.lock
.env.local.php
.env.php
.DS_Store
Thumbs.db
/public/assets/bower
/node_modules
接下来就要进行Grunt的配置项编写了,我会在配置中加入注释帮助理解。还记得我们刚刚建立的package.json配置文件中的入口文件吗?这个文件还不存在,所以我们需要手动建立,在myproject下创建Gruntfile.js的文件,内容如下:
module.exports = function(grunt) {
//配置项
grunt.initConfig({
//concat插件配置,用来合并多个文件
concat: {
//文件间的分隔符
options: {
separator: ';',
},
//app是一个任务名,可以随意命名
app: {
//将进行的合并项
src: [
'./public/assets/bower/jquery/dist/jquery.js',
'./public/assets/bower/bootstrap/dist/js/bootstrap.js',
],
//合并后放置在
dest: './public/assets/js/javascript.js',
},
},
//css合并压缩
cssmin: {
//任务名
app: {
src: [
'./public/assets/bower/bootstrap/dist/css/bootstrap.css',
'./public/assets/css/base.css'
],
dest: './public/assets/css/stylesheet.css'
}
},
//js压缩
uglify: {
options: {
mangle: false //是否混合变量,如果需求的话置为true
},
app: {
files: {
'./public/assets/js/javascript.js': './public/assets/js/javascript.js',
}
},
},
//移动文件
copy: {
app: {
files: [
{
expand: true,
flatten: true,
cwd: './public/assets/bower/bootstrap/fonts/',
src: ['**'],
dest: './public/assets/fonts/',
filter: 'isFile'
},
]
}
},
//监听文件变化,如果文件变化,将重新进行任务
watch: {
app: {
files: [
'./public/assets/bower/jquery/dist/jquery.js',
'./public/assets/bower/bootstrap/dist/js/bootstrap.js',
'./public/assets/bower/bootstrap/dist/css/bootstrap.css',
],
//文件变化后执行哪些任务
tasks: ['concat:app','uglify:app','cssmin:app','copy:app'],
options: {
livereload: true
}
},
}
});
//导入所需的插件
grunt.loadNpmTasks('grunt-contrib-concat');
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-contrib-less');
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-contrib-copy');
grunt.loadNpmTasks('grunt-contrib-cssmin');
//注册两个任务
grunt.registerTask('watch', ['watch']);
grunt.registerTask('default', ['concat:app','uglify:app','cssmin:app','copy:app']);
};
我们看到,最后注册了两个任务,这两个任务可以从终端中执行,例如:
grunt watch
可以开启文件监听,当文件变化时执行watch中设定的任务。
如果直接执行grunt,则会执行default中设定的任务。我们也可以具体指定执行某一单一任务,如
grunt copy:app
上面则只将bootstrap/fonts中的文件拷贝到public/assets/fonts中。
对于上述的这些插件,可以在这里找到,也有详细的用法。
总结
每个人都有自己的喜好,我的这种配置可能只抛个砖,希望有更好的方式分享。最后在总结一下这三剑客:
- Laravel利用了最新PHP特性,引入了Composer包管理,解决后端库之间的依赖
- Bower帮助安装和解决前端框架和库的依赖关系
- Grunt帮助粘合前后端的开源组件,并且完成合并和压缩等重复性工作。
下面两篇参考文章各有特色,如果希望了解一下可以点击链接去看。
我在Github上建立了这篇博客中所讲的目录结构,想要快速建立一个可使用的工程,只需要以下几部:
git clone https://github.com/suyan/Laravel-Bower-Grunt.git
composer install
bower update
npm install
grunt
Enjoy it!
参考
用Laravel+Grunt+Bower管理你的应用的更多相关文章
- grunt+bower依赖管理
安装bower(必须安装git) npm install bower -g bower按照插件命令 初始化配置 bower init 生成bower.json //如果有bower.json 直接输入 ...
- 简介Gulp, Grunt, Bower, 和 Npm 对Visual Studio的支持
[原文发表地址]Introducing Gulp, Grunt, Bower, and npm support for Visual Studio Web 开发,特别是前端 Web 开发,正迅速变得像 ...
- 前端开发环境搭建 Grunt Bower、Requirejs 、 Angular
现在web开发的趋势是前后端分离.前端采用某些js框架,后端采用某些语言提供restful API,两者以json格式进行数据交互. 如果后端采用node.js,则前后端可以使用同一种语言,共享某些可 ...
- 在 Visual Studio 2013 中使用 Grunt, Bower 和 NPM
在 Visual Studio 2015 中提供了对于 Grunt 和 Gulp 的内置支持,在 Visual Studio 2013 中怎么办呢?微软将 2015 中的特性作为几个独立的扩展发布出来 ...
- Grunt + Bower—前端构建利器(转)
目前比较流行的WEB开发的趋势是前后端分离.前端采用重量级的Javascript框架,比如Angular,Ember等,后端采用restful API的Web Service服务,通过JSON格式进行 ...
- 前端构建利器Grunt—Bower
runt + Bower—前端构建利器 目前比较流行的WEB开发的趋势是前后端分离.前端采用重量级的Javascript框架,比如Angular,Ember等,后端采用restful API的Web ...
- Grunt + Bower—前端构建利器
目前比较流行的WEB开发的趋势是前后端分离.前端采用重量级的Javascript框架,比如Angular,Ember等,后端采用restful API的Web Service服务,通过JSON格式进行 ...
- Grunt Bower构建前端
Grunt + Bower—前端构建利器 目前比较流行的WEB开发的趋势是前后端分离.前端采用重量级的Javascript框架,比如Angular,Ember等,后端采用restful API的W ...
- [转]简介Gulp, Grunt, Bower, 和 Npm 对Visual Studio的支持
本文转自:http://www.cnblogs.com/whitewolf/p/4009199.html [原文发表地址]Introducing Gulp, Grunt, Bower, and npm ...
随机推荐
- VM出现该虚拟机正在使用中的提示,让获取所有权限解决办法
今天打开虚拟机正要学习,结果说是虚拟机似乎正在使用中,让我重新获取权限.解决办法:打开提示的配置文件的位置,将一个以.lck结尾的文件夹删除或者保存为另外的文件名称,再打开虚拟机就OK了.
- Linux帮助命令
帮助命令:man man 命令 获取命令的帮助 如下: [root@localhost ~]# man ls LS(1) User Commands LS(1) NAME ls - list dire ...
- gravity与layout_gravity的区别
android:gravivty 控件的内容显示位置 android:layout_gravity 控件在屏幕的布局位置,相对于容器或者父控件的位置
- js创建节点及其属性
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- 一个div里有多个a标签,改变a标签的字体颜色方法
<script type="text/javascript">var all=document.getElementById("big");var ...
- jquery了解
jQuery 库 - 特性 jQuery 是一个 JavaScript 库. jQuery 是一个 JavaScript 函数库. jQuery 库包含以下特性: HTML 元素选取 HTML 元素操 ...
- [地图SkyLine二次开发]框架(5)完结篇
上节讲到,将菜单悬浮到地图上面,而且任何操作都不会让地图把菜单盖住. 这节带大家,具体开发一个简单的功能,来了进一步了解,这个框架. 1.想菜单中添加按钮 -上节定义的mainLayout.js文件里 ...
- CSS3动画特效——transform详解
transform让css3可以做很优质的特效,transform的意思是:改变,使-变形,转换. 在css3中transform的作用也是改变,让元素倾斜,旋转,缩放,位移. 下面来一一分解tran ...
- Asp.Net_Mvc_获取当前Url、Controller、Action
一.URL的获取很简单,ASP.NET通用: [1]获取 完整url (协议名+域名+虚拟目录名+文件名+参数) string url=Request.Url.ToString(); [2]获取 虚拟 ...
- Calibre - book library management application
http://calibre-ebook.com/ Library Management E-book conversion Syncing to e-book reader devices Down ...