Я работаю над библиотекой, которая во многом зависит от Function.prototype.name
(для установки ярлыков в родительском экземпляре).
class FooSection {}
class BarSection {}
class Page {
constructor(sections) {
for (let SectionClass of sections) {
this[SectionClass.name] = new SectionClass(this);
}
}
}
let page = new Page([
FooSection,
BarSection
]);
Все это прекрасно работает, пока не вступает в действие оптимизация Webpack. Это по умолчанию искажает имена функций, в результате чего классы и их свойство name
сокращаются. Полезно обычно, не здесь. Итак, я пошел и передал соответствующую конфигурацию Webpack:
// ...
optimization: {
minimizer: [
new UglifyJsPlugin( {
uglifyOptions: {
keep_fnames: true
}
} )
]
}
Согласно документации, это должно сохранить имена моих функций. Удивительно, но вместо этого имена дублируются, так что Page
внезапно становится Page_Page
(примечание: этот блок кода написан мной, но примерно так выглядит результат ):
class FooSection_FooSection{}
class BarSection_BarSection{}
class Page_Page{
constructor(t) {
for(let s of t){this[s.name]=new s(this)}
}
}
let p=new Page_Page([FooSection_FooSection,BarSection_BarSection])
Это невозможно воспроизвести только с помощью UglifyJS, поэтому он должен быть где-то внутри цепочки инструментов (webpack -> uglifyjs-webpack-plugin -> uglifyjs), но я не могу понять, где. Кто-нибудь испытал это еще?
Версии следующим образом:
- веб-пакет: 4.6.0
- uglifyjs-webpack-плагин: 1.2.5
- углифайс: 3.3.9
Обновление:
Судя по комментариям, такая же проблема возникает при использовании uglifier TerserPlugin.