Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/476.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript MQTT.js和Webpack-“;WS不是构造函数”;_Javascript_Node.js_Webpack_Webpack 4 - Fatal编程技术网

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

Javascript MQTT.js和Webpack-“;WS不是构造函数”;,javascript,node.js,webpack,webpack-4,Javascript,Node.js,Webpack,Webpack 4,我正在尝试捆绑一个使用MQTT.js的微服务,我正在努力解决一个非常奇怪的问题 它在没有捆绑的情况下工作正常,因此ws在node\u模块中可用 我认为重要的东西: 错误: TypeError: WS is not a constructor at WebSocketStream (dist/index.js:159329:16) at createWebSocket (dist/index.js:147450:10) at Object.b

我正在尝试捆绑一个使用MQTT.js的微服务,我正在努力解决一个非常奇怪的问题

它在没有捆绑的情况下工作正常,因此
ws
node\u模块中可用

我认为重要的东西:

错误:

    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)

网页包配置:

    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)

const path=require('path');
const nodeExternals=require('webpack-node-externals');
const{NODE_ENV='production'}=process.ENV;
module.exports={
条目:{index:'./src/index.ts'},
模式:NODE_ENV,
目标:'节点',
监视:NODE_ENV===“开发”,
外部:[nodeExternals()],
输出:{
path:path.resolve(uu dirname,'dist'),
文件名:'[name].js',
},
决心:{
扩展名:['.ts','.js'],
},
节点:{
__dirname:false,
},
模块:{
规则:[
{
测试:/\.ts$/,,
使用:[{loader:'ts loader',选项:{transpileOnly:true}}],
},
{
测试:/(\.md\.map)$/,
加载器:“空加载器”,
},
],
},
};
发生时的函数:

createMqttClient():MqttClient{
返回mqtt.connect(this.mqttOptions.url,{…this.mqttOptions.options});
}
url类似于:
ssl://url-to-our-mqtt


有人能帮忙吗?

我也遇到了同样的问题。 我的问题是我用了

 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加载程序规则可能会解决您的问题。

我也遇到了同样的问题。 我的问题是我用了

 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加载程序规则可能会解决您的问题。

我在Amazon aws iot设备sdk js和Microsoft azure iot设备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()配置为使用shebang加载程序()

TL;博士

安装shebang装载机

npm install shebang-loader --save
在webpack.config.js中使用加载程序

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

我对Amazon aws物联网设备sdk js和Microsoft azure物联网设备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()配置为使用shebang加载程序()

TL;博士

安装shebang装载机

npm install shebang-loader --save
在webpack.config.js中使用加载程序

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

我认为第一步是检查WS在生成的包中是否实际可用。如果不是,您知道您正面临一个生成问题,由于某种原因,该模块被排除在生成之外。请尝试在不缩小的情况下运行webpack。就像在开发模式中一样。如果可行,问题就出在网页包的缩小上。这就是它崩溃的原因。在这里阅读更多@Grynets,它运行时没有缩小。如果将其缩小,我无法跟踪此问题。能否请您说明如何以及在何处导入
ws
?我认为第一步是检查生成的捆绑包中是否确实存在ws。如果不是,您知道您正面临一个生成问题,由于某种原因,该模块被排除在生成之外。请尝试在不缩小的情况下运行webpack。就像在开发模式中一样。如果可行,问题就出在网页包的缩小上。这就是它崩溃的原因。在这里阅读更多@Grynets,它运行时没有缩小。如果将其缩小,我无法跟踪此问题。请说明如何以及在何处导入
ws