我正在为Brunch编写一个插件来过滤'代码库中的文件。基本思路是:
src\
文件夹中,或者任何与库模式不匹配的监视文件夹),lib\
文件夹中,src\
之外,磁盘上某处)构建导入/必需模块的列表当我只使用JavaScript文件this.pattern = /.*(js|jsx)$/;
时,一切正常。下一步是包含更多文件,因为库中的许多模块/组件都有某种模板或样式表,例如,这是一个AngularJS模块:
lib\
modules\
pager\
controller.jsx
directive.jsx
template.html
pager.styl
README.md
但是当我扩展模式以包含其他文件this.pattern = /.*/;
时,我遇到了各种各样的问题(;大多数都与pipline有关 - 这些都是我遇到的错误。例如:
我已尝试单独解决这些问题,例如,如果我禁用html-brunch config.plugins.off: ['html-brunch']
,并在编译器函数中添加此代码,它就有用了:
if( params.path.match(/.html$/) ) {
params.data = "module.exports = function() { return " + JSON.stringify(params.data) + ";};";
return callback(null, this.config.modules.wrapper(params.path, params.data));
}
..但我无法解决所有问题。几乎所有问题都与编译器函数中的这一行有关:return callback(null, null);
。当我拒绝'一个文件下一个插件得到一些未定义的东西并打破......
我希望最终扩展插件的功能以处理静态资产,例如,如果使用了库,请复制lib\images\placeholder-1.jpg
(但不是placeholder-2.jpg
)在html文件中,但我已经陷入了这一点......
这是插件的代码:
var CodeLibrary;
module.exports = CodeLibrary = (function() {
var required = [];
CodeLibrary.prototype.brunchPlugin = true;
function CodeLibrary(config) {
this.config = config;
this.pattern = /.*/;
this.watched = this.config.paths.watched.filter(function(path) {
return !path.match( config.plugins.library.pattern );
});
}
function is_required(path) {
var name = this.config.modules.nameCleaner(path);
return required.some(function(e, i, a) { return name.match(e); });
}
function in_library(path) {
return Boolean(path.match( this.config.plugins.library.pattern ));
}
function is_watched(path) {
return this.watched.some(function(e, i, a) { return path.match( e ); });
}
CodeLibrary.prototype.lint = function(data, path, callback) {
if( !is_watched.apply(this, [path]) &&
!is_required.apply(this, [path]) )
return callback();
var es6_pattern = /import .*'(.*)'/gm;
var commonjs_pattern = /require\('(.*)'\)/gm;
var match = es6_pattern.exec(data) || commonjs_pattern.exec(data);
while( match != null ) {
if( required.indexOf(match[1]) === -1 )
required.push( match[1] );
match = es6_pattern.exec(data) || commonjs_pattern.exec(data);
}
callback();
}
CodeLibrary.prototype.compile = function(params, callback) {
if( is_required.apply(this, [params.path]) ||
!in_library.apply(this, [params.path]) )
return callback(null, params);
return callback(null, null);
};
return CodeLibrary;
})();