常用API

在Bone的虚拟文件系统中,bone.dest()函数是所有的文件定义的入口

bone.dest()返回一个file对象,该对象用来描述文件的状态,下面是file对象的api列表

注: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

参数类型:StringArrayString

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

参数类型:StringFunction

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

参数类型:StringFunctionObject

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语法匹配的多个文件,请避免使用StringObject类型,多个文件使用同一名称会造成重复定义文件的错误,多个文件请使用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);