Socket.IO 2.x 开始,引擎默认使用 uws,它是个 native module,导致了打包有问题。官方说 uws 引擎的性能会比 ws 要好。
所以解决方案有两种:
方案一(推荐)
报错主要因为缺少解析 native 模块的 loader。所以在 webpack config 中加入 native 的 loader 即可解决问题。
首先安装几个模块
1 2
| npm install --save uws@9.14.0 npm install --save-dev node-loader
|
在 webpack.config.js 中加入 node-loader
1 2 3 4 5 6 7 8 9
| module: { loaders: [ ... { test: /\.node$/, loader: 'node-loader' } ] }
|
方案二
把 uws 引擎替换为 ws 引擎:
1 2 3 4
| const io = require('socket.io')(myServer, { serveClient: true, wsEngine: 'ws' });
|
webpack.config.js 中忽略 uws 模块。如果不忽略,打包时会报错:
1 2 3 4 5 6 7 8
| [15:28:50] Starting 'dist'...
internal/streams/legacy.js:59 throw er; ^ Error: ./node_modules/engine.io/lib/server.js Module not found: Error: Can't resolve 'uws' in 'E:\projects\push\node_modules\engine.io\lib' resolve 'uws' in 'E:\projects\push\node_modules\engine.io\lib'
|
贴一个 webpack.config.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| const path = require("path"); const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
module.exports = { entry: { "index": "./src/index.ts", "index.min": "./src/index.ts", }, target: "node", resolve: { extensions: [".ts", ".tsx", ".js", ".jsx"] }, output: { path: path.join(__dirname, "/dist"), filename: "[name].js" }, module: { loaders: [ { test: /\.ts$/, loader: "ts-loader", } ] }, externals: { uws: "uws", }, plugins: [ new UglifyJsPlugin() ], node: { fs: "empty" } };
|