如何使用 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 服务器上的模式?的主要内容,如果未能解决你的问题,请参考以下文章