常用API
在Bone的虚拟文件系统中,bone.dest()函数是所有的文件定义的入口
bone.dest()返回一个file对象,该对象用来描述文件的状态,下面是file对象的api列表
- dest() 定义虚拟文件夹
 - src() 指定映射源文件
 - cwd() 修改cwd
 - dir() 指定文件所在的文件夹
 - rename() 修改虚拟文件名称
 - act() 指定处理器处理
 - temp() 临时文件标识
 
注:file对象的api允许链式调用
dest
参数类型: String
bone.dest()函数返回一个file对象,并将参数传递给file对象的dest()函数
var dist = bone.dest('dist');
通过dest()定义一个虚拟文件夹,假设项目根目录所在文件夹为/work/project/,则我们通过上面的代码定义了/work/project/dist的文件夹
注:项目根目录是bonefile.js文件所在的文件夹
再次调用dest()则是定义该虚拟文件夹下的子虚拟文件夹
var dist = bone.dest('dist');
    dist.dest('subfolder');
通过上面的代码我们定义了另外一个文件夹/work/project/dist/subfolder
对于多层文件夹路径我们也可以直接一次性定义
var subfollder = bone.dest('dist/subfolder');
当然这些定义的虚拟文件夹在你的文件系统里并不存在,仅仅是保存在内存里的配置而已
src
参数类型:StringArray、String
src()函数指定将哪些源文件映射到当前虚拟文件夹下
可以指定单一文件
var dist = bone.dest('dist');
dist.src('~/src/main.js');
可以使用glob语法,glob语法请参阅 node-glob
dist.src('~/src/*.js');
// 使用数组指定多个文件
dist.src([
    '~/src/main.js',
    '~/src/lib/jquery.js',
    '~/src/page/*.js'
]);
假设我们的目录结构是这样的
┬root
└┬ src
 ├── main.js
 ├─┬ lib
 │ ├── undescore.js
 │ ├── jquery.js
 │ └── backbone.js
 └─┬ page
   ├── index.js
   └── detail.js
通过上面的代码我们定义了一个dist文件夹,于是我们的目录结构变成这样
┬root
├┬dist (虚拟文件夹和虚拟文件)
│├── main.js
│├── jquery.js
│├── index.js
│└── detail.js
│
└┬ src
 ├── main.js
 ├─┬ lib
 │ ├── undescore.js
 │ ├── jquery.js
 │ └── backbone.js
 └─┬ page
   ├── index.js
   └── detail.js
注:~符号表示项目根目录
src()函数中的相对路径符号./、../是相对于所在的虚拟文件夹路径,下面这两种写法相同
bone.dest('dist')
    .src('../src/main.js');
bone.dest('dist')
    .src('~/src/src/main.js');
请注意避免定义一个无限递归映射文件,假设在本地文件系统中有这样一个文件src/main.js,下面的是错误的定义代码
bone.dest('src')
    .src('./main.js');
src()函数不仅支持映射本地文件还支持虚拟文件的映射,上面的代码对于bone来说,是在src下定义了main.js文件,这个文件映射自src/main.js文件也就是其自身,从而导致无限递归映射,请避免这样的定义
cwd
参数类型:String
cwd()函数必须在src()函数之前调用。该函数用来改变src()相对的所在文件夹路径
bone.dest('dist')
    .cwd('~/src')
    .src('./main.js');
上面的代码改变了src('./main.js')的相对路径,src最终指定的是~/src/main.js
dir
参数类型:String、Function
dir()函数必须在src()函数调用之后调用。该函数用来设置映射文件所在的文件夹
bone.dest('dist')
    .src('~/src/main.js')
    .dir('subfloder');
上面的代码配置了一个虚拟文件dist/subfloder/main.js
dir()函数和dest()函数相同,都是定义虚拟文件夹,不同的是dir()函数可以根据映射文件来生成,通过传递函数参数来动态设置文件夹
// 项目根目录 /work/project
bone.dest('dist')
    .src('~/src/main.js')
    .dir(function(dir, src, dest) {
        // dir = '';
        // src = '/work/project/src/main.js'
        // dest = '/work/project/dist/main.js'
        return 'subfloder';
    });
如果src()使用glob语法匹配,则dir默认值为glob匹配的文件夹
// 项目根目录 /work/project
// 文件树
// ┬root
// └┬ src
//  └─┬ page
//    ├── index.js
//    └── detail.js
bone.dest('dist')
    .src('~/src/**/*')
    .dir(function(dir, src, dest) { // 对于glob匹配到的文件都会遍历访问`dir()`函数,我们取一个文件为例子
        // dir = 'page'
        // src = '/work/project/src/page/index.js'
        // dest = '/work/project/dist/index.js'
        return ''; // 通过返回空字符串将默认的'page'文件夹取消
    });
rename
参数类型:String、Function、Object
rename()函数必须在src()函数调用之后调用。该函数用来修改映射后文件的名称
bone.dest('dist')
    .src('~/src/main.js')
    .rename('main.rename.js');
通过上面的代码我们配置了一个文件dist/main.rename.js映射源文件为src/main.js
也支持传递参数对象,下面是使用对象作为参数,name和ext可以同时传递也可以只传递一个
bone.dest('dist')
    .src('~/src/main.js')
    .rename({
        name: 'main.rename',
        ext: '.js'
    });
对于src()使用glob语法匹配的多个文件,请避免使用String和Object类型,多个文件使用同一名称会造成重复定义文件的错误,多个文件请使用Function类型来动态重命名
// 项目根目录 /work/project
// 文件树
// ┬root
// └┬ src
//  └─┬ page
//    ├── index.js
//    └── detail.js
bone.dest('dist')
    .src('~/src/**/*')
    .rename(function(fileName, filePath, fileInfo) {
        // fileName = 'index.js'
        // filePath = '/work/project/src/page/index.js'
        // fileInfo = { 
        //    root: '/',
        //    dir: '/work/project/src/page',
        //    base: 'index.js',
        //    ext: '.js',
        //    name: 'index' 
        //  }
        return fileInfo.name + 'rename.js';
    });
对于批量修改文件后缀可以使用extTransport
bone.dest('dist')
    .src('~/src/**/*')
    .rename({
        extTransport: {
            '.less': '.css'
        }
    });
注:若设置了ext参数,则extTransport参数无效
act
参数类型: Plugins
act()函数必须在src()函数调用之后调用。该函数用来设置文件映射过程中需要进行修改的处理器
var bone = require('bone');
var less = bone.require('bone-act-less');
bone.dest('dist')
    .src('~/src/less/style.less')
    .act(less);
上面代码使用了bone-act-less处理器对less文件进行编译处理
处理器相关的介绍请参阅处理器
temp
参数类型: Boolean
temp()函数用来标志该文件或文件夹是否临时文件,临时文件不会生成到本地文件系统中
// 标识为临时文件夹
bone.dest('dist')
    .dest('temp')
    .temp(true);
// 标识为临时文件
bone.dest('dist')
    .src('~/src/temp.js')
    .temp(true);