【发布时间】:2019-04-16 00:31:00
【问题描述】:
问题
您好,我正在尝试编写一个插件并使用 ast 来解析文件。但我无法更改代码。例如,此代码不会将 div 更改为标签。改变ast的正确方法是什么?
apply(compiler) {
compiler.hooks.normalModuleFactory.tap('MyPlugin', (factory) => {
factory.hooks.parser.for('javascript/auto').tap('MyPlugin', (parser, options) => {
parser.hooks.program.tap('MyPlugin', (ast, comments) => {
if (parser.state &&
parser.state.module &&
parser.state.module.resource.indexOf('node_modules') === -1) {
if (parser.state.module.resource.endsWith('tsx')) {
var g = ast.body.filter(n=> n.type === 'ExportNamedDeclaration');
for (let a of g) {
var decl = a.declaration.declarations;
if (decl && decl[0]) {
decl[0].init.body.body[0].argument.arguments[0].raw = 'label';
decl[0].init.body.body[0].argument.arguments[0].value = 'label';
}
}
}
}
});
});
});
}`
我只需要将 div 更改为返回块中的标签或将 data-attr 添加到 div。我不想使用正则表达式并替换所有文件内容,我想用 ast 制作它。 MyComponent.tsx 可以如下:
import * as React from 'react';
import * as style from './MyComponent.css';
export const MyComponent = (props) => {
return (
<div className={style['test']}>bla bla</div>
);
};
也许有人可以提供一个小例子来改变 webpack 插件中的抽象语法树。
【问题讨论】:
-
您可能需要返回修改后的 ast。您可以检查 DefinePlugin 以检查它如何修改代码:github.com/webpack/webpack/blob/master/lib/…
-
您正在测试的模块是什么样的?
-
我更新了问题。
-
felixmosh,感谢您的回复,但我在 DefinePlugin 中找不到,他们正在修改 ast
-
尝试添加 UseStrictPlugin: UseStrictPlugin.js
标签: javascript webpack webpack-4