- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试使用 vue-cli 创建一个使用 AudioWorklet 的 Web 应用程序,但是在尝试访问我的 AudioWorkletNode 的任何属性(如端口或 channel 计数等)时我遇到了一堆错误:
TypeError: Illegal invocation at MyWorkletNode.invokeGetter
经过几个小时的谷歌搜索和调试,我认为它与类有某种关系,AudioWorklet 似乎只适用于 ES6 类,但 vue-cli/babel/webpack 之一确实很神奇(我不明白它在哪里和做什么) 并将类转译为常规构造函数或其他东西。或者也许是 worklet-loader 进行了转译?我不知道,我完全一头雾水,不知道该往哪里看。
如果我在没有任何 bundler 的情况下编写代码,只有 vanilla JS,它就可以工作,我不会收到任何错误。但是我需要在我的 vue 项目中使用 AudioWorklets,那么我有什么选择呢?有什么比禁用类转译更好的吗?如果没有,我可以在哪里以及如何禁用它?
// main.js
import worklet from 'worklet-loader!./processor.js'
class MyWorkletNode extends AudioWorkletNode {
constructor(context) {
super(context, 'my-worklet-processor');
// Throws TypeError: Illegal invocation
console.log(this.channelCount);
}
}
this.audioCtx.audioWorklet.addModule(worklet).then(() => {
let node = new MyWorkletNode(this.audioCtx);
console.log("Loaded!");
// Throws TypeError: Illegal invocation
node.port.onmessage = event => {
console.log(event.data);
};
}).catch(e => console.log(`${e.name}: ${e.message}`));
// processor.js
class MyWorkletProcessor extends AudioWorkletProcessor {
constructor() {
super();
this.port.postMessage('hello!');
}
process(inputs, outputs, parameters) {
// audio processing code here.
}
}
registerProcessor('my-worklet-processor', MyWorkletProcessor);
最佳答案
如果没有更多代码,很难说出这里出了什么问题。工作集部分看起来不错。
但要回答一般性问题(为了后代),处理器必须在一个单独的包中加载到它自己的上下文中。当您使用 worklet-loader 时,导入实际上只是一个 url。
import MyWorkletProceessor from 'worklet-loader!./path/MyWorkletProcessor'
console.log(MyWorkletProcessor)
>5b91ba45c32d94f52b3a.worklet.js
我不建议使用内联加载器,因为它默认将工件放在 dist 根目录下,这可能会导致部署问题。
这是基本设置的演练。
// vue-config.js
configureWebpack: {
module: {
rules: [
{
test: /Worklet\.js$/, <---- change this to match your filename conventions
loader: 'worklet-loader',
options: {
name: 'js/[hash].worklet.js'
}
}
]
}
}
// somewhere in vue code
import MyWorkletProcessor from './path/MyWorkletProcessor'
import MyWorkletNode from './path/MyWorkletNode'
...
try {
await context.audioWorklet.addModule(MyWorkletProcessor)
myWorkletNode = new MyWorkletNode(context)
// or if no custom node
// myWorkletNode = new AudioWorkletNode(context, 'my-worklet-processor')
} catch (error) {
// ...
}
// connect the workletNode input to a source node
someSourceNode.connect(myWorkletNode )
// connect the worklet output to some other node or destination
myWorkletNode.connect(context.destination)
// MyWorkletNode.js
export default class MyWorkletNode extends AudioWorkletNode {
constructor(context) {
super(context, 'my-worklet-processor')
console.log(this.channelCount)
}
}
// MyWorkletProcessor.js
class MyWorkletProcessor extends AudioWorkletProcessor {
constructor() {
super()
this.port.postMessage('hello!')
}
process(inputs, outputs, parameters) {
// audio processing code here.
return true
}
}
registerProcessor('my-worklet-processor', MyWorkletProcessor)
我也做了一个相关的demo app显示在 vue 中运行的工作集。
关于javascript - 如何让 AudioWorklets 与 vue-cli/webpack/babel 一起工作? (获取非法调用错误),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53794127/
我正在为我的 React 项目设置 Webpack,并对 babel 感到困惑, babel-core , babel-loader , babel-preset-2015和babel-preset-
所有这些 babel 依赖项是什么?它们各自的用途是什么,它们有何不同?我应该为我的 nodejs 网络应用程序使用哪一个? 我已经查看了 API 网站,但是否有任何指南可以将这些内容转化为简单的人类
我的 Node Webpack 项目使用了三个 babel 库。它们之间有什么区别以及如何使用它们? "dependencies": { "babel-runtime": "^5.8.24" }
我用 @babel/core 替换了 babel-core 而 babel-loader 期望 babel-core: { "name": "myproject-ui", "version":
我尝试配置一个环境来使用 babel 和 webpack 开发 javascript。 但是我不明白关于presets的babel配置. 在 Usage Guide ,我们可以看到预设为 "@babe
我已经安装了 babel 7.5,理想情况下它应该以 preset-env 包为目标,但不确定它为什么要寻找“babel-preset-es2015”。 你们能告诉我我做错了什么吗?下面是我的代码 p
我正在更新a boilerplate中使用的babel包,从 babel-core、babel-register 等到@babel/core、@babel/register > 等 问题:在 npm
设置 通天塔 6 (^6.0.0), Node 5.4.0,Express 4.13.x, babel-node 和 babel-register 都有警告,禁止在生产环境中使用babel.io 网站
我正在尝试转换编译我的 react/es6 代码并且来自 browserify。由于新的 babel 6 版本以及大多数教程现在已经过时的事实,我正在努力创建一个 webpack 构建。这适用于我的
我有一个使用 Typescript 和 @babel/preset-env 的项目。与 Webpack 捆绑失败并显示此错误和以下配置。 如果我取消注释该行,这会强制 @babel/plugin-pr
我在浏览器中使用 babel -> babel-standalone 现在我想使用 ES decorator 语法。但是所有的通天塔doc intro 是服务器端的 babel,比如 ` { "p
我正在编写对从 cdnjs.com 引入的所有这些库的 react 。但是,我发现它报告错误:'Uncaught TypeError: Cannot read property 'keys' of u
我正在使用 babel v7.6.x 并设置了以下内容。 包.json "scripts": { "dev": "nodemon --exec babel-node bin/index.js
我正在学习巨大的 JavaScript 生态系统,但我无法理解以下内容。 Babel 是一个编译器,来自官网: Babel is a toolchain that is mainly used to
在我使用yarn add -D babel-plugin-react-relay安装relay-query插件后,并在运行开发服务器后,我收到此错误: Error: [BABEL] /Users/ne
我使用 babel 6 和 React 插件,并按照文档说明设置转译过程。我已经阅读过要让 React 工作,我需要使用 es2015 和 React preset。最初,使用这两个预设一切都运行良好
我对 Babel 选项/配置有点迷失。我想使用最新的 js 功能并编译(使用 webpack)为浏览器代码。 babel-polyfill 和有什么区别和 babel plugins与 babel-p
这个问题在这里已经有了答案: Babel file is copied without being transformed (10 个答案) 关闭 6 年前。 我只是使用 npm (npm inst
安装时 npm install browserify babelify babel-preset-es2015 我正面临以下警告信息 npm WARN deprecated babel-preset-
什么版本的标准? 12.0.1 什么操作系统、Node.js 和 npm 版本? 视窗 10, 节点 v10.15.1, NPM v.6.8.0 你期望会发生什么? 我在 devDependencie
我是一名优秀的程序员,十分优秀!