如何在Web Worker中使用Webpack转换node_module?

问题描述

我正在尝试在wepback项目中包括一个节点模块(primitive-ellipsoid)。该模块未转换为es5,因此在浏览器中使用时会引发错误

Uncaught Error: Module parse Failed: /Users/kevzettler/code/crashgiants/node_modules/primitive-ellipsoid/index.js Unexpected token (8:4)
You may need an appropriate loader to handle this file type.
|   // Default to an oblate spheroid
|   const { latSegments = 32,lngSegments = 64,rx = 2,ry = 1,rz = 1 } = {
|     ...options
|   };
|

此项目是弹出的较旧的create-react-app webpack

    "webpack": "3.5.1","webpack-dev-server": "2.8.2","webpack-manifest-plugin": "1.2.1",

它正在使用babelbabel-loaderworker-loader我有一个webpack.config.dev.js,其规则如下:

    rules: [
      {
        // "oneOf" will traverse all following loaders until one will
        // match the requirements. When no loader matches it will fall
        // back to the "file" loader at the end of the loader list.
        oneOf: [
          // Process JS with Babel.
          {
            test: /\.(js|jsx)$/,include: [
              paths.appSrc,],exclude: /\.worker.js$/,loader: require.resolve('babel-loader'),options: {
              // This is a feature of `babel-loader` for webpack (not Babel itself).
              // It enables caching results in ./node_modules/.cache/babel-loader/
              // directory for faster rebuilds.
              //cacheDirectory: true,},{
            test: /\.worker.js$/,exclude: /node_modules/,use: [
              'worker-loader',require.resolve('babel-loader'),]
          }
        ]

我在package.json中配置了babel:

  "babel": {
    "plugins": [
      "babel-plugin-transform-decorators-legacy"
    ],"presets": [
      [
        "env",{
          "targets": "defaults"
        }
      ],"flow","react-app"
    ]
  },

我尝试弄乱webpack.config.json中的includesexcludes失败。如果我需要专注于worker-loader规则,因为它也使用babel-loader,或者也应用了顶级babel-loader,我会感到困惑。

更新我只想转换特定的node_module/primitive-ellipsoid,如果我转换整个node_modules时还有很多其他问题。我尝试过

          {
            test: /\.(js|jsx)$/,include: [
              'node_modules/primitive-ellipsoid',paths.appSrc,

但这有相同的错误

解决方法

您的第一条规则未找到primitive-ellipsoid。如上述评论所述,请尝试从您的第一个构建规则中删除包含内容:

{
    test: /\.(js|jsx)$/,exclude: /\.worker.js$/,loader: require.resolve('babel-loader'),options: {
        // This is a feature of `babel-loader` for webpack (not Babel itself).
        // It enables caching results in ./node_modules/.cache/babel-loader/
        // directory for faster rebuilds.
        //cacheDirectory: true,},

如果这不起作用,请尝试添加另一条规则,该规则将捕获其他任何内容作为后备,并查看它是否找到了您的库。