如何使用 Webpack 的热重载更新 Apollo 服务器上的模式?

Posted

技术标签:

【中文标题】如何使用 Webpack 的热重载更新 Apollo 服务器上的模式?【英文标题】:How to update schema on Apollo Server using Webpack's Hot Reload? 【发布时间】:2019-08-12 22:53:15 【问题描述】:

我看到了:

[HMR] Updated modules:
[HMR]  - ./src/resolvers.js
[HMR] Update applied.

但没有任何更新。我已经尝试了一些我在网上找到的关于 webpack 的 output.publicPath 的其他解决方案。我不知道还能做什么,很快我就要投入生产了。重启服务器不是我的选择。

我的代码:

import express from 'express'
import  execute, subscribe  from 'graphql';
import  ApolloServer  from 'apollo-server-express'

import schema from './schema';


import typeDefs from './typeDefs'
import resolvers from './resolvers'

import getUserByToken from './getUserByToken';


const app = express();

const path = '/graphql';

const server = new ApolloServer( typeDefs, resolvers, );

server.applyMiddleware( app );

server.listen(8081, () => 
  console.log(`???? Server ready at http://localhost:$PORT$server.graphqlPath`)
  console.log(`???? Subscriptions ready at ws://localhost:$PORT$server.subscriptionsPath`)
)



let currentApp = app

if (module.hot) 
    module.hot.accept(['./index', './resolvers'], () => 
        server.removeListener('request', currentApp);
        server.on('request', app);
        currentApp = app;
    );

谢谢!

【问题讨论】:

【参考方案1】:

您可以通过将 promise 传递给 hot.module.data 来解决此问题,然后在新的重新加载时等待它。

import  server  from "./server";

async function startServer() 
  if (module.hot?.data?.oldServer) await module.hot.data.oldServer;
  const  url  = await server.listen();
  console.log(`Server ready at $url. `);


startServer();

if (module.hot) 
  module.hot.accept();
  module.hot.dispose((data) => 
    data.oldServer = server.stop();
  );


【讨论】:

以上是关于如何使用 Webpack 的热重载更新 Apollo 服务器上的模式?的主要内容,如果未能解决你的问题,请参考以下文章

如何检测 Flutter App 代码中的热重载?

基于 Bash 的热重载实现

Webpack 5 实时重载

Webpack第五天

不使用 Blazor WebAssembly 托管的 CSS 的热重载

webpack总结