Почему свойство name ничего не выводит в браузере Edge при сжатии? - PullRequest
0 голосов
/ 20 января 2019

Так что я использую модуль, который запрашивает контент на основе его типа, и чтобы выяснить, какой контент он ищет, он должен сначала построить строку запроса, используя различные функции, такие как Not, And, type, typeIs и т. Д. из этих функций вызывает у меня проблемы в производстве; В основном функция typeIs. Вот как это реализовано.

 public typeIs<TNewType>(newTypeAssertion: new (...args: any[]) => TNewType) {
        this.stringValue = `TypeIs:${newTypeAssertion.name}` // Here is the issue
        this.segmentType = 'typeIs'
        return this.finialize<TNewType>()
 }

Теперь проблема в том, что когда код минимизируется, по умолчанию все имена функций сжимаются, искажаются и т. Д. Чтобы решить эту проблему, я установил минимизатор для сохранения имен функций. Вот как это выглядит.

minimizer: [
    new TerserPlugin({
      cache: true,
      parallel: true,
      terserOptions: {
        keep_fnames: true
      }
    })
]

Это прекрасно работает в Chrome, но проблема в том, что это не работает в краю. Вот скриншот, чтобы показать, что я имею в виду.

Edge browser unable to identify function name

Вы можете видеть, что я выделил слово Typeis: на изображении, и причина этого в том, что это часть строки запроса, которая искажена. Это должен был быть Typeis: User для правильной работы.

Как я решил эту проблему, настроив минимизатор так:

minimizer: [
    new TerserPlugin({
      cache: true,
      parallel: true,
      terserOptions: {
        keep_fnames: true,
        compress: false // This setting is crucial for it work on edge.
      }
    })
  ]

и вот как это выглядит на Edge.

enter image description here

Как видите, теперь строка запроса больше не искажена, поскольку не было сжатия. Очевидно, что я хочу, чтобы мой код был сжат, чтобы уменьшить размер пакета, и прошел через многие из его параметров сжатия, чтобы выяснить, какой вариант является виновником, но безрезультатно.

Мой вопрос: почему свойство name ничего не выводит в браузере Edge при сжатии, а не в chrome?

1 Ответ

0 голосов
/ 21 января 2019

Комментарий, сделанный пользователем kzc в этом выпущенном github, помог мне решить эту проблему (https://github.com/terser-js/terser/issues/120).

. В своем комментарии он упомянул, что это была ошибка, связанная с этими 6 вариантами сжатия

  • collapse_vars
  • inline=3
  • join_vars
  • loops
  • reduce_vars
  • sequences (depending on the code)
  • unused

После того, как это выяснилось, нужно было просто посмотреть на выходной комплект и сделать некоторые логические выводы относительно того, кто вызвал эту проблему.Оказывается, это был параметр redu_vars.

Теперь мой минимизатор выглядит следующим образом

minimizer: [
    new TerserPlugin({
      cache: true,
      parallel: true,
      terserOptions: {
        mangle: true,
        compress: {
          reduce_vars: false
        },
        keep_fnames: true
      }
    })
]

Глядя на документацию terser для опций сжатия, это то, что делает lower_vars.

reduce_vars (по умолчанию: true) - Улучшена оптимизация для переменных, присвоенных и используемых в качестве константных значений.

, что имеет смысл с точки зрения того, почему установка его в значение false решает эту проблему.Файл моего выходного пакета состоял из константных переменных, которые содержат ссылки на модульТак как я импортировал и в какой-то момент на этапе сжатия он уменьшил эти переменные настолько сильно, что, вероятно, не смог выяснить, к какому модулю принадлежит эта переменная.Это как раз то, что я думаю, и, возможно, кто-то другой может вмешаться в эту проблему.

...