Socket.io: 无法解析“uws”、更新 README 或“package.json”?

创建于 2018-05-17  ·  20评论  ·  资料来源: socketio/socket.io

注意:对于支持问题,请使用以下渠道之一: stackoverflowslack

你想要:

  • [x] 报告错误
  • [ ] 请求功能

当前行为

我从 socket.io 的 master 分支下载了示例项目webpack-build-server ,运行npm install来安装依赖项,最后运行npm run build来尝试捆绑服务器,但是 webpack 给了我以下错误:

ERROR in ./~/engine.io/lib/server.js Module not found: Error: Can't resolve 'uws' in '/Users/ZehuaChen/Downloads/socket.io-master/examples/webpack-build-server/node_modules/engine.io/lib' @ ./~/engine.io/lib/server.js 107:27-41 @ ./~/engine.io/lib/engine.io.js @ ./~/socket.io/lib/index.js @ ./lib/index.js

重现步骤(如果当前行为是错误)

  1. 下载socket.io的master分支
  2. 转到examples/webpack-build-server ;
  3. 运行npm install ;
  4. 运行npm run build ;

注意:获得快速答案的最佳方法是提供失败的测试用例,例如通过分叉以下小提琴

预期行为

应在dist文件夹中生成 server.js 文件。

设置

  • 操作系统:macOS Hight SIerra
  • 浏览器:Safari
  • socket.io 版本:2.0.3

其他信息(例如堆栈跟踪、相关问题、如何修复的建议)

这些是我的终端上打印的内容

````

[email protected] build /Users/ZehuaChen/Downloads/socket.io-master/examples/webpack-build-server
webpack --config ./support/webpack.config.js

哈希:997a1fd1ee0b1b064485
版本:webpack 2.7.0
时间:468ms
资产大小块块名称
server.js 401 kB 0 [发出] [大] 主要
[0] ./~/debug/src/index.js 263 字节 {0} [内置]
[7] ./~/socket.io-parser/index.js 8.04 kB {0} [内置]
[16] ./~/engine.io/lib/socket.js 11.6 kB {0} [内置]
[17] ./~/engine.io/lib/transports/index.js 509 字节 {0} [内置]
[19] ./~/socket.io-parser/is-buffer.js 712 字节 {0} [内置]
[20] ./~/socket.io/lib/namespace.js 5.81 kB {0} [内置]
[31] ./~/socket.io/lib/index.js 12.9 kB {0} [内置]
[32] ./lib/index.js 474 字节 {0} [内置]
[43] ./~/engine.io/lib/engine.io.js 2.38 kB {0} [内置]
[44] ./~/engine.io/lib/server.js 15.1 kB {0} [内置]
[58] ./~/socket.io-adapter/index.js 5.44 kB {0} [内置]
[59] ./~/socket.io-client/package.json 3.19 kB {0} [内置]
[61] ./~/socket.io/lib 160 字节 {0} [内置]
[62] ./~/socket.io/lib/client.js 5.9 kB {0} [内置]
[63] ./~/socket.io/lib/parent-namespace.js 917 字节 {0} [内置]
+ 59 个隐藏模块

./~/ws/lib/Validation.js 中的警告
找不到模块:错误:无法解析“/Users/ZehuaChen/Downloads/socket.io-master/examples/webpack-build-server/node_modules/ws/lib”中的“utf-8-validate”
@ ./~/ws/lib/Validation.js 10:22-47
@ ./~/ws/lib/Receiver.js
@ ./~/ws/index.js
@ ./~/engine.io/lib/server.js
@ ./~/engine.io/lib/engine.io.js
@ ./~/socket.io/lib/index.js
@ ./lib/index.js

./~/ws/lib/BufferUtil.js 中的警告
找不到模块:错误:无法解析“/Users/ZehuaChen/Downloads/socket.io-master/examples/webpack-build-server/node_modules/ws/lib”中的“bufferutil”
@ ./~/ws/lib/BufferUtil.js 35:21-42
@ ./~/ws/lib/Receiver.js
@ ./~/ws/index.js
@ ./~/engine.io/lib/server.js
@ ./~/engine.io/lib/engine.io.js
@ ./~/socket.io/lib/index.js
@ ./lib/index.js

./~/socket.io/lib/index.js 中的警告
113:11-32 关键依赖:依赖的请求是一个表达式

./~/engine.io/lib/server.js 中的错误
找不到模块:错误:无法解析“/Users/ZehuaChen/Downloads/socket.io-master/examples/webpack-build-server/node_modules/engine.io/lib”中的“uws”
@ ./~/engine.io/lib/server.js 107:27-41
@ ./~/engine.io/lib/engine.io.js
@ ./~/socket.io/lib/index.js
@ ./lib/index.js

npm 错误! 代码生命周期
npm 错误! 错误号 2
npm 错误! [email protected]构建: webpack --config ./support/webpack.config.js
npm 错误! 退出状态 2
npm 错误!
npm 错误! 在[email protected]构建脚本中失败。
npm 错误! 这可能不是 npm 的问题。 上面可能有额外的日志输出。

npm 错误! 可以在以下位置找到此运行的完整日志:
npm 错误! /Users/ZehuaChen/.npm/_logs/2018-05-17T21_30_47_624Z-debug.log
````

更新

我手动安装uws包,它似乎工作。 有人可以更新 README 文件或 package.json,因为像我这样的初学者真的很难弄清楚这一点。

最有用的评论

所以我只是遇到了同样的问题,但原因却截然不同。 目前,当我从 npm 安装最新的 socket.io 服务器包时,将找不到 uws。

发生这种情况是因为 uws 的发布者最近上传了一个空包,删除了所有实际代码 D:

您可以通过安装最后一个未销毁的版本来解决此问题

纱线添加[email protected]
npm install [email protected]

链接到空/不推荐使用的包: https ://www.npmjs.com/package/uws

来自 reddit 的富有洞察力的背景信息: https ://www.reddit.com/r/node/comments/91kgte/uws_has_been_deprecated/

我将在搜索此问题时出现的前几个结果中发布此内容,因为我花了一段时间才弄清楚发生了什么,希望这可以节省一些时间!

所有20条评论

我也收到同样的警告:

WARNING in ./~/ws/lib/BufferUtil.js
Module not found: Error: Can't resolve 'bufferutil' in '/Users/Ian/Code/ianpaschal/forge-server/node_modules/ws/lib'
 @ ./~/ws/lib/BufferUtil.js 35:21-42
 @ ./~/ws/lib/Sender.js
 @ ./~/ws/index.js
 @ ./~/engine.io/lib/server.js
 @ ./~/engine.io/lib/engine.io.js
 @ ./~/socket.io/lib/index.js
 @ ./src/server.js

WARNING in ./~/ws/lib/Validation.js
Module not found: Error: Can't resolve 'utf-8-validate' in '/Users/Ian/Code/ianpaschal/forge-server/node_modules/ws/lib'
 @ ./~/ws/lib/Validation.js 10:22-47
 @ ./~/ws/lib/Receiver.js
 @ ./~/ws/index.js
 @ ./~/engine.io/lib/server.js
 @ ./~/engine.io/lib/engine.io.js
 @ ./~/socket.io/lib/index.js
 @ ./src/server.js

WARNING in ./~/socket.io/lib/index.js
113:11-32 Critical dependency: the request of a dependency is an expression
// package.json
"webpack": "^2.7.0",
"socket.io": "^2.1.0",

你设法解决了吗? 有同样的问题。。

没有。 这只是一个警告,所以除了丑陋的控制台输出之外没有任何影响,但它仍然存在。

它不会阻止你npm start ,只是忽略错误。

如果你只为node编译,你应该添加选项然后错误就会消失。
您应该添加到您的配置文件:

{
        ...
        target: 'node'
       ...
}

否则,您只为web进行编译,则不需要传递任何选项 (default='web') (或 target='web'),但您应该将 'uws' 排除在捆绑之外,因为它在浏览器。
在这种情况下,您应该添加:

{
        ...
        externals: {
            uws: "uws"
        },
       ...
}

@pirix-gh 这似乎不是问题。

从我的配置:

const Webpack = require( "webpack" );

module.exports = {
    target: "node",
    node: {
        __dirname: true,
        __filename: true,
    },
    entry: {
        main: "./src/server.js",
    },
    plugins: [
        new Webpack.EnvironmentPlugin( [
            "NODE_ENV",
        ] ),
        new Webpack.IgnorePlugin( /uws/ )
    ],
};

@ianpaschal好的,那么也许您正在将一个项目导入另一个项目?

_项目_1_

  • Index.js:导入 _Socket.IO_

_项目_2_

  • Index.js:导入_Project_1_

Webpack:编译 Project_2
-> 在 Project_2 中找不到模块

这可能会发生,因为在 Project_2 中查找了依赖项,但 Project_1 持有它。
解决方案是像您一样安装缺少的依赖项。
或发布您的 Project_1,然后将其作为依赖项导入 Project_2。

通过这样做,我能够重现您在上面提供的错误

感谢您解释错误的原因,并提供替代方法!

@Zehua-Chen 很高兴,希望它能解决您的问题。 我知道一直发布是多么烦人,所以......对于这种拆分项目的情况,您可以在开发过程中使用:

npx @babel/node src/index.js
node -r @babel/register src/index.js

或取决于您的版本

npx babel-node src/index.js
node -r babel-register src/index.js

它将正确解决依赖关系并运行,但请记住它不适合生产。
如果你在生产中工作,你应该单独发布你的包并使用 npm 代替。

我现在做了很多研究,但仍然不明白这个问题以及如何解决它。
我有一个项目,使用 socket.io 并使用 webpack 构建总是失败并出现同样的问题。

ERROR in ./node_modules/engine.io/lib/server.js
Module not found: Error: Can't resolve 'uws' in 'xxxxxxxx/node_modules/engine.io/lib'
 @ ./node_modules/engine.io/lib/server.js 107:27-41
 @ ./node_modules/engine.io/lib/engine.io.js
 @ ./node_modules/socket.io/lib/index.js

包.json

"dependencies": {
      "express": "^4.16.3",
      "socket.io": "^2.1.1"
   },
   "devDependencies": {
      "tslint": "^5.11.0",
      "typescript": "2.9.2",
      "uglifyjs-webpack-plugin": "^1.2.7",
      "webpack": "^4.16.4",
      "webpack-cli": "^3.1.0"
   },

webpack.config.js

const path = require('path');
const UglifyJsPlugin = require('uglifyjs-webpack-plugin');

module.exports = {
   target: 'node',
   mode: 'development',
   entry: './dist/index.js',
   output: {
      filename: 'index.js',
      path: path.resolve(__dirname, 'dist/00-bundle')
   },
   optimization: {
      minimizer: [
         new UglifyJsPlugin()
      ]
   }
};

@btxtiger这是因为您在使用节点时不能捆绑您的依赖项(将与 package.json 一起安装)。 这是webpack 的默认行为,因为它为web捆绑了您的项目。

将此添加到您的 conf,它将通过阅读您的package.json排除您的依赖

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

module.exports = {
...
mode: 'development',
...
externals: [nodeExternals({
               modulesFromFile: true
          })];
...
}

这样,您将获得(几乎)一个可发布的包

@pirix-gh 谢谢! 好吧,这是有道理的。 我希望能够创建一个完整的包,只需将其推送到服务器,而无需通过 package.json 安装/更新模块。 我仍然不确定这是否真的不可能,除了 socket.io 的错误,它似乎可以工作。

@btxtiger您可以在本地执行此操作。 只是不要在 NPM 上发布它,因为它违反了依赖规则。
uws 是在使用npm i时动态编译的,因为它是一个包含在 Node.js 中的 C++ 模块
所以它不能像标准 js 那样捆绑,而是必须安装(这会触发你的操作系统的编译)。
这就是为什么你应该总是使用 NPM依赖系统,然后你就不必问自己这个问题了。

如果你还想这样做,尝试排除 uws:

{
        ...
        externals: {
            uws: "uws"
        },
       ...
}

@pirix-gh 太好了,非常感谢您的解释。 我搬到了一个优化的 package.json,它在使用 webpack 构建时排除了所有开发依赖项,并且总是在开始之前运行 npm install 。 似乎是目前最好的解决方案。

我没有时间完全调试它,但是当从karma^2.0.0升级到karma^3.0.0时,我在 webpack 构建中遇到了这个错误:

Module not found: Error: Can't resolve 'uws'

因此,将 Karma 保持在2.0.0是我的解决方案。

每当我导入或需要 socket.io 时,我都会遇到这个问题。 我已经尝试手动安装 uws 并且 Node 仍然无法解析 uws。

我也遇到了这个问题,不知道怎么解决。

Webpack / 前端人员,如果您只需要在您的客户端应用程序中使用 SocketIO 来连接到某个 WebSocket 服务器,您可以使用这个: https ://github.com/socketio/socket.io-client

解决了我的Module not found: Error: Can't resolve 'uws'问题!

所以我只是遇到了同样的问题,但原因却截然不同。 目前,当我从 npm 安装最新的 socket.io 服务器包时,将找不到 uws。

发生这种情况是因为 uws 的发布者最近上传了一个空包,删除了所有实际代码 D:

您可以通过安装最后一个未销毁的版本来解决此问题

纱线添加[email protected]
npm install [email protected]

链接到空/不推荐使用的包: https ://www.npmjs.com/package/uws

来自 reddit 的富有洞察力的背景信息: https ://www.reddit.com/r/node/comments/91kgte/uws_has_been_deprecated/

我将在搜索此问题时出现的前几个结果中发布此内容,因为我花了一段时间才弄清楚发生了什么,希望这可以节省一些时间!

对我来说,通过 CLI 或配置--target node是关键,它解决了我所有的问题。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

gCurtisCT picture gCurtisCT  ·  4评论

adammw picture adammw  ·  4评论

varHarrie picture varHarrie  ·  3评论

dmuth picture dmuth  ·  3评论

distracteddev picture distracteddev  ·  3评论