1. bower介绍

Bower 是用于 web 前端开发的包管理器。对于前端包管理方面的问题,它提供了一套通用、客观的解决方案。它通过一个 API 暴露包之间的依赖模型,这样更利于使用更合适的构建工具。bower 没有系统级的依赖,在不同 app 之间也不互相依赖,依赖树是扁平的。

bower-logo

Bower 运行在 Git 之上,它将所有包都视作一个黑盒子。任何类型的资源文件都可以打包为一个模块,并且可以使用任何规范(例如:AMD、CommonJS 等)。

包管理工具一般有以下的功能:

  • 注册机制:每个包需要确定一个唯一的 ID 使得搜索和下载的时候能够正确匹配,所以包管理工具需要维护注册信息,可以依赖其他平台。
  • 文件存储:确定文件存放的位置,下载的时候可以找到,当然这个地址在网络上是可访问的。
  • 上传下载:这是工具的主要功能,能提高包使用的便利性。比如想用 jquery 只需要 install 一下就可以了,不用到处找下载。上传并不是必备的,根据文件存储的位置而定,但需要有一定的机制保障。
  • 依赖分析:这也是包管理工具主要解决的问题之一,既然包之间是有联系的,那么下载的时候就需要处理他们之间的依赖。下载一个包的时候也需要下载依赖的包。

功能介绍,摘自文章:http://chuo.me/2013/02/twitter-bower.html

bower 插件是通过 npm, node.js 包管理器安装和管理的。

npm 是 node 程序包管理器。它是捆绑在 node.js 的安装程序上的,所以一旦你已经安装了 node,npm 也就安装好了。

在 mac上 安装 node.js 方法:

brew install nodejs

通过 npm 安装 bower 到全局环境中:

npm install -g bower

安装之后,可以通过 bower help 命令可以获取更多帮助信息。了解了这些信息就可以开始了。

安装包及其依赖的包

Bower 提供了几种方式用于安装包:

# Using the dependencies listed in the current directory's bower.json
bower install
# Using a local or remote package
bower install 
# Using a specific Git-tagged version from a remote package
bower install #

其中, 可以是以下列出的一种:

  • 注册到 bower 中的一个包名, 例如:jquery。
  • 一个 Git 仓库地址,例如: git://github.com/someone/some-package.git
  • 一个本地的 Git 目录
  • github 的别名,例如:someone/some-package (defaults to GitHub)。
  • 一个文件 url,包括 zip 和t ar.gz 文件。

举例来看一下来如何使用 bower 安装 jQuery,在你想要安装该包的地方创建一个新的文件夹,键入如下命令:

$ bower install jquery

上述命令完成以后,你会在你刚才创建的目录下看到一个 bower_components 的文件夹,其中目录如下:

$ tree bower_components/
bower_components
└── jquery
    ├── MIT-LICENSE.txt
    ├── bower.json
    ├── dist
    │   ├── jquery.js
    │   ├── jquery.min.js
    │   └── jquery.min.map
    └── src
        ├── ajax
        │   ├── jsonp.js
        │   ├── load.js
        │   ├── parseJSON.js
        │   ├── parseXML.js
        │   ├── script.js
        │   ├── var
        │   │   ├── nonce.js
        │   │   └── rquery.js
        │   └── xhr.js
        ├── ajax.js
        ├── attributes
        │   ├── attr.js
        │   ├── classes.js
        │   ├── prop.js
        │   ├── support.js
        │   └── val.js
        ├── attributes.js
        ├── callbacks.js
        ├── core
        │   ├── access.js
        │   ├── init.js
        │   ├── parseHTML.js
        │   ├── ready.js
        │   └── var
        │       └── rsingleTag.js
        ├── core.js
        ├── css
        │   ├── addGetHookIf.js
        │   ├── curCSS.js
        │   ├── defaultDisplay.js
        │   ├── hiddenVisibleSelectors.js
        │   ├── support.js
        │   ├── swap.js
        │   └── var
        │       ├── cssExpand.js
        │       ├── getStyles.js
        │       ├── isHidden.js
        │       ├── rmargin.js
        │       └── rnumnonpx.js
        ├── css.js
        ├── data
        │   ├── Data.js
        │   ├── accepts.js
        │   └── var
        │       ├── data_priv.js
        │       └── data_user.js
        ├── data.js
        ├── deferred.js
        ├── deprecated.js
        ├── dimensions.js
        ├── effects
        │   ├── Tween.js
        │   └── animatedSelector.js
        ├── effects.js
        ├── event
        │   ├── alias.js
        │   └── support.js
        ├── event.js
        ├── exports
        │   ├── amd.js
        │   └── global.js
        ├── intro.js
        ├── jquery.js
        ├── manipulation
        │   ├── _evalUrl.js
        │   ├── support.js
        │   └── var
        │       └── rcheckableType.js
        ├── manipulation.js
        ├── offset.js
        ├── outro.js
        ├── queue
        │   └── delay.js
        ├── queue.js
        ├── selector-native.js
        ├── selector-sizzle.js
        ├── selector.js
        ├── serialize.js
        ├── sizzle
        │   └── dist
        │       ├── sizzle.js
        │       ├── sizzle.min.js
        │       └── sizzle.min.map
        ├── traversing
        │   ├── findFilter.js
        │   └── var
        │       └── rneedsContext.js
        ├── traversing.js
        ├── var
        │   ├── arr.js
        │   ├── class2type.js
        │   ├── concat.js
        │   ├── hasOwn.js
        │   ├── indexOf.js
        │   ├── pnum.js
        │   ├── push.js
        │   ├── rnotwhite.js
        │   ├── slice.js
        │   ├── strundefined.js
        │   ├── support.js
        │   └── toString.js
        └── wrap.js

23 directories, 88 files

现在就可以在应用程序中使用 jQuery 包了,在 jQuery 里创建一个简单的 html5 文件:

    <title>Learning bower</title>


<button>Animate Me!!</button>
<div style="background:red;height:100px;width:100px">
</div>


    $(document).ready(function(){
        $("button").click(function(){
            $("div").animate({left:'250px'});
        });
    });

正如你所看到的,你刚刚引用 jquery.min.js 文件,现阶段完成。

查看安装的包

执行以下命令可以列出所有本地安装的包。

$ bower list

查找bower注册的包:

$ bower search []

只需执行 bower search 命令即可列出所有已经注册的包。

如果你想看到关于特定的包的信息,可以使用 info 命令来查看该包的所有信息:

$ bower info jquery
bower cached        git://github.com/jquery/jquery.git#2.1.1
bower validate      2.1.1 against git://github.com/jquery/jquery.git#*

{
  name: 'jquery',
  version: '2.1.1',
  main: 'dist/jquery.js',
  license: 'MIT',
  ignore: [
    '**/.*',
    'build',
    'speed',
    'test',
    '*.md',
    'AUTHORS.txt',
    'Gruntfile.js',
    'package.json'
  ],
  devDependencies: {
    sizzle: '1.10.19',
    requirejs: '2.1.10',
    qunit: '1.14.0',
    sinon: '1.8.1'
  },
  keywords: [
    'jquery',
    'javascript',
    'library'
  ],
  homepage: 'https://github.com/jquery/jquery'
}

Available versions:
  - 2.1.1
  - 2.1.1-rc2
  - 2.1.1-rc1

可以注册自己的包,这样其他人也可以使用了:

$ bower register project git://github.com/yourname/project

卸载包可以使用 uninstall 命令:

$ bower uninstall jquery

每个包应该有一个配置文件,描述包的信息,jquery 的配置文件为 bower.json。

{
  "name": "jquery",
  "version": "2.1.1",
  "main": "dist/jquery.js",
  "license": "MIT",
  "ignore": [
    "**/.*",
    "build",
    "speed",
    "test",
    "*.md",
    "AUTHORS.txt",
    "Gruntfile.js",
    "package.json"
  ],
  "devDependencies": {
    "sizzle": "1.10.19",
    "requirejs": "2.1.10",
    "qunit": "1.14.0",
    "sinon": "1.8.1"
  },
  "keywords": [
    "jquery",
    "javascript",
    "library"
  ]
}

name 和 version 描述包的名称和版本,dependencies 描述这个包依赖的其他包。main 指定包中的静态文件,可以为一个数组。license 指定版权协议,ignore 指定忽略哪些文件,devDependencies 指定依赖,keywords 描述该包的关键字。

除了包的配置文件,Bower 还有一个全局的配置文件 ~/.bowerrc。

项目中使用

bower.json 文件的使用可以让包的安装更容易,你可以在应用程序的根目录下创建一个名为 bower.json 的文件,并定义它的依赖关系。使用 bower init命令来创建 bower.json 文件:

[?] name: blog
[?] version: 0.0.0
[?] description: 
[?] main file: 
[?] what types of modules does this package expose? 
[?] keywords: 
[?] authors: javachen 
[?] license: MIT
[?] homepage: 
[?] would you like to mark this package as private which prevents it from being accidentally published to the registry? No
accidentally published to the registry? (y/N) 
{
  name: 'blog',
  version: '0.0.0',
  authors: [
    'javachen '
  ],
  license: 'MIT',
  ignore: [
    '**/.*',
    'node_modules',
    'bower_components',
    'test',
    'tests'
  ],
  dependencies: {
    jquery: '~2.1.1'
  }
}

[?] Looks good? Yes

注意看,它已经加入了 jQuery 依赖关系。

现在假设也想用 twitter bootstrap,我们可以用下面的命令安装 twitter bootstrap 并更新 bower.json文件:

$ bower install bootstrap --save

它会自动安装最新版本的 bootstrap 并更新 bower.json 文件:

{
  name: 'blog',
  version: '0.0.0',
  authors: [
    'javachen '
  ],
  license: 'MIT',
  ignore: [
    '**/.*',
    'node_modules',
    'bower_components',
    'test',
    'tests'
  ],
  dependencies: {
    jquery: '~2.1.1',
    bootstrap: '~3.0.0'
  }
}

如果想查看有哪些包和文件,可执行 bower list --path。比如安装了 jquery,可以看到以下信息:

{
  "jquery": "bower_components/jquery/dist/jquery.js"
}

现在就可以使用了,在当前目录建一个页面,script 嵌入需要的 js。

Bower 类似 maven 用于管理 javascript 的版本及其依赖,使用非常简单。

5. 参考文章