12

我正在按照worker-loader文档中的描述配置我的项目,并且我能够使用正确的 d.ts 让 TS 代码 intel 工作。

但是,在 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'
    }),
  ]
};

任何帮助深表感谢。

谢谢 :)

4

2 回答 2

22

好的,我想通了。

首先,我需要在 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'] },
    ]
  },

然后在我的工作人员中,我还需要导出任何内容,否则打字稿(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({});
于 2018-05-07T09:52:22.240 回答
5

感谢 Dmitry,您帮助我在让 worker-loader 构建我的 Typescript 项目方面取得了更大的进展。

即便如此,我还需要解决三个问题才能使其正常工作:

  • 当我在 ts-loader/awesome-typescript-loader 上方添加 worker-loader 时,构建会挂起。我通过使导入路径对于从 web worker 模块导入/导出的类型更加具体来解决这个问题。我通过尝试注释掉 web worker 条目文件的内容,然后一次取消注释一行,看看会构建什么,不会构建什么。

  • 我做错的第二件事是我添加了 worker-loader 作为我的 webpack 配置的规则,以及在 import 语句中。我基本上在 web worker 模块上运行了两次 worker-loader。多哈。因此,要么将 worker-loader 添加到您的 webpack 配置中,要么添加“worker-loader!” 到 import/require 语句。我将 worker-loader 添加到我的 webpack 配置中,然后像这样导入:import MyWorker = require('./my-worker');

  • typeerror MyWorker is not a constructor当我尝试执行 new MyWorker() 时,我得到了一个,并且不得不将 MyWorker 强制转换为任何类型,以便 Typescript 类型检查器将其吞下:new (MyWorker as any)();

希望这可以帮助某人。

于 2018-11-23T12:32:33.127 回答