Почему Tone JS не играет хорошо в компоненте Svelte? - PullRequest
1 голос
/ 07 марта 2019

Я довольно новичок в Svelte (я использую версию 2, пока 3 не будет выпущена должным образом), и я строю сайт, который нацелен на проведение некоторого аудио анализа (FFT). Поэтому я включаю почтенную библиотеку ToneJS (http://tonejs.github.io/) в один из моих компонентов.

По какой-то причине простого импорта ToneJS достаточно для сбоя всего приложения.

Вот весь мой компонент Svelte:

<h2>Pitch analyser</h2>


<script>
    import Tone from 'tone';

</script>

Это вызывает ошибку:

Tone.js:7 Uncaught TypeError: Cannot assign to read only property 'listener' of object '#<AudioContext>'
at t.Context.set (Tone.js:7)
at t.Listener.<anonymous> (Tone.js:7)
at Function.e.getContext (Tone.js:7)
at new t.Listener (Tone.js:7)
at Object.<anonymous> (Tone.js:7)
at Object.<anonymous> (Tone.js:7)
at i (Tone.js:1)
at Object.<anonymous> (Tone.js:7)
at i (Tone.js:1)
at Tone.js:1

Возможно, это не относится к Svelte, но я успешно использовал Tone JS во многих других проектах (в том числе внутри React и т. Д.) Без каких-либо проблем.

Что может быть причиной этого? И как начать использовать ToneJS в моем приложении Svelte? (Упаковано / перевезено с использованием Rollup)

1 Ответ

1 голос
/ 07 марта 2019

Это происходит потому, что Rollup, как собственный пакет модулей JavaScript, должен обрабатывать все JS, как если бы он был в строгом режиме (потому что модули JavaScript всегда строгие), даже если они конвертированы из устаревших форматов.

К сожалению, Tone.js делает вещи, которые нарушают строгий режим (присваивая неперезаписываемые свойства). Я бы порекомендовал подать вопрос об этом репо; строгий режим быстрее и безопаснее, и на самом деле нет никакой причины не поддерживать среды строгого режима.

Тем временем вы можете обойти это, включив Tone.js как обычный тег <script> и сославшись на него в своем приложении как глобальный.

...