[技术与产品] Bower & Brunch
今天写作时间太短,稍微探讨一下bower和brunch这两个web前端assets management的利器。
Bower
管理dependency一直是程序员的心病,从c语言一路走到现在,dependency hell一直存在,只不过工具的进步让程序员不用再困扰纠结这个问题。我们看各种语言的dependency management工具:
- go: go get
- ruby: gems / bundle
- python: pip / eggs
- java: maven
- haskell: cabel (我是装pandoc才认识这货的)
- nodejs: npm
- erlang: rebar
写到这里我快哭了,亲爱的c啊,你的dependency management工具在哪?什么时候我们写代码,写着写着缺个库,在头文件里include一下,然后"show me the money",就自动帮我完成了dependency的处理,该多好?
好吧,停止做梦,回到现实。为什么我反复说互联网的好呢,你看看互联网人用的工具,再看看通信人用得工具,顿时产生一种「人家开着阿帕奇,我们提着红樱枪上战场」的悲凉。
在没有bower的年代,前端的dependency是个麻烦,比如说我做的软件,需要用jquery, ember, metis, lodash, ...我要一个个将他们从官网拷到项目的某个目录下,比如说vendors下,然后在html里引用。一旦我需要更新某个dependency,则需要上官网,拷贝,更新。很麻烦。
twitter估计也被困扰,被恶心了很久,最终他们发布了bower。你可以使用
$ npm install -g bower
来安装bower,然后这么用。
$ bower install jquery
$ bower install jquery --save
后一条命令会更新(或者生成)项目的bower.json
,以后在别的地方部署时你只需要运行
$ bower install
就可以了。你甚至可以用它管理github上的项目,比如说:
$ bower install https://github.com/company/repo
bower安装的dependency放在bower_components下,你可以用.bowerrc
来重载缺省设置。
$ cat ~/projects/node-webkit-template/.bowerrc
{
"directory": "bower_components"
}
好的工具的价值就在于对用户足够简单,没有学习成本。大部分场景下,bower完全自动化。但有时如果几个库之间有版本冲突,bower解决不了,就会让你选择,比如说metis和morris都依赖于jquery,但二者依赖的版本不同,你就需要人工干预一下了。
这里稍稍讲讲bower和npm的不同。bower把所有的dependency放在同一级,所以需要解决依赖冲突;npm每个module保存自己的dependency,将dependency保存成树状,所以不需要解决。但npm的问题是磁盘空间利用很不经济,同一个module如果到处被人依赖,那就会有n份复制品。
两者的不同是前端一般会打包后一次性加载,重复的dependency会带来太大的package后的文件,同时也会互相影响;而后端采用即用即插,所以可以使用完全独立的dependency。
bower还悄悄的为别的工具做了件好事,就是每个dependency里可以用配置文件指定该module的入口。我们看bootstrap的bower.json:
{
"name": "bootstrap",
"version": "3.1.1",
"main": [
"./dist/css/bootstrap.css",
"./dist/js/bootstrap.js",
"./dist/fonts/glyphicons-halflings-regular.eot",
"./dist/fonts/glyphicons-halflings-regular.svg",
"./dist/fonts/glyphicons-halflings-regular.ttf",
"./dist/fonts/glyphicons-halflings-regular.woff"
],
...
"dependencies": {
"jquery": ">= 1.9.0"
}
}
为了阅读方便,我做了不少精简。这里,bootstrap指定自己要依赖1.9以上的jquery,还在main
里指定了其项目的入口文件,简直就是为打包工具量身定制的。真是「事了拂衣去,深藏身与名」的有为青年啊,什么叫惊喜,这TMD就是惊喜。
于是brunch就出现了。
brunch
brunch之前,已经有很多打包工具,我自己在django里用过pipeline,但很不完美。brunch帮你解决很多问题:你可以用它初始化一个项目模板,自动安装前端/后端的依赖,然后打包。每做一个新项目初始的绝大多数重复劳动都被brunch轻轻化解了。
安装brunch很简单:
$ npm install -g brunch
使用brunch也不难,这是开发模式:
$ brunch watch --server
这是生产模式:
$ brunch build --production
brunch是coffeescript写的,所以你可以用coffeescript来写configuration。基本上你配置好哪些文件要打包,打包的路径是什么就可以使用了。
brunch会读取bower的每个dependency的bower.json
,然后使用里面main
指定的文件进行分门别类地打包,生成css和js。
你自己的代码可以使用coffee,less等任意已知工具,只要安装对应的brunch plugin,就能一键打包。
bower + brunch,前端从此过上了美好的生活。^_^
先写这么多。
- 如何安装SAS并配置连接Hive/Impala
- Entity Framework——记录执行的命令信息
- 【BlackHat 2017 议题剖析】连接的力量:GitHub 企业版漏洞攻击链构造之旅
- CVE-2015-1641 Word 利用样本分析
- Cloudera Navigator介绍与安装
- [LeetCode]String主题系列{第5,6题}
- CDH内存调拨过度警告分析
- Ztorg:从 root 到 SMS
- [LeetCode]Math主题系列{第7,9,13,273题}
- 被忽视的攻击面:Python package 钓鱼
- [LeetCode]LinkedList主题系列{第2题}
- [LeetCode]HashTable主题系列{第3题}
- 如何使用Oozie API接口向Kerberos集群提交Java程序
- [LeetCode]Array主题系列{35,39,40,48题}
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Centos7系统下搭建.NET Core2.0+Nginx+Supervisor环境
- CentOS7 LNMP+phpmyadmin环境搭建 第二篇LNMP环境搭建教程
- 详解Linux 下开发微信小程序安装开发工具
- Linux一个增强的截图及分享工具:ScreenCloud
- linux 命名管道实例详解
- 11个JavaScript代码重构最佳实践
- Linux中在不破坏磁盘的情况下使用dd命令
- Jexus开机自动启动配置方法
- 在 CentOS 7 中安装 MySQL 8 的教程详解
- Centos7.2 编译安装PHP7.0.2的步骤
- Linux系统下为Nginx安装多版本PHP
- Linux系统下多版本php共存的解决方案(超简单)
- 宝塔Windows面板的安装Discuz! Q方法
- 并发情况下,单例模式之双重检验锁陷阱
- Android多种方式实现相机圆形预览的示例代码