听说bower
是十分流行的前端包管理工具,于是我慕名试用了一下……
使用bower install jquery
安装最知名的js框架,嗯,很顺利的下了下来,果然比手动下载要快。而且让人喜出望外的是,下下来的不止一个,也不止几个文件……而是几乎有半个jquery的版本库……真是意外惊喜啊!然后我尝试使用各种方法,折腾了一个晚上,还是找不到只让它仅仅下载min文件的办法。
如果考虑到在一大堆文件中扒拉出min.js/css文件的花费,似乎并不比手工完成繁琐多少。以本人第一印象,感觉除非自己要根据一些前端库来搭建一个前端框架,否则没有必要使用bower
。如果存在一种工具,自动地从一个CDN列表中下载符合版本所需的前端库的min文件,是不是会比bower
更好用呢……
额,差点忘了我的问题。存在一种用bower install
来安装min.js/css文件的方法么?或者换个说法,大家是怎么处理下下来的许多源文件的?直接删掉绝大部分么?
顺便搭车问一下,如果你在项目中用到bower
(前端项目除外!),为什么你需要用它?你是怎么用它的?
tl;dr 像 Bower 这样的包管理工具,其主要目的是为了管理包和包之间的依赖关系(基于版本的管理),帮你下载源代码只是管理依赖必须要有的一个步骤。如果你只是想要一个或若干个特定文件,但并不在乎依赖关系,Bower 会显得过重了一些,至于你想要的:
其实有大把现成的工具可以利用,比如说 curl 就可以,根据需要写一个简单的脚本,或者使用 Grunt 这样的任务运行器帮你跑命令行命令就可以了。顺便一提:CDN 不应该是这么用的。
为什么 Bower 下的包里有一大堆看起来用不着的东西?
Bower 是基于 Git 之上的包管理工具,它提供的包其源头都是一个 Git 库(多数都在 Github 上,但并非必须),这是为了利用 Git 对这些包进行版本控制。然而,并不是任何一个 Git 库都会被 Bower 索引,能够通过 Bower 下载的包,在其 Git 库下都会有一个
bower.json
文件,Bower 通过检索bower.json
的内容来注册一个包(及其依赖),于是以后就可以搜索到了。因此,我们在 Bower 上搜索到的可下载包,它们大部分都是这些包的源代码 Git 库,并且我们都知道 这些源代码通常都是没有编译/构建过的,所以你会看到一大堆“半成品”似的文件,这对于最终使用者来说的确显得多余。
然而上述信息也给了我们一个提示,(如果你有精力的话)你可以自行管理一个只包括发行版文件的对应 Git 库,你只需要把必要的文件摘出来,提供一个
bower.json
描述文件,然后托管在一个可访问到的 Git Server 上(比如 Github)即可。具体的注册方法可以参见 Bower 的文档。另外一个包管理工具(实际上是一种规范)Component 几乎就是这么做的。难道就没有办法只获取我需要的文件?
当然有办法。比如说 Grunt(一种任务运行器,常被用作前段项目的构建工具,使用 Bower 的项目几乎没有不用 Grunt 或者其他类似工具的)就有几个提供抽取需要文件的插件。这里推荐 grunt-bowercopy,用法比较简单,放张截图就明白了:
如图所示,你提供一个
目标: 源
的映射,grunt-bowercopy 会自动帮你提取 Bower 下载的包里需要的文件并拷贝到你指定的路径去。(你也可以把路径相同的部分抽象出来,方便重用/修改,别学我懒……)这种事情只要做一次就好,之后都是 Grunt 帮你完成自动化过程。
一些连带的细节问题
Bower 默认把包安装在
bower_components
目录下,关于这个有两点值得考虑的:.bowerrc
文件,包括一下内容:这样 Bower 就会使用
vendor
作为存放路径了。除此之外,Bower 还有一些细微之处可以帮助你做(好)更多的事情。举例,
--offline
标识可以让 Bower 去寻找本地缓存(比如说你其他的项目以前已经安装过你需要的包,因此会在本地留下缓存),这样可以大幅提高安装速度。再比如说有很多库专门为前面提到过的 Component 预留了发行版,通常都保存在项目的
components/
路径下或者以组织的名义为该项目创建一个components
代码库,用于跟踪和存放发行版本,于是你可以覆盖 Bower 默认的shorthand
,像这样:这也是写在
.bowerrc
中的。这样你就可以用 Bower 工具来“偷取”本来准备给 Component 的包了。如果你为企业服务,有数量庞大的项目和团队需求,你完全可以架设一个私有的 Bower Endpoint Server,自行维护一些需要的包源代码,这样一来你想怎么做都随你,其实也很简单,无非就是维护一个版本管理服务器罢了。Anyway,对于大多数最终应用的开发者而言,Bower 真就当一个下载器来用了,但它本来的目的真不是为了这个,它更加适合用于开发可重用的库/框架等。如果你只是写点小玩意,需要几个文件,倒真不如直接
curl
/wget
之类的更直接方便。