Webpack worker-loader не может скомпилировать рабочий текст
Я настраиваю свой проект, как описано в документации к работнику-загрузчику, и мне удалось заставить код TS работать, используя правильный d.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'
}),
]
};
Буду признателен за любую оказанную помощь.
Спасибо:)
2 ответа
Хорошо, я понял это.
Сначала мне нужно было переместить рабочий загрузчик до ts-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'] },
]
},
Тогда в моем работнике мне также нужно было экспортировать что-либо, иначе машинопись (2.8.3) жаловалась бы, что не может найти модуль, и я export default null as any
чтобы избежать путаницы тс еще дальше.
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({});
Спасибо, Дмитрий, вы помогли мне продвинуться вперед в получении работника-загрузчика для создания моего проекта Typescript.
Тем не менее у меня было еще три проблемы, которые мне нужно было решить, чтобы заставить его работать:
Сборка зависала, когда я добавлял worker-loader выше ts-loader / awesome-typescript-loader. Я исправил это, сделав пути импорта более специфичными для типов, которые были импортированы / экспортированы из модуля веб-работника. Я узнал об этом, пытаясь закомментировать содержимое файла ввода веб-работника, а затем раскомментировать по одной строке за раз, чтобы увидеть, что будет, а что нет.
Второе, что я сделал неправильно, я добавил, что работник-загрузчик, как правило, мой конфиг веб-пакета и в операторе импорта. Я в основном дважды запускал worker-loader на модуле web-работника. Doh. Так что либо добавьте работник-загрузчик в конфигурацию вашего веб-пакета, либо добавьте 'работник-загрузчик!' к заявлению на импорт / требование. Я добавил worker-loader в свой конфиг webpack и просто импортировал вот так:
import MyWorker = require('./my-worker');
Я получил
typeerror MyWorker is not a constructor
когда я попытался создать новый MyWorker(), и мне пришлось привести MyWorker к любому из них для проверки типа Typescript, чтобы проглотить его:new (MyWorker as any)();
Надеюсь, это кому-нибудь поможет.
Если вы используете TypeScript со ссылками на проекты, добавьте options: {projectReferences: true }
в конфигурацию ts-loader webpack:
module: {
rules: [
{ test: /\.worker\.ts$/, loader: 'worker-loader' },
{
test: /\.tsx?$/,
loader: 'ts-loader',
exclude: /node_modules/,
options: {projectReferences: true }
}
]
},
Подробнее в readme ts-loader здесь.
Это не дает прямого ответа на поставленный вопрос, но эта страница является первой в Google по проблемам с ts-loader.