Webpack worker-loader 无法编译 typescript worker
Webpack worker-loader fails to compile typescript worker
我正在按照 worker-loader 文档中的描述配置我的项目,并且我能够使用正确的 d.ts.
使 TS 代码英特尔工作。
但是,在 webpack 构建过程中它抛出了一个错误,我不明白为什么。
ERROR in ./src/test.worker.ts
Module parse failed: Unexpected token (1:9)
You may need an appropriate loader to handle this file type.
| const ctx: Worker = self as any;
| ctx.addEventListener('message', event => {
| console.log(event);
我的工作文件内容test.worker.ts
:
const ctx: Worker = self as any;
ctx.addEventListener('message', event => {
console.log(event);
setTimeout(() => ctx.postMessage({
foo: 'boo'
}), 5000);
});
申请入口index.ts
import TestWorker from './test.worker.ts';
const test = new TestWorker();
test.postMessage({});
最后是我的 webpack.config.js
const path = require('path');
const webpack = require('webpack');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const DIR_SOURCE = path.resolve(__dirname, 'src');
const DIR_BUILD = path.resolve(__dirname, 'build');
module.exports = {
entry: `${DIR_SOURCE}/index.tsx`,
output: {
path: DIR_BUILD,
filename: 'project.bundle.js'
},
devtool: "source-map",
resolve: {
// Add '.ts' and '.tsx' as resolvable extensions.
extensions: [".ts", ".tsx", ".js", ".json"]
},
module: {
rules: [
{test: /\.tsx?$/, loader: "ts-loader" },
{test: /\.worker\.ts$/, use: ['ts-loader', 'worker-loader'] },
{test: [/\.vert$/, /\.frag$/], use: 'raw-loader'},
{test: /\.(png|jpg|gif|svg)$/, use: {loader: 'file-loader', options: {}} },
{test: /.*\.sass/, use: ['style-loader', 'css-loader', 'sass-loader'] },
]
},
plugins: [
new webpack.DefinePlugin({
'CANVAS_RENDERER': JSON.stringify(true),
'WEBGL_RENDERER': JSON.stringify(true)
}),
new HtmlWebpackPlugin({
template: 'src/index.ejs'
}),
]
};
非常感谢任何帮助。
谢谢:)
好的,我明白了。
首先,我需要在 ts-loader 之前移动 worker loader,并且不需要在 worker use 中指定数组 属性,只需按照 worker-loader 文档中的描述进行保存即可。
module: {
rules: [
{test: /\.worker\.ts$/, loader: 'worker-loader'},
{test: /\.tsx?$/, loader: "ts-loader" },
{test: [/\.vert$/, /\.frag$/], use: 'raw-loader'},
{test: /\.(png|jpg|gif|svg)$/, use: {loader: 'file-loader', options: {}} },
{test: /.*\.sass/, use: ['style-loader', 'css-loader', 'sass-loader'] },
]
},
然后在我的 worker 中我还需要导出任何东西,否则 typescript (2.8.3) 会抱怨它找不到模块,我 export default null as any
以避免进一步混淆 ts。
worker.js
const ctx: Worker = self as any;
ctx.addEventListener('message', event => {
console.log(event);
setTimeout(() => ctx.postMessage({
foo: 'boo'
}), 5000);
});
export default null as any;
index.js
import TestWorker from './test.worker.ts';
const test = new TestWorker('');
test.postMessage({});
谢谢 Dmitry,你帮助我在让 worker-loader 构建我的 Typescript 项目方面取得了更大的进步。
即便如此,为了让它正常工作,我还需要解决三个问题:
当我在 ts-loader/awesome-typescript-loader 上面添加 worker-loader 时构建会挂起。我通过使导入路径对于来自网络工作模块的 imported/exported 类型更加具体来解决这个问题。我通过尝试注释掉 web worker 入口文件的内容,然后一次取消注释一行,看看会构建什么和不会构建什么。
我做错的第二件事是我在 webpack 配置和导入语句中添加了 worker-loader。我在 web worker 模块上基本上是 运行 worker-loader 两次。呵呵。因此,要么将 worker-loader 添加到您的 webpack 配置中,要么将 'worker-loader!' 添加到 import/require 语句中。我将 worker-loader 添加到我的 webpack 配置中,然后像这样导入:import MyWorker = require('./my-worker');
当我尝试执行 new MyWorker() 时得到一个 typeerror MyWorker is not a constructor
,并且不得不将 MyWorker 转换为 any 以便 Typescript 类型检查器吞下它:new (MyWorker as any)();
希望这对某人有所帮助。
我正在按照 worker-loader 文档中的描述配置我的项目,并且我能够使用正确的 d.ts.
使 TS 代码英特尔工作。但是,在 webpack 构建过程中它抛出了一个错误,我不明白为什么。
ERROR in ./src/test.worker.ts
Module parse failed: Unexpected token (1:9)
You may need an appropriate loader to handle this file type.
| const ctx: Worker = self as any;
| ctx.addEventListener('message', event => {
| console.log(event);
我的工作文件内容test.worker.ts
:
const ctx: Worker = self as any;
ctx.addEventListener('message', event => {
console.log(event);
setTimeout(() => ctx.postMessage({
foo: 'boo'
}), 5000);
});
申请入口index.ts
import TestWorker from './test.worker.ts';
const test = new TestWorker();
test.postMessage({});
最后是我的 webpack.config.js
const path = require('path');
const webpack = require('webpack');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const DIR_SOURCE = path.resolve(__dirname, 'src');
const DIR_BUILD = path.resolve(__dirname, 'build');
module.exports = {
entry: `${DIR_SOURCE}/index.tsx`,
output: {
path: DIR_BUILD,
filename: 'project.bundle.js'
},
devtool: "source-map",
resolve: {
// Add '.ts' and '.tsx' as resolvable extensions.
extensions: [".ts", ".tsx", ".js", ".json"]
},
module: {
rules: [
{test: /\.tsx?$/, loader: "ts-loader" },
{test: /\.worker\.ts$/, use: ['ts-loader', 'worker-loader'] },
{test: [/\.vert$/, /\.frag$/], use: 'raw-loader'},
{test: /\.(png|jpg|gif|svg)$/, use: {loader: 'file-loader', options: {}} },
{test: /.*\.sass/, use: ['style-loader', 'css-loader', 'sass-loader'] },
]
},
plugins: [
new webpack.DefinePlugin({
'CANVAS_RENDERER': JSON.stringify(true),
'WEBGL_RENDERER': JSON.stringify(true)
}),
new HtmlWebpackPlugin({
template: 'src/index.ejs'
}),
]
};
非常感谢任何帮助。
谢谢:)
好的,我明白了。
首先,我需要在 ts-loader 之前移动 worker loader,并且不需要在 worker use 中指定数组 属性,只需按照 worker-loader 文档中的描述进行保存即可。
module: {
rules: [
{test: /\.worker\.ts$/, loader: 'worker-loader'},
{test: /\.tsx?$/, loader: "ts-loader" },
{test: [/\.vert$/, /\.frag$/], use: 'raw-loader'},
{test: /\.(png|jpg|gif|svg)$/, use: {loader: 'file-loader', options: {}} },
{test: /.*\.sass/, use: ['style-loader', 'css-loader', 'sass-loader'] },
]
},
然后在我的 worker 中我还需要导出任何东西,否则 typescript (2.8.3) 会抱怨它找不到模块,我 export default null as any
以避免进一步混淆 ts。
worker.js
const ctx: Worker = self as any;
ctx.addEventListener('message', event => {
console.log(event);
setTimeout(() => ctx.postMessage({
foo: 'boo'
}), 5000);
});
export default null as any;
index.js
import TestWorker from './test.worker.ts';
const test = new TestWorker('');
test.postMessage({});
谢谢 Dmitry,你帮助我在让 worker-loader 构建我的 Typescript 项目方面取得了更大的进步。
即便如此,为了让它正常工作,我还需要解决三个问题:
当我在 ts-loader/awesome-typescript-loader 上面添加 worker-loader 时构建会挂起。我通过使导入路径对于来自网络工作模块的 imported/exported 类型更加具体来解决这个问题。我通过尝试注释掉 web worker 入口文件的内容,然后一次取消注释一行,看看会构建什么和不会构建什么。
我做错的第二件事是我在 webpack 配置和导入语句中添加了 worker-loader。我在 web worker 模块上基本上是 运行 worker-loader 两次。呵呵。因此,要么将 worker-loader 添加到您的 webpack 配置中,要么将 'worker-loader!' 添加到 import/require 语句中。我将 worker-loader 添加到我的 webpack 配置中,然后像这样导入:
import MyWorker = require('./my-worker');
当我尝试执行 new MyWorker() 时得到一个
typeerror MyWorker is not a constructor
,并且不得不将 MyWorker 转换为 any 以便 Typescript 类型检查器吞下它:new (MyWorker as any)();
希望这对某人有所帮助。