admin管理员组

文章数量:1331930

I have written a few apps using svelte and sapper and thought I would give sveltekit a go. All in all it works, but I am now running into the issue of registering a worker on ther server.

Basically I am trying to add socket.io to my app because I want to be able to send and receive data from the server. With sapper this wasn't really an issue because you had the server.js file where you could connect socket.io to the polka/express server. But I cannot find any equivalent in sveltekit and vite.

I experimented a bit and I can create a new socket.io server in a route, but that will lead to a bunch of new problems, such as it being on a separate port and causing cors issues.

So I am wondering is this possible with sveltekit and how do you get access to the underlying server?

I have written a few apps using svelte and sapper and thought I would give sveltekit a go. All in all it works, but I am now running into the issue of registering a worker on ther server.

Basically I am trying to add socket.io to my app because I want to be able to send and receive data from the server. With sapper this wasn't really an issue because you had the server.js file where you could connect socket.io to the polka/express server. But I cannot find any equivalent in sveltekit and vite.

I experimented a bit and I can create a new socket.io server in a route, but that will lead to a bunch of new problems, such as it being on a separate port and causing cors issues.

So I am wondering is this possible with sveltekit and how do you get access to the underlying server?

Share Improve this question asked May 5, 2021 at 19:49 munHungermunHunger 3,0017 gold badges42 silver badges73 bronze badges
Add a ment  | 

2 Answers 2

Reset to default 6

The @sveltejs/adapter-node also builds express/polka patible middleware which is exposed as build/middelwares.js which you can import into a custom /server.cjs:

const {
  assetsMiddleware,
  prerenderedMiddleware,
  kitMiddleware,
} = require("./build/middlewares.js");

... 

app.use(assetsMiddleware, prerenderedMiddleware, kitMiddleware);

The node adaptor also has an entryPoint option, which allows bundling the custom server into the build, but I ran into issues using this approach.

Adapters are not used during development (aka npx svelte-kit dev).

But using the svelte.config.js you're able to inject socket.io into the vite server:

  ...
  kit: {
    ...
    vite: {
      plugins: [
        {
          name: "sveltekit-socket-io",
          configureServer(server) {
            const io = new Server(server.httpServer);
            ...
          },
        },
      ],
    },
  },

Note: the dev server needs to be restarted to apply changes in the server code.
You could use entr to automate that.

You cannot connect to a polka/express server because depending on the adapter you choose there can be no polka/express server used - if you deploy to a serverless platform for example. Sockets for serverless are not so easy to implement and their implementation depend on the provider.

You are raising an important concern but right now I'm afraid this is not possible - someone corrects me if I'm wrong.

What you still can do is to write your front with SvelteKit, build it as a static/SPA/node application and then use your build from your own polka/express server. You lose the swift development experience offered by SvelteKit though, since your development will be parted in two: first the client, then the server.

EDIT

You can also use a data-pusher third service. They are straightforward to use but not necessarily free. Here is a list of data-pusher services from the Vercel page:

  • Ably
  • Pusher
  • PubNub
  • Firebase Realtime Database
  • TalkJS
  • SendBird
  • Supabase

本文标签: javascriptregistering socket IO to vite for sveltekitStack Overflow