我正在玩继电器入门套件。我还使用sangria创建了一个 graphql 服务器。现在我正在尝试将两者连接在一起。
在 relay-starter-kit 中,每次更改架构时,都需要运行脚本来重新生成 schema.json 文件。但是由于 graphql 支持模式自省,我想知道是否有办法配置我的中继应用程序以在服务器启动时自省服务器的模式。
有谁知道这是否可能或解决了如何做到这一点?
定义一个 babelRelayPlugin.js(在验证客户端 graphql 查询时由 webpack 运行),如下所示:
var babelRelayPlugin = require('babel-relay-plugin');
var introspectionQuery = require('graphql/utilities').introspectionQuery;
var request = require('sync-request');
var url = 'http://localhost:3000/graphql';
var response = request('POST', url, {
qs: {
query: introspectionQuery
}
});
var schema = JSON.parse(response.body.toString('utf-8'));
module.exports = babelRelayPlugin(schema.data, {
abortOnError: true,
});
当然,将 url 变量更改为您用于开发的任何服务器 url。在 webpack 中,在您的 loader 定义中包含以下内容:
query: {stage: 0, plugins: ['./babelRelayPlugin']}
并指向上述 babelRelayPlugin.js 文件的位置。
看起来我们需要这样的东西(来自https://github.com/facebook/relay/blob/master/scripts/jest/updateSchema.js#L25):
import { buildASTSchema, introspectionQuery } from 'graphql/utilities';
var body = fs.readFileSync(inFile, 'utf8');
var ast = parseSchemaIntoAST(body);
var astSchema = buildASTSchema(ast, 'Root', 'Mutation');
graphql(astSchema, introspectionQuery).then(
function(result) {
var out = JSON.stringify(result, null, 2);
fs.writeFileSync(outFile, out);
});
Babel Relay 插件使用自省产品 (schema.json) 来验证和编译Relay.QL
表达式。幸运的是,getBabelRelayPlugin 方法接受自省产品或返回自省产品的函数。
然后应该可以在您的应用程序的构建系统(例如 Webpack)中执行类似的操作:
// Pseudocode
var SCHEMA_PATH = 'path/to/schema.js';
var introspectionProduct = introspectSchema(SCHEMA_PATH);
watch(SCHEMA_PATH, () => introspectionProduct = introspectSchema(SCHEMA_PATH));
var babelRelayPlugin = getBabelRelayPlugin(() => introspectionProduct);