编写boi插件
如果直接配置webpack仍然难以满足业务需求,boi还提供了插件系统来配置更复杂的需求。
boi.PluginClass.loader
boi.PluginClass.loader
是编写boi loader 类型插件的构造函数。所谓loader类型插件,顾名思义,就是对构建功能进行更细致的配置,也就是对webpack进行配置。
下面是截取boi编译vue文件插件boi-plugin-loader-vue代码中的一部分:
const ClassLoader = boi.PluginClass.loader;
let config = {
module: {
preloader: null,
postloader: null,
loaders: [{
test: /\.vue$/,
loader: 'vue'
}].concat(styleLoaders({
extract: true
}))
},
noParse: null,
plugins: [stylePlugin],
extra: {
vue: {
autoprefixer: isAutoprefixer,
loaders: cssLoaders({
extract: true
})
}
},
// 插件依赖的第三方module
// 此配置项是为了解决低版本npm树形安装node_modules引起的module寻址问题
// 如果你确定使用npm 3.0.0及以上版本,可以不配置此项
dependencies: [
'vue-loader',
'vue-style-loader',
'vue-html-loader',
'extract-text-webpack-plugin'
]
};
// 每个插件中创建实例的数量不限,但是建议每个loader插件只创建一个实例
new ClassLoader('extend', config);
config
对象是webpack的一系列配置项,其中module
、noParse
和plugins
直接映射为webpack同名配置项;extra
与boi.spec
的extras
配置项功能相同,其内容被映射为webpack配置项;dependencies
比较特殊,是为了解决低版本npm(3.0.0以下)安装node_modules目录太深而导致的windows系统下模块寻址问题。如果你确定你的npm高于3.0.0版本,可以不配置此选项。
上述代码的最后一行创建了boi.PluginClass.loader
的一个实例,第一个参数目前统一为extend
,表明插件的工作类型;第二个参数为webpack的配置项。
发布你的插件,按照使用boi插件文档,在boi-conf.js
中引入你的插件即可:
boi.use('boi-plugin-loader-vue', {
style: {
destDir: 'style',
useHash: true
},
autoprefixer: false
});
编写可配置的插件
前文的boi.use
API使用'boi-plugin-loader-vue'
时传入了一系列配置项,这些配置项不是针对boi的,而是插件'boi-plugin-loader-vue'
暴露出来的。
如果插件本身也是可配置的,那么在编写插件时,可以将插件编写为function
类型,如下:
module.exports = function(options){};
上述代码中函数的参数options
即可接受的配置项集合。