Apollo-link: zen-observable import๋Š” ๋ณ€ํ™˜๋  ๋•Œ apollo-client์—์„œ ์ฟผ๋ฆฌ๋ฅผ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2017๋…„ 11์›” 15์ผ  ยท  34์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: apollographql/apollo-link

Apollo Link์— ๋ฌธ์ œ๋ฅผ ์ œ์ถœํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๋ฌธ์ œ๊ฐ€ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ ์ •๋ณด๋ฅผ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ ์š”์ฒญ์„ ์ œ์ถœํ•˜๋Š” ๊ฒฝ์šฐ ์•„๋ž˜ ๊ฐœ์š”๋ฅผ ๋”ฐ๋ฅผ ํ•„์š”๋Š” ์—†์ง€๋งŒ ์ œ๋ชฉ์— "๊ธฐ๋Šฅ ์•„์ด๋””์–ด"๋ฅผ ํฌํ•จํ•˜๊ณ  ํ•ด๋‹น ๊ธฐ๋Šฅ์ด ์œ ์šฉํ•  ๊ตฌ์ฒด์ ์ธ ์˜ˆ๋ฅผ ํฌํ•จํ•˜์‹ญ์‹œ์˜ค.

์•ˆ๋…•ํ•˜์„ธ์š”!

Apollo Client, Apollo Link, babel ๋ฐ webpack์œผ๋กœ ์ƒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋งค์šฐ ๊ฐ„๋‹จํ•œ ํ”„๋กœ์ ํŠธ ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜์—ฌ Apollo Client์—์„œ ๋ฌธ์„œํ™”๋œ ์ œ์•ˆ์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์‹คํ–‰ํ•˜๊ณ  ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋‚ด๋ฉด ๋Ÿฐํƒ€์ž„ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ์ฟผ๋ฆฌ๋ฅผ ์ง„ํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. zen-observable ํŒจํ‚ค์ง€๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์„ ์ถ”์ ํ–ˆ์Šต๋‹ˆ๋‹ค.

์˜๋„ํ•œ ๊ฒฐ๊ณผ:

Apollo ํด๋ผ์ด์–ธํŠธ๋Š” ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Apollo Link๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฟผ๋ฆฌ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

import { ApolloClient } from "apollo-client"
import { HttpLink } from "apollo-link-http"
import { InMemoryCache } from "apollo-cache-inmemory"
import { gql } from "graphql-tag"

const graphqlClient = new ApolloClient({
        link: new HttpLink(),
        cache: new InMemoryCache(),
})
graphqlClient.query({ query: gql`query { counter { count } }` })
        .then(console.log)
        .catch(console.error)

์‹ค์ œ ๊ฒฐ๊ณผ:

Apollo ํด๋ผ์ด์–ธํŠธ์—์„œ ๋‹ค์Œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

TypeError: _super.call is not a function
Stack trace:
ObservableQuery@webpack-internal:///16:56:21
QueryManager</QueryManager.prototype.watchQuery@webpack-internal:///94:404:16
QueryManager</QueryManager.prototype.query/resPromise<@webpack-internal:///94:431:20
QueryManager</QueryManager.prototype.query@webpack-internal:///94:429:26
ApolloClient</ApolloClient.prototype.query@webpack-internal:///93:102:16
@webpack-internal:///59:14:1
[59]<strong i="19">@http</strong>://host/assets/client.js:16:1
__webpack_require__<strong i="20">@http</strong>://host/assets/manifest.js:713:12
fn<strong i="21">@http</strong>://host/assets/manifest.js:118:20
[49]<strong i="22">@http</strong>://host/assets/client.js:7:18
__webpack_require__<strong i="23">@http</strong>://host/assets/manifest.js:713:12
webpackJsonpCallback<strong i="24">@http</strong>://host/assets/manifest.js:26:23
<strong i="25">@http</strong>://host/assets/client.js:1:1

ObservableQuery ๋Š” zen-observable ํŒจํ‚ค์ง€์—์„œ ๊ฐ€์ ธ์˜ค๋Š” Apollo Link ํ”„๋กœ์ ํŠธ์—์„œ Observable ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. JavaScript๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ apollo-link ํŒจํ‚ค์ง€๋Š” lib/index.js .

import * as Observable from 'zen-observable';
export { Observable };

์ด๋กœ ์ธํ•ด ์ด Observable์„ ํŠธ๋žœ์ŠคํŒŒ์ผํ•˜๊ณ  ๋‚˜์ค‘์— ์„œ๋ธŒํด๋ž˜์‹ฑํ•  ๋•Œ ์ด์ƒํ•œ ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ ๊ฐ™์ง€๋งŒ ์—ฌ๊ธฐ์—์„œ call ๋ฉ”์„œ๋“œ๋ฅผ ๋” ์ด์ƒ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•:

์ด ๋ฌธ์ œ๋ฅผ ์ž…์ฆํ•ด์•ผ ํ•˜๋Š” ํ…Œ์ŠคํŠธ ํ”„๋กœ์ ํŠธ๊ฐ€ ์ฒจ๋ถ€๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. Yarn๊ณผ ํ•จ๊ป˜ ์„ค์น˜๋œ Node.js v6 ๋˜๋Š” v8์„ ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ํ”„๋กœ์ ํŠธ

  1. ์••์ถ•์„ ํ’€๊ณ  ํ…Œ์ŠคํŠธ ํ”„๋กœ์ ํŠธ์— cd
  2. yarn install
  3. yarn run start ๋ฅผ ์—ด๊ณ  http://localhost :3000/์„ ์—ฝ๋‹ˆ๋‹ค
  4. ์ฝ˜์†”์— ์œ„์— ํ‘œ์‹œ๋œ ์˜ค๋ฅ˜๊ฐ€ ํ‘œ์‹œ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์—์„œ node_modules/apollo-link/lib/index.js:3 ๋ฅผ ๋ณ€๊ฒฝํ•˜์—ฌ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

import * as Observable from 'zen-observable';

์—๊ฒŒ:

import Observable from 'zen-observable';

๋ฌธ์ œ๋Š” ํ•ด๋‹น .ts ํŒŒ์ผ์—์„œ ์ด ๋ณ€๊ฒฝ์„ ์ˆ˜ํ–‰ํ•˜๋ฉด Linting ์‹คํŒจ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์ตœ์„ ์˜ ๋ฐฉ๋ฒ•์ด ํ™•์‹คํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์ด ๋ฌธ์ œ๋ฅผ ๊ฒช๊ณ  ์žˆ์Œ์„ ๋‚˜ํƒ€๋‚ด๋Š” StackOverflow์— ์ด ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹œ๊ฐ„ ๋‚ด์ฃผ์…”์„œ ์ œ ๋ฒ„๊ทธ ๋ฆฌํฌํŠธ๋ฅผ ๋ด์ฃผ์‹œ๊ณ  Apollo์— ๋Œ€ํ•œ ๋ฉ‹์ง„ ์ž‘์—…์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋„ˆ๋ฌด ํž˜๋“ค์–ด์„œ ๋‹ค์Œ ํ•ดํ‚น์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ๋ฐ–์— ์—†์Šต๋‹ˆ๋‹ค...

์›นํŒฉ.config.js

      {
        test: /node_modules\/apollo-link.*?\/lib\/.*?.js/,
        loader: 'string-replace-loader',
        options: {
          search: 'exports.Observable = Observable',
          replace: 'exports.Observable = Observable.default'
        }
      },

์ด ํ•ดํ‚น์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋„๋ก ์—ฌ๊ธฐ์—์„œ ๋„์›€์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์ถ”์‹  ์ €๋Š” TypeScript๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  babel๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋‚˜์—๊ฒŒ ๊นจ์ง„ ์ด์œ ์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  34 ๋Œ“๊ธ€

๋‚˜๋Š” ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์ง€๋งŒ ๋‹ค๋ฅธ ์˜ค๋ฅ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ์ฝ”๋“œ๊ฐ€ ์—ฌ๊ธฐ์— ์žˆ์Šต๋‹ˆ๋‹ค.

import 'isomorphic-fetch'
import { ApolloLink } from 'apollo-link'
import { ApolloClient } from 'apollo-client'
import { HttpLink } from 'apollo-link-http'
import { InMemoryCache } from 'apollo-cache-inmemory'

export default new ApolloClient({
  link: new HttpLink({ uri: 'http://localhost:5000/api/graphql' }),
  cache: new InMemoryCache()
})
Uncaught (in promise) TypeError: _apolloLink.Observable is not a constructor
    at HttpLink.eval [as request] (httpLink.js:98)
    at eval (link.js:60)
    at ApolloLink.eval [as request] (ApolloClient.js:30)
    at ApolloLink.eval [as request] (link.js:59)
    at execute (link.js:94)
    at eval (QueryManager.js:134)
    at new Promise (<anonymous>)
    at QueryManager.mutate (QueryManager.js:129)
    at ApolloClient.mutate (ApolloClient.js:109)
    at Header.componentDidMount (index.js:53)

๋‚˜๋Š”์ด ์ž‘์—…์„ ์‹œ๋„ํ–ˆ๊ณ  @stevestreza ์˜ ๊ฒƒ๊ณผ ๋™์ผํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

```js
'๋™ํ˜• ๊ฐ€์ ธ์˜ค๊ธฐ' ๊ฐ€์ ธ์˜ค๊ธฐ
'apollo-link'์—์„œ apolloLink๋กœ * ๊ฐ€์ ธ์˜ค๊ธฐ
'zen-observable'์—์„œ Observable ๊ฐ€์ ธ์˜ค๊ธฐ
apolloLink.Observable = ๊ด€์ฐฐ ๊ฐ€๋Šฅ
````

@stevestreza @mizchi ์–ด๋–ค ๋ฒ„์ „์˜ apollo-client์™€ apollo-link๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

์—ฌ๊ธฐ ๊ฐ™์€ ๋ฌธ์ œ [email protected] ์›นํŒฉ ํ”„๋กœ์ ํŠธ๋Š” ์ œ๊ฑฐํ•˜์—ฌ ๊ณ ์ • ๋œ * as import ๋ฌธ์—, @stevestreza ์ง€์ ํ•œ๋‹ค.

๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์—ฌ๊ธฐ์— ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ๋„ ๋™์ผํ•˜๋ฉฐ SO์— ์ž‘์„ฑ๋œ Webpack ๋‚ด ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ Apollo ๋ฐ/๋˜๋Š” TypeScript์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Œ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์•„๋Š” ์ด์œ ๋Š” Webpack ๋Œ€์‹  Rollup์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฒˆ๋“ค์„ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด TypeScript + Rollup ๋ฒ„๊ทธ๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์ด๊ฒƒ์ด ์šฐ๋ฆฌ ์ž์‹ ์˜ Rollup ๋นŒ๋“œ์—์„œ ๋‚˜ํƒ€๋‚˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์— ๋†€๋ž์Šต๋‹ˆ๋‹ค. ์œ„์— ์ œ์•ˆ๋œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋งŒ๋“œ๋Š” ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ์—ฌ๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋กค์—…๊ณผ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋„ Typescript๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

TS๊ฐ€ ์™„์ „ํžˆ ๋งํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๋ฅผ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋“ˆ์„ ๋นŒ๋“œํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ TS ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”, ์ฃ„์†กํ•˜์ง€๋งŒ ์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜๋Š” ๋™์•ˆ ํ•ซํ”ฝ์Šค๊ฐ€ ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋งˆ์ง€๋ง‰ ์•ˆ์ • ๋ฒ„์ „์ด ๋ฌด์—‡์ธ์ง€ ์•„์‹ญ๋‹ˆ๊นŒ?

์ง€๊ธˆ๊นŒ์ง€์˜ ์กฐ์‚ฌ์—์„œ ์ด ๋ฌธ์ œ๋Š” create-react-app ์™ธ๋ถ€์—์„œ๋งŒ ๋ฐœ์ƒํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด _super.call is not a function ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๋Š” ๋ฌธ์„œํ™”๋˜์ง€ ์•Š์€ create-react-app ๋‚ด๋ถ€์— ์•”์‹œ์ ์ธ ๊ฐ€์ •์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐฉ๊ธˆ ์ƒˆ ํ”„๋กœ์ ํŠธ์˜ ๋ฌธ์„œ๋ฅผ ๋”ฐ๋ž๋Š”๋ฐ ์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” Apollo๋ฅผ ๊ณ„์†ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ๋‚ด ๋‹ค๋ฅธ ๋ฌธ์ œ๋ฅผ ์—ฐ๊ฒฐ: https://github.com/apollographql/apollo-client/issues/2785#issuecomment -354169337 ์ œ์•ˆ๋œ ์ˆ˜์ • ์‚ฌํ•ญ์ด ์žˆ๋Š” ๊ณณ(ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์Œ)

์ด๊ฒƒ์ด ๊ด€๋ จ์ด ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ...

์•„์ฃผ ๊ฐ„๋‹จํ•œ ๋ฐ˜์‘ ์•ฑ์„ ์œ„ํ•œ ๋ฒˆ๋“ค์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๋กค์—…์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ apollo-client๋ฅผ ํ˜ผํ•ฉ์— ๋„์ž…ํ•˜๋ ค๊ณ  ํ•  ๋•Œ๊นŒ์ง€ ๋ชจ๋“  ๊ฒƒ์ด ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ๋ฌธ์„œ: https://www.apollographql.com/docs/react/basics/setup.html#installation

๋กค์—…์œผ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œํ•˜๋ ค๊ณ  ์‹œ๋„ํ•œ ํ›„ ๋นŒ๋“œ ์ค‘์— ๋‹ค์Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

of is not exported by node_modules/zen-observable/index.js
47:         return new ApolloLink(function (operation, forward) {
48:             return (firstLink.request(operation, function (op) {
49:                 return nextLink.request(op, forward) || Observable.of();
                                                                       ^
50:             }) || Observable.of());
51:         });
node_modules/apollo-link/lib/link.js
of is not exported by node_modules/zen-observable/index.js
48:             return (firstLink.request(operation, function (op) {
49:                 return nextLink.request(op, forward) || Observable.of();
50:             }) || Observable.of());
                                 ^
51:         });
52:     }
node_modules/apollo-link/lib/link.js
of is not exported by node_modules/zen-observable/index.js
74: export { ApolloLink };
75: export function execute(link, operation) {
76:     return (link.request(createOperation(operation.context, transformOperation(validateOperation(operation)))) || Observable.of());
                                                                                                                                 ^
77: }

์œ„์˜ ๊ด€๋ จ ๋ฌธ์ œ์—์„œ ์ œ์•ˆํ•œ ๋Œ€๋กœ node_modules/apollo-link/lib/link.js ์˜ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ import Observable from 'zen-observable'; ๋กœ ๋ณ€๊ฒฝํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ƒ๋‹นํžˆ ๋‹ค๋ฅธ zen-observable ๋ฌธ์ œ์— ์ง๋ฉดํ•ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ด์ฃผ์„ธ์š”
https://github.com/apollographql/apollo-link/issues/389
๋‚ด๊ฐ€ ์ž˜๋ชปํ•˜๊ณ  ์žˆ๋Š”์ง€ ์ œ์•ˆํ•˜์‹ญ์‹œ์˜ค.

๋„ˆ๋ฌด ํž˜๋“ค์–ด์„œ ๋‹ค์Œ ํ•ดํ‚น์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ๋ฐ–์— ์—†์Šต๋‹ˆ๋‹ค...

์›นํŒฉ.config.js

      {
        test: /node_modules\/apollo-link.*?\/lib\/.*?.js/,
        loader: 'string-replace-loader',
        options: {
          search: 'exports.Observable = Observable',
          replace: 'exports.Observable = Observable.default'
        }
      },

์ด ํ•ดํ‚น์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋„๋ก ์—ฌ๊ธฐ์—์„œ ๋„์›€์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์ถ”์‹  ์ €๋Š” TypeScript๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  babel๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋‚˜์—๊ฒŒ ๊นจ์ง„ ์ด์œ ์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

typescript ์—†์ด๋„ ๋™์ผํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ์Œ์„ ๋ณด์ฆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

import * as Observable from 'zen-observable';
์—๊ฒŒ:
import Observable from 'zen-observable';

๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ

์  ์žฅ @kinyat ์›นํŒฉ์œผ๋กœ ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ „ํ˜€ ๋ชฐ๋ž์Šต๋‹ˆ๋‹ค. ํ‹ธ!!! ๊ฐ์‚ฌ ํ•ด์š”!!!

react-apollo ๋ฐ parcel-bundler ๊ฐ€ ์žˆ๋Š” ๊ธฐ๋ณธ Hello World ์•ฑ์˜ ๋™์ผํ•œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ๋ฒ•์  ํ•ด๊ฒฐ์ฑ…์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@alapini ๋‚ด ์ƒ๊ฐ์— "ํ•ฉ๋ฒ•์ ์ธ" ์†”๋ฃจ์…˜ ์ค‘ ํ•˜๋‚˜๋Š” Apollo๊ฐ€ non-typescript ์‚ฌ์šฉ์ž(์˜ˆ: Babel)์—๊ฒŒ ts ์ปดํŒŒ์ผ๋Ÿฌ์˜ ES5 ๋ฒ„์ „์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

vuex-orm-apollo ํ”Œ๋Ÿฌ๊ทธ์ธ์— apollo๋ฅผ ์‚ฌ์šฉ ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ node_modules ๋‚ด์—์„œ ํŒŒ์ผ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์€ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์˜ต์…˜์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ณง ๋ฒ„๊ทธ ์ˆ˜์ •์ด ์ •๋ง ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค! :)

์ตœ์‹  ๋ฒ„์ „์˜ typescript๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์ผ๋ฐ˜ es ๋ชจ๋“ˆ ๊ตฌ๋ฌธ์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ Apollo๊ฐ€ typescript ๋ฒ„์ „์„ ์—…๊ทธ๋ ˆ์ด๋“œํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋ฉด TS ์‚ฌ์šฉ์ž๊ฐ€ ์•„๋‹Œ ์šฐ๋ฆฌ๋ฅผ ์œ„ํ•ด ์ฆ‰์‹œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ๋‚˜์—ด๋œ ๊ฒƒ๊ณผ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์•„ํด๋กœ๋ฅผ ์ฒ˜์Œ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์—ฐ๊ฒฐํ•˜๊ณ  ์žˆ๋Š”์ง€ 100% ํ™•์‹ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ธํŽ˜๋ฅด๋…ธ์™€ ํ•จ๊ป˜ ํƒ€์ดํ”„์Šคํฌ๋ฆฝํŠธ ์—†์ด ๋กค์—…์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

The 'this' keyword is equivalent to 'undefined' at the top level of an ES module, and has been rewritten
The 'this' keyword is equivalent to 'undefined' at the top level of an ES module, and has been rewritten
The 'this' keyword is equivalent to 'undefined' at the top level of an ES module, and has been rewritten

'of' is not exported by 'node_modules/zen-observable/index.js'
'of' is not exported by 'node_modules/zen-observable/index.js'
'of' is not exported by 'node_modules/zen-observable/index.js'

(node:37350) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: 'print' is not exported by node_modules/graphql/language/printer.js
(node:37350) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code

Parcel.js๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์˜ ๊ฒฝ์šฐ ์ด PR์ด ๋ฌธ์ œ๋ฅผ ์ž„์‹œ๋กœ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. https://github.com/parcel-bundler/parcel/pull/530

์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ๋„ˆ๋ฌด ๊นŠ์ด ํŒŒ๊ณ  ๋“ค์ง€ ๋Š” ์—ฌ๊ธฐ ์—์„œ ์–ธ๊ธ‰ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ฌธ์ œ์˜ ํ•ต์‹ฌ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค .

Babel์˜ ํ˜„์žฌ ๋™์ž‘์€ ์™„์ „ํžˆ ์ •ํ™•ํ•˜๋ฉฐ ES6 ์‚ฌ์–‘์„ ์กด์ค‘ํ•ฉ๋‹ˆ๋‹ค. ์™€์ผ๋“œ์นด๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋ณธ ๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์€ ๋ถˆ๋ฒ•์ด๋ฏ€๋กœ ์—ฌ๊ธฐ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜๋Š” ํ•ฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์‚ฌ๋žŒ๋“ค( #418 )๊ณผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(antd, @blueprintjs/core ๋“ฑ)๋Š” ์—ฌ์ „ํžˆ ์ด์— ์˜์กดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์•„์ด๋””์–ด๋Š” ์ด๊ตญ์ ์ธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ๋Œ€ํ•œ ์‚ฌ์–‘์„ ์™„ํ™”ํ•˜์—ฌ ๋” ๊ด€๋Œ€ํ•ด์ง€๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ @stevestreza๊ฐ€ ๊ฒŒ์‹œํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•( * as ์ œ๊ฑฐ)์ด apollo-link์— ๋Œ€ํ•œ ํ•ฉ๋ฒ•์ ์ธ ์ˆ˜์ •์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Fwiw, ๋‚˜๋Š” _apolloLink.Observable is not a constructor ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๊ณ  ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ parcel.js PR์„ ์‚ฌ์šฉํ•˜๋ฉด ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค(๋˜๋Š” apollo-client/issues/2785์— ์–ธ๊ธ‰๋œ ๋Œ€๋กœ parcel.js 1.2.1๋กœ ๋˜๋Œ๋ฆฌ๊ธฐ).

Vuejs ํ”„๋กœ์ ํŠธ์—์„œ Rollup์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด ๋ฌธ์ œ๋„ ๊ฒช๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@tadas412 ๊ณต์œ  ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค

์œ„์˜ PR์€ 1.2.0์— ๊ฒŒ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์œผ๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”!

์—ฌ์ „ํžˆ 1.2.0์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค ๐Ÿ˜ข

TypeError: _super.call is not a function
    at new ObservableQuery
    at QueryManager.watchQuery 
    at eval 
    at new Promise 
    at QueryManager.query 
    at ApolloClient.query
    at VueComponent.created

์ด๊ฒƒ์€ apollographql/apollo-client/issues/2785์—์„œ๋„ ์ถ”์ ๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‚˜๋ฅผ ์œ„ํ•ด, ๊ทธ๊ฒƒ์€ 1.2.0์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

@littletower ์–ด๋ฆฌ์„๊ฒŒ ๋“ค๋ฆด์ง€ ๋ชจ๋ฅด์ง€๋งŒ 1.2.0์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? node_modules ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์‚ญ์ œํ•˜๊ณ  ํŒจํ‚ค์ง€๋ฅผ ๋‹ค์‹œ ์„ค์น˜ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ƒฅ ๋ฌผ์–ด ๋ณด๋Š” ๊ฑด๋ฐ :)

@phortx ๋„ค ์ด๋ฏธ
๊ตฌ๋…์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๋ง๋ถ™์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

@littletower ์ด์ƒ apollo-client ์—๋Š” apollo-link ์— ๋Œ€ํ•œ ์ข…์†์„ฑ์ด ์žˆ์œผ๋ฏ€๋กœ ์ข…์†์„ฑ์ด ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์•˜์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์žฌ์ƒ์‚ฐ ์ €์žฅ์†Œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์‹ค์ œ ์ฝ”๋“œ ์ˆ˜์ค€ ๋ฌธ์ œ๋ฅผ ํ™•์‹คํžˆ ์ˆ˜์ •ํ–ˆ์ง€๋งŒ yarn ์ด ์ถฉ๋Œ์„ ์ผ์œผํ‚ค๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

  • npm install ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ข…์†์„ฑ์„ ์„ค์น˜ํ•˜๋ฉด apollo-client ๋ณ€๊ฒฝ ์—†์ด apollo-link 1.2.0 ์„ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ›Œ๋ฅญํ•˜๊ฒŒ ์ž‘๋™ํ•˜๋ฉฐ ๋ณด๊ณ ๋œ ๋ฌธ์ œ๋Š” ๋” ์ด์ƒ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. (์ˆ˜๋™์œผ๋กœ ์„ค์น˜ํ•ด์•ผ graphql-tag ํ•˜๊ณ ์žˆ๋Š” ๊ฐ€์ ธ ์˜ค๊ธฐ์— ๊ด„ํ˜ธ๋ฅผ ์ œ๊ฑฐ src/client/index.js ์ด๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด)
  • yarn install ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด apollo-link 1.0.0 ๋ฒ„์ „์ด ์„ค์น˜๋ฉ๋‹ˆ๋‹ค. 1.2.0์„ ๋ช…์‹œ์ ์œผ๋กœ yarn add apollo-link ์„ค์น˜ํ•˜๋ฉด node_modules/apollo-link ๋ฒ„์ „์€ 1.2.0์ด ๋˜์ง€๋งŒ apollo-link 1.0.0์˜ ๋‹ค๋ฅธ ๋ฒ„์ „์€ node_modules/apollo-client/node_modules/apollo-link .

์ด ์‹œ์ ์—์„œ ์›์‚ฌ๊ฐ€ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ง€์‹์ด ์—†์Šต๋‹ˆ๋‹ค(1.0.0์ด ์•„๋‹ˆ๋ผ apollo-link 1.2.0์„ ์„ค์น˜ํ–ˆ์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค). "์˜ฌ๋ฐ”๋ฅธ"์ˆ˜์ •์€ apollo-link ์— ๋Œ€ํ•œ package.json์— apollo-client apollo-link 1.2.0์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. apollographql/apollo-client#2785์— ๋ฉ”๋ชจ๋ฅผ ๋‚จ๊น๋‹ˆ๋‹ค.

์–ด๋Š ์ชฝ์ด๋“ , ์ด๊ฒƒ์€ ์—ฌ๊ธฐ์—์„œ ์™„์ „ํžˆ ํ•ด๊ฒฐ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค!

@evans ์žฌ์ƒ์‚ฐ์„ ์œ„ํ•ด repo๋ฅผ ๋งŒ๋“ค์—ˆ๊ณ  ๋ฌด์—‡์„ ์ถ”์ธกํ•ฉ๋‹ˆ๊นŒ? ๋‚˜๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์ง€๋งŒ ์›๋ž˜ ์ฝ”๋“œ์—์„œ๋Š” ์—ฌ์ „ํžˆ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค... ๋” ์กฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ํ”ผ๋“œ๋ฐฑ์„ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

Polymer 3 ํ”„๋กœ์ ํŠธ์™€ apollo-boost ์—์„œ ๋™์ผํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

import { HttpLink } from 'apollo-link-http';

์›์ธ

Uncaught SyntaxError: The requested module '../../zen-observable/index.js'
                      does not provide an export named 'default'

@heruan ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์œผ์…จ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ๊ฐ™์€ ๋ฌธ์ œ์— ์ง๋ฉดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰