#webpack #socket.io #feathersjs
Вопрос:
У меня есть приложение feathersjs, которое использует socketio для транспортного протокола. На стороне моего клиента я использую webpack для связывания приложения, но у меня возникли проблемы с подключением клиента socketio к серверу. Я не уверен, что это проблема с Webpack, socketio или feathersjs.
Проблема в том, что при комплектации socketio с webpack клиент socket.io всегда отключается после 5000 мс. Но если я использую CDN-версию socketio, она отлично подключается.
// Timeout when imported in app.js
import io from 'socket.io-client';
// Connects fine when using a CDN in template.html
<script src="//unpkg.com/socket.io-client@^2.3.0/dist/socket.io.js"></script>
Я создал очень простой демонстрационный репозиторий, показывающий мою проблему:
https://github.com/jrj2211/feathers-socketio-issue
Если вы запустите его с помощью «npm start» и перейдете к «localhost:3030», при нажатии кнопки «Вход» появится ошибка «Превышен тайм-аут 5000 мс при вызове»Создать при аутентификации».
Входя в app/app.js файл и закомментируйте «импорт ввода-вывода из » socket.io-клиента»;» и перезапуск приложения покажет «успех».
Я проверил, что как CDN, так и npm версии socketio.client являются 2.3.
Исходя из этого, я полагаю, что это как-то связано с настройкой моего веб-пакета, но я не уверен, как это исправить.
Соответствующий код:
app.js
import feathers from '@feathersjs/client';
import io from 'socket.io-client';
import auth from '@feathersjs/authentication-client';
const app = feathers();
app.io = io();
app.configure(feathers.socketio(app.io));
app.configure(feathers.authentication());
export default {
client: app,
}
template.html
<html theme='light'>
<head>
<meta charset="utf-8">
<title>ZyPhox MRP</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<script type="module" src="https://unpkg.com/ionicons@5.5.2/dist/ionicons/ionicons.esm.js"></script>
<link rel="preconnect" href="https://fonts.gstatic.com">
<link href="https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,300;1,400amp;display=swap" rel="stylesheet">
<base href="/" target="_blank">
<script src="//unpkg.com/socket.io-client@^2.3.0/dist/socket.io.js"></script>
</head>
<body>
<div class='message'></div>
<input name='username' type='text' placeholder='Username'>
<input name='password' type='password' placeholder='Password'>
<input name='signin' type='submit' value='Signin'>
</body>
</html>
webpack.common.js
const webpack = require('webpack');
const path = require('path');
// Plugins
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const CopyPlugin = require('copy-webpack-plugin');
module.exports = {
mode: "development",
output: {
path: path.resolve(__dirname, 'public'),
filename: '[name].js',
},
entry: {
app: path.resolve(__dirname, 'app', 'index.js'),
},
plugins: [
new HtmlWebpackPlugin({
template: './app/template.html',
filename: 'index.html',
}),
],
module: {
rules: [
{
test: /.m?js/,
resolve: {
fullySpecified: false
}
},
{
test: /.css$/i,
use: ['style-loader', 'css-loader'],
},
{
test: /.jsx?$/,
exclude: /node_modules(/|\)(?!(@feathersjs|debug))/,
loader: 'babel-loader'
},
{
test: /.js$/,
enforce: 'pre',
use: ['source-map-loader'],
},
],
},
resolve: {
modules: [path.resolve(__dirname, './app/'), path.resolve('./node_modules')],
},
};
Ответ №1:
Вам необходимо убедиться, что socket.io-client
версия, которую вы установили (и сохранили package.json
), соответствует версии сервера. Для перьев 4 это должно быть ^2.3.0
(как вы использовали в CDN), для перьев 5 это должно быть ^3.0.0
или позже. Так как в сокете происходят критические изменения.io несоответствие версий приведет только к тайм-ауту.
Комментарии:
1. Я убедился, что версия в папке node_modules равна 2.3.0, и проверка различий в предварительно скомпилированной библиотеке в папке dist идентична версии в unpkg. Это происходит только при импорте через webpack, который истекает по времени, поэтому я предполагаю, что это должно быть связано с тем, как я настроил webpack. Я дважды начинал новые проекты, чтобы попытаться заставить это работать, и каждый раз у меня возникает эта проблема.