MQTT.js和Webpack-“ WS不是构造函数”

时间:2019-03-14 09:44:36

标签: javascript node.js webpack webpack-4

我正在尝试使用MQTT.js捆绑我们的一个微服务,而我正为一个非常奇怪的问题而苦苦挣扎。

无需捆绑即可正常工作,因此ws中有node_modules

我认为很重要的东西

错误:

    TypeError: WS is not a constructor
        at WebSocketStream (dist/index.js:159329:16)
        at createWebSocket (dist/index.js:147450:10)
        at Object.buildBuilderBrowser (dist/index.js:147476:10)
        at MqttClient.wrapper [as streamBuilder] (dist/index.js:147937:36)
        at MqttClient._setupStream (dist/index.js:146471:22)
        at new MqttClient (dist/index.js:146452:8)
        at Function.connect (dist/index.js:147940:10)

Webpack配置:

const path = require('path');
const nodeExternals = require('webpack-node-externals');

const { NODE_ENV = 'production' } = process.env;

module.exports = {
  entry: { index: './src/index.ts' },
  mode: NODE_ENV,
  target: 'node',
  watch: NODE_ENV === 'development',
  externals: [nodeExternals()],
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: '[name].js',
  },
  resolve: {
    extensions: ['.ts', '.js'],
  },
  node: {
    __dirname: false,
  },
  module: {
    rules: [
      {
        test: /\.ts$/,
        use: [{ loader: 'ts-loader', options: { transpileOnly: true } }],
      },
      {
        test: /(\.md|\.map)$/,
        loader: 'null-loader',
      },
    ],
  },
};

发生的功能:

createMqttClient(): MqttClient {
    return mqtt.connect(this.mqttOptions.url, { ...this.mqttOptions.options });
  }

该网址类似于:ssl://url-to-our-mqtt

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:0)

我也遇到了同样的问题。 我的问题是我曾经使用过

 plugins: [
   new webpack.NormalModuleReplacementPlugin(/^mqtt$/, "mqtt/dist/mqtt.js"),
 ],
在webpack.config.js中使用

来解决mqtt.js附带的shebang错误,因为它是一个CLI工具。 然后我改用

  {
    test: [
      /node_modules[/\\]mqtt[/\\]mqtt.js/,
      /node_modules[/\\]mqtt[/\\]bin[/\\]sub.js/,
      /node_modules[/\\]mqtt[/\\]bin[/\\]pub.js/,
    ],
    loader: 'shebang-loader'
  },

我的问题已解决。您是否还在导入中使用mqtt / dist / mqtt.js而不是mqtt,或者是否执行了类似于我的操作,那么我上面发布的shebang-loader规则可能会解决您的问题。

答案 1 :(得分:0)

我在使用Amazon aws-iot-device-sdk-js和Microsoft azure-iot-device-mqtt时都遇到了同样的情况,它们都包含mqtt。

最初的问题是构建错误:

ERROR in ./node_modules/mqtt/mqtt.js Module parse failed: Unexpected character '#' (1:0)

此错误是由软件包mqtt引起的。三个文件(mqtt.js,pub.js和sub.js)包含shebang行

#!/usr/bin/env node 

使用模块更换的解决方案建议了一些地方

plugins: [
   new webpack.NormalModuleReplacementPlugin(/^mqtt$/, "mqtt/dist/mqtt.js"),
 ],

不幸的是,将构建错误更改为运行时错误

TypeError: WS is not a constructor

如其他答案中所述,可以将webpack配置为(https://webpack.js.org/concepts/loaders/)以使用shebang加载程序(https://www.npmjs.com/package/shebang-loader

TL; DR

安装shebang-loader

npm install shebang-loader --save

在webpack.config.js中,使用加载程序

module.exports = {
...
    module: {
        rules: [
            {
                test:
                    [
                        /.*mqtt\.js$/,
                        /.*sub\.js$/,
                        /.*pub\.js$/
                    ],
                use: 'shebang-loader'
            }
        ]
    }
}