У меня проблема с транспарантной машинкой Babel7, декораторами и свойствами класса.Вот типичный компонент, украшенный MobX @observer
и нашим @custom
декоратором.
@observer
@custom
export class Trends extends React.Component<TrendsProps> {
.....
public static readonly METHODS = {
TOTAL: 'total',
DIFFERENT: 'different'
};
public static readonly defaultState: TrendsStates = {
method: Trends.METHODS.TOTAL
};
.....
}
После переноса его с помощью babel-loader
я получаю следующий целевой код:
// transpiled Trends module code
return Trends;
}(__WEBPACK_IMPORTED_MODULE_7_react__["Component"]), _class2.METHODS = {
TOTAL: 'total',
DIFFERENT: 'different'
}, _class2.defaultState = {
method: Trends.METHODS.TOTAL
}, _temp)) || _class) || _class);
;
Таким образом, хотя объявленные статические свойства подключаются к декорированному классу _class2
, внутри них есть старый вызов класса Trends
, которого просто нет в текущей области видимости.Когда декораторы удалены, все работает как шарм.Мои babel.config.js
:
module.exports = api => {
api.cache(false);
return {
presets: [
[
'@babel/preset-env',
{
targets: {
browsers: ['last 2 Chrome versions', 'last 2 Safari versions', 'last 2 Firefox versions']
},
modules: false,
forceAllTransforms: true
}
],
'@babel/preset-react',
'@babel/preset-typescript',
],
env: {
test: {
presets: [['@babel/preset-env'], '@babel/preset-react']
}
},
plugins: [
['@babel/plugin-proposal-decorators', { legacy: true }],
['@babel/plugin-proposal-class-properties', { loose: true }],
'@babel/plugin-proposal-object-rest-spread',
'@babel/plugin-syntax-dynamic-import',
[
'@babel/plugin-transform-runtime',
{
helpers: true
}
],
'react-hot-loader/babel'
]
};
};
Корни проблемы объясняются здесь , но без решения для babel7.Как видите, я использовал предложенный конфиг из этого потока , и он действительно позволяет использовать декораторы, но вылетает из-за статических свойств.Удаление декоратора @custom
не повлияет на проблему.