我需要在Webpack编译时插入data-attr来响应组件。 例如,我有这个组件:
export const MyComponent = (props: any) => {
return (
<div>bla bla</div>
);
};
编译后,我需要这个:
export const MyComponent = (props: any) => {
return (
<div data-attr="some data">bla bla</div>
);
};
我写了以下插件(我认为它几乎是完整的,但是我找不到插入属性的方法):
export class ReactAttrGeneratorPlugin implements webpack.Plugin {
public apply({ hooks }: webpack.Compiler) {
hooks.compilation.tap(
"ReactAttrGeneratorPlugin",
(compilation) => {
compilation.dependencyFactories.set(ConstDependency, new NullFactory());
compilation.dependencyTemplates.set(ConstDependency, new ConstDependency.Template());
});
hooks.normalModuleFactory.tap('ReactAttrGeneratorPlugin', (factory) => {
factory.hooks.parser.for('javascript/auto').tap('ReactAttrGeneratorPlugin', (parser, options) => {
parser.hooks.statement.tap('ReactAttrGeneratorPlugin', (statement:any) => {
if (this.isOwnComponent(parser) && statement.type === 'ReturnStatement') {
const div = statement.argument.arguments[0];
/** What do I need here, to insert attribute to div? **/
}
});
});
});
}
private isOwnComponent(parser: any) {
return parser.state &&
parser.state.module &&
parser.state.module.resource.indexOf('node_modules') === -1 &&
parser.state.module.resource.endsWith('tsx');
}
}
答案 0 :(得分:0)
我还没有自己编写Webpack插件,但是我发现https://github.com/jantimon/html-webpack-plugin/issues/538和html-webpack-plugin似乎在做一些相关的事情。 source code of that package可能对您有所帮助,因为它通过使用以下函数将属性添加到了 any 标记
function addAttr(compilation, tags, key, val) {
if (!tags || !tags.length) {
return;
}
forEach(tags, function (tag, index) {
var value = val;
if (typeof val === "function") {
value = val(tag, compilation, index);
} else if (typeof val === 'object') {
value = JSON.stringify(val);
}
tag.attributes[key] = value;
});
}