【问题标题】:Why does Tone JS not play nice in a Svelte component?为什么 Tone JS 在 Svelte 组件中表现不佳?
【发布时间】:2019-07-29 01:32:10
【问题描述】:

我对 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 特有的,但我已经在许多其他项目(包括 React 内部等)中成功使用了 Tone JS,没有任何问题。

这可能是什么原因造成的?以及如何在我的 Svelte 应用程序中开始使用 ToneJS? (使用 Rollup 打包/转译)

【问题讨论】:

  • 好像在使用webpack的时候,没有出现这个问题。所以必须是汇总包 ToneJS 的方式。
  • 看来问题不在 Rollup 方面。

标签: javascript rollupjs svelte svelte-component


【解决方案1】:

intro: 行放入rollup.config.js 为我修复了它:

output: {
    sourcemap: true,
    format: 'iife',
    name: 'app',
    file: 'public/bundle.js',
    // Added this line:
    intro: 'var global = typeof self !== undefined ? self : this;'
},

【讨论】:

    【解决方案2】:

    发生这种情况是因为 Rollup 作为原生 JavaScript 模块打包器,必须将所有 JS 视为处于严格模式(因为 JavaScript 模块始终是严格模式),即使它们是从旧格式转换而来的。

    不幸的是 Tone.js 正在做违反严格模式的事情(分配给不可写的属性)。我建议在该回购上提出问题;严格模式更快、更安全,确实没有理由支持严格模式环境。

    与此同时,您可以通过将 Tone.js 包含为常规 &lt;script&gt; 标记并在您的应用中将其作为全局引用来解决此问题。

    【讨论】:

      猜你喜欢
      • 2022-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-07
      • 1970-01-01
      • 2021-01-08
      • 2012-01-08
      • 1970-01-01
      相关资源
      最近更新 更多