Gatsby: ๋™์ ์—๋Š” img๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

์— ๋งŒ๋“  2017๋…„ 07์›” 17์ผ  ยท  3์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: gatsbyjs/gatsby

์•ˆ๋…•ํ•˜์„ธ์š”, ์ €๋Š” ๋ธ”๋กœ๊ทธ๋ฅผ ์ž‘์„ฑ ์ค‘์ด๋ฉฐ ๊ฒŒ์‹œ๋ฌผ ์ƒ‰์ธ์— ๋ชจ๋“  ๊ฒŒ์‹œ๋ฌผ์„ ๋‚˜์—ดํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ฐ ๊ฒŒ์‹œ๋ฌผ์—๋Š” ํ‘œ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
์•„๋ž˜๋Š” ๋‚ด ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

 {posts.map(post => {
            return <li key={post.node.fields.slug}>
              <Link to={post.node.fields.slug}>
                <img className="news-img" src={require(`../${post.node.frontmatter.cover.relativePath}`)} />
                <h3 className="news-titles">{post.node.frontmatter.title}</h3>
                <p className="news-desc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{post.node.excerpt}</p>
              </Link>
            </li>
          }
          )}

ํ•˜์ง€๋งŒ ๊ฒฝ๊ณ ๋ฅผ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.

 warning  in ./src/pages/md/new4/new4.md

Module parse failed: /Users/magicly/development/blog/gatsby-starter-blog/src/pages/md/new4/new4.md Assigning to rvalue (1:2)
You may need an appropriate loader to handle this file type.
SyntaxError: Assigning to rvalue (1:2)
    at Parser.pp$4.raise (/Users/magicly/development/blog/gatsby-starter-blog/node_modules/acorn/dist/acorn.js:2221:15)
    at Parser.pp$2.checkLVal (/Users/magicly/development/blog/gatsby-starter-blog/node_modules/acorn/dist/acorn.js:1509:12)
    at Parser.pp$3.parseMaybeUnary (/Users/magicly/development/blog/gatsby-starter-blog/node_modules/acorn/dist/acorn.js:1685:24)
    at Parser.pp$3.parseExprOps (/Users/magicly/development/blog/gatsby-starter-blog/node_modules/acorn/dist/acorn.js:1637:21)
    at Parser.pp$3.parseMaybeConditional (/Users/magicly/development/blog/gatsby-starter-blog/node_modules/acorn/dist/acorn.js:1620:21)
    at Parser.pp$3.parseMaybeAssign (/Users/magicly/development/blog/gatsby-starter-blog/node_modules/acorn/dist/acorn.js:1597:21)
    at Parser.pp$3.parseExpression (/Users/magicly/development/blog/gatsby-starter-blog/node_modules/acorn/dist/acorn.js:1573:21)
    at Parser.pp$1.parseStatement (/Users/magicly/development/blog/gatsby-starter-blog/node_modules/acorn/dist/acorn.js:727:47)
    at Parser.pp$1.parseTopLevel (/Users/magicly/development/blog/gatsby-starter-blog/node_modules/acorn/dist/acorn.js:638:25)
    at Parser.parse (/Users/magicly/development/blog/gatsby-starter-blog/node_modules/acorn/dist/acorn.js:516:17)
    at Object.parse (/Users/magicly/development/blog/gatsby-starter-blog/node_modules/acorn/dist/acorn.js:3098:39)
    at Parser.parse (/Users/magicly/development/blog/gatsby-starter-blog/node_modules/webpack/lib/Parser.js:902:15)
    at NormalModule.<anonymous> (/Users/magicly/development/blog/gatsby-starter-blog/node_modules/webpack/lib/NormalModule.js:104:16)
    at NormalModule.onModuleBuild (/Users/magicly/development/blog/gatsby-starter-blog/node_modules/webpack/node_modules/webpack-core/lib/NormalModuleMixin.js:310:10)
    at nextLoader (/Users/magicly/development/blog/gatsby-starter-blog/node_modules/webpack/node_modules/webpack-core/lib/NormalModuleMixin.js:275:25)
    at /Users/magicly/development/blog/gatsby-starter-blog/node_modules/webpack/node_modules/webpack-core/lib/NormalModuleMixin.js:259:5

 @ ./src/pages ^\.\/.*$

๊ฒฝ๊ณ ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ํŽ˜์ด์ง€๋Š” ๊ดœ์ฐฎ์•„ ๋ณด์ด์ง€๋งŒ ํŽ˜์ด์ง€๋ฅผ ๋นŒ๋“œํ•˜๊ณ  ๋ฐฐํฌํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

Uncaught TypeError: Cannot read property 'call' of undefined
    at t (bootstrap 29073caโ€ฆ:52)
    at Object../src/components/Footer/footer.css (footer.css:1)
    at t (bootstrap 29073caโ€ฆ:52)
    at Object.<anonymous> (index.jsx:5)
    at Object../src/components/Footer/index.jsx (layout-component---index-adc8f24โ€ฆ.js:153)
    at t (bootstrap 29073caโ€ฆ:52)
    at Object.<anonymous> (index.jsx:3)
    at Object../node_modules/babel-loader/lib/index.js?{"plugins":["/Users/magicly/development/blog/gatsby-starter-blog/node_modules/gatsby/dist/utils/babel-plugin-extract-graphql.js","add-module-exports","add-module-exports","add-module-exports","transform-object-assign",["transform-react-jsx",{"pragma":"Glamor.createElement"}],"babel-plugin-glamor"],"presets":["/Users/magicly/development/blog/gatsby-starter-blog/node_modules/babel-preset-react/lib/index.js","/Users/magicly/development/blog/gatsby-starter-blog/node_modules/babel-preset-es2015/lib/index.js","/Users/magicly/development/blog/gatsby-starter-blog/node_modules/babel-preset-stage-1/lib/index.js","/Users/magicly/development/blog/gatsby-starter-blog/node_modules/babel-preset-env/lib/index.js","/Users/magicly/development/blog/gatsby-starter-blog/node_modules/babel-preset-stage-0/lib/index.js","/Users/magicly/development/blog/gatsby-starter-blog/node_modules/babel-preset-react/lib/index.js"],"cacheDirectory":true}!./src/layouts/index.jsx (layout-component---index-adc8f24โ€ฆ.js:757)
    at t (bootstrap 29073caโ€ฆ:52)
    at index.jsx?8a0a:11

๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‚ด ์ฝ”๋“œ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

 {posts.map(post => {
            const path = `../${post.node.frontmatter.cover.relativePath}`;
            return <li key={post.node.fields.slug}>
              <Link to={post.node.fields.slug}>
                <img className="news-img" src={require(path)} />
                <h3 className="news-titles">{post.node.frontmatter.title}</h3>
                <p className="news-desc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{post.node.excerpt}</p>
              </Link>
            </li>
          }
          )}

์ฝ˜์†”์— ๊ฒฝ๊ณ ๊ฐ€ ํ‘œ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
``` ๊ฒฝ๊ณ  1๊ฐœ์˜ ๊ฒฝ๊ณ ๋กœ ์ปดํŒŒ์ผ๋จ 10:31:08

./src/pages/news/index.jsx์˜ ๊ฒฝ๊ณ 

์ค‘์š”ํ•œ ์ข…์†์„ฑ:
103:74-87 ์ข…์†์„ฑ ์š”์ฒญ์€ ํ‘œํ˜„์‹์ž…๋‹ˆ๋‹ค.

@ ./src/pages/news/index.jsx 103:74-87

and the error on web page:

์˜ค๋ฅ˜: '../md/new4/cover4.png' ๋ชจ๋“ˆ์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
http://localhost :8000/commons.js:55706:42
webpackContextResolve(์›นํŒฉ:/src/pages/news
^./. $:11webpackContext(์›นํŒฉ:/src/pages/news^./. $:8
http://localhost :8000/commons.js:7945:98
๋ฐฐ์—ด.๋งต
(ํ† ์ข…์˜)
์ธ๋ฑ์Šค.๋ Œ๋”๋ง
webpack:///src/pages/news/index.js jsx:21
์ธ๋ฑ์Šค.๋ Œ๋”๋ง
webpack:///~/react-proxy/modules/createPrototypeProxy.js:44
http://localhost :8000/commons.js:30838:22
์ธก์ • ์ˆ˜๋ช…์ฃผ๊ธฐ ์„ฑ๋Šฅ
webpack:///~/react-dom/lib/ReactCompositeComponent.js:75
ReactCompositeComponentWrapper._renderValidatedComponentWithoutOwnerOrContext
webpack:///~/react-dom/lib/ReactCompositeComponent.js:794

I am sure the path  '../md/new4/cover4.png' is right, because if I change code to:

{posts.map(๊ฒŒ์‹œ๋ฌผ => {
๋ฐ˜ํ’ˆ


  • {post.node.frontmatter.title}


    {post.node.excerpt}




    }
    )}
    ```
    ๋ชจ๋“  ๊ฒƒ์ด ์ •์ƒ์ž…๋‹ˆ๋‹ค. ๋‚ด ํ™˜๊ฒฝ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
    ๋…ธ๋“œ: v8.1.2
    npm: v5.0.3
    ๊ฐœ์ธ ๋น„: 1.2.0
    OSX 10.11.5

    ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค~

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

    ๋‚˜๋Š” ๊ตฌ๊ธ€

    the request of a dependency is an expression
    

    ๊ทธ๋ฆฌ๊ณ  ๋งˆ์นจ๋‚ด https://webpack.github.io/docs/context.html์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ webpack dynamic์ด ์š”๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
    my๋ฅผ ์ฝ”๋“œ๋กœ ๋ณ€๊ฒฝํ•œ ํ›„

     {posts.map(post => {
                let path = `${post.node.frontmatter.cover.relativePath}`;
                path = path.slice(0, path.lastIndexOf('.'))
                return <li key={post.node.fields.slug}>
                  <Link to={post.node.fields.slug}>
                    <img className="news-img" src={require('../' + path + '.png')} />
                    <h3 className="news-titles">{post.node.frontmatter.title}</h3>
                    <p className="news-desc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{post.node.excerpt}</p>
                  </Link>
                </li>
              }
              )}
    

    ์ด์ œ ๋ชจ๋“  ๊ฒƒ์ด ์ •์ƒ์ž…๋‹ˆ๋‹ค.

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

    ๋‚˜๋Š” ๊ตฌ๊ธ€

    the request of a dependency is an expression
    

    ๊ทธ๋ฆฌ๊ณ  ๋งˆ์นจ๋‚ด https://webpack.github.io/docs/context.html์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ webpack dynamic์ด ์š”๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
    my๋ฅผ ์ฝ”๋“œ๋กœ ๋ณ€๊ฒฝํ•œ ํ›„

     {posts.map(post => {
                let path = `${post.node.frontmatter.cover.relativePath}`;
                path = path.slice(0, path.lastIndexOf('.'))
                return <li key={post.node.fields.slug}>
                  <Link to={post.node.fields.slug}>
                    <img className="news-img" src={require('../' + path + '.png')} />
                    <h3 className="news-titles">{post.node.frontmatter.title}</h3>
                    <p className="news-desc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{post.node.excerpt}</p>
                  </Link>
                </li>
              }
              )}
    

    ์ด์ œ ๋ชจ๋“  ๊ฒƒ์ด ์ •์ƒ์ž…๋‹ˆ๋‹ค.

    ์ด ์ˆ˜์ • ์‚ฌํ•ญ์„ ์ž‘์„ฑํ•ด ์ฃผ์‹  @magicly ์—๊ฒŒ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. Gatsbyv 0.x์—์„œ v1.x๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋Š” ๋™์•ˆ ์ด ๋ฌธ์ œ๊ฐ€ ์ •๋ง ๋ฌธ์ œ์˜€์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ์šฐ์—ฐํžˆ ๋ฐœ๊ฒฌํ•œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์„ ์œ„ํ•ด ๋‚˜๋„ ๊ฐ™์€ ๊ฒƒ์„ ์›ํ–ˆ์ง€๋งŒ ํŒŒ์ผ ํ™•์žฅ์ž๊ฐ€ ๋™์ ์ด๊ธฐ๋ฅผ ์›ํ–ˆ์Šต๋‹ˆ๋‹ค.

    ์ œ ๊ฒฝ์šฐ์™€ @magicly์˜ ๊ฒฝ์šฐ ์™ธ๊ด€์ƒ Markdown frontmatter์—์„œ ์˜ค๋Š” ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ณ„ ๊ธฐ์‚ฌ์˜ ํ‘œ์ง€ ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Gatsby ๊ธฐ๋ณธ ์Šคํƒ€ํ„ฐ ๋ธ”๋กœ๊ทธ์™€ ๊ฐ™์€ ํ”„๋กœ์ ํŠธ ์ปจํ…์ŠคํŠธ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‚ด์šฉ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ---
    title: The title of the post
    featured_image: ./teaser.jpg
    ---
    

    ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ชจ๋“  ๊ธฐ์‚ฌ๋ฅผ ๋‚˜์—ดํ•˜๋Š” ์ƒ‰์ธ โ€‹โ€‹ํŽ˜์ด์ง€์˜ GraphQL ์ฟผ๋ฆฌ์— featured_image ( @magicly ๊ฐ€ cover ์ด๋ผ๊ณ  ํ•œ ๊ฒƒ)๋ฅผ ํฌํ•จํ•˜๋ ค๊ณ  ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

    frontmatter {
      title
      featured_image {
        name
        ext
        relativePath
      }
    }
    

    ์ด์ œ ๋ชจ๋“  ๊ฒŒ์‹œ๋ฌผ์„ ๋ฐ˜๋ณตํ•˜๊ณ  ์ธ๋ฑ์Šค ํŽ˜์ด์ง€์— ์ œ๋ชฉ๊ณผ ์ถ”์ฒœ ์ด๋ฏธ์ง€๋ฅผ ํ‘œ์‹œํ•˜๊ณ  ์‹ถ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. React ๊ตฌ์„ฑ ์š”์†Œ ๋‚ด์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    // โ€ฆ
    
    // Create a new require context for Webpack
    const requireFeatureImage = require.context(
      `./../pages/portfolio/`, // Donโ€™t make this a variable
      true, // Whether or not to check subdirectories
      /^.*\.(svg|png|gif|jpg|jpeg|webp|)$/ // Rough regex for extensions, maybe change this for your use case?
    )
    
    return (
      <ol>
        {pages.map(function(page, i) {
          let path = page.node.frontmatter.featured_image.relativePath
          let imgPath = `./${path.split('portfolio/')[1]}`
    
          return (
            <li key={`Item_${page.node.fields.slug}`}>
              <Link to={page.node.fields.slug}>
                <img src={requireFeatureImage(imgPath)} />
                <h2>
                  {page.node.frontmatter.title}
                </h2>
              </Link>
            </li>
          )
        })}
      </ol>
    )
    

    Webpack 2๊ฐ€ ํฌํ•จ๋œ require.context ์— ๋Œ€ํ•œ ๋ฌธ์„œ ๋Š” ์„ค์ •์„ ๋” ์ž์„ธํžˆ ์„ค๋ช…ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ ์ด์™€ ๊ฐ™์€ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋ณด์—ฌ์ฃผ์ง€๋Š” ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  Gatsby ๋ฌธ์ œ๋Š” Webpack์— ๋Œ€ํ•œ ์•ฝ๊ฐ„์˜ ํŠน์ • ์ง€์‹์ด ํ•„์š”ํ•œ(์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค) ์ƒ๋‹นํžˆ ์ผ๋ฐ˜์ ์ธ ํŒจํ„ด์ธ ๊ฒƒ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

    @KyleAMathews ์ด๊ฒƒ์ด ๋‚ด๊ฐ€ ๋ฌธ์„œ์— ๋Œ€ํ•ด ํ™•์žฅํ•˜๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ๋‚ด๊ฐ€ ๋†“์นœ ์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ๊ฒƒ์— ๋Œ€ํ•œ ์˜ˆ/๋” ๋‚˜์€ ์ ‘๊ทผ ๋ฐฉ์‹์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๊ฐ์‚ฌ ํ•ด์š”!

    ํŠœํ† ๋ฆฌ์–ผ์˜ ํŒŒํŠธ 5์—์„œ ์ด์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๊ฒ ์ง€๋งŒ ๊ทธ ๋™์•ˆ www์™€ gatsbygram ์„ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

    https://www.gatsbyjs.org/packages/gatsby-transformer-sharp/ ๋ฅผ ์„ค์น˜ํ•˜๋ฉด frontmatter์— ์—ฐ๊ฒฐ๋œ ์ด๋ฏธ์ง€๊ฐ€ graphql์„ ํ†ตํ•ด ์ฟผ๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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