Next.js: ์Šคํƒ€์ผ์ด ์ง€์ •๋œ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ์—ฐ๊ฒฐ

์— ๋งŒ๋“  2017๋…„ 05์›” 11์ผ  ยท  18์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: vercel/next.js

#799๋ฅผ ๋”ฐ๋ž์ง€๋งŒ ์Šคํƒ€์ผ์ด ์ง€์ •๋œ ๊ตฌ์„ฑ ์š”์†Œ ๋งํฌ๋ฅผ ๊ฐ–๋Š” ๊นจ๋—ํ•œ ๋ฐฉ๋ฒ•์„ ์–ป์„ ์ˆ˜ ์—†์—ˆ๊ณ  href๋ฅผ ๋ณต์ œํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

const StyledLink = styled.a`
  color: red;
  background: blue;
`

export default ({ href, name }) => (
  <Link prefetch href={href}>
    <StyledLink href={href}>{name}</StyledLink>
  </Link>
)

styled-component ๋งํฌ๋ฅผ ๋งŒ๋“œ๋Š” ์ ์ ˆํ•œ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

next.js ์‚ฌ์šฉ 2.3.1.

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

์–˜๋“ค ์•„. 3.0.1-beta.13+ ๋ฒ„์ „์—์„œ passHref ๋ฅผ Link (๋ถ€์šธ ์†์„ฑ์œผ๋กœ)๋กœ ์„ค์ •ํ•˜์—ฌ href ๋ฅผ styled-components (๋˜๋Š” ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ž˜ํ•‘ํ•˜๋Š” ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)์— ๋…ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. <a/> ํƒœ๊ทธ).

๋ฌธ์ œ์˜ ์ฒซ ๋ฒˆ์งธ ์˜ˆ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

const StyledLink = styled.a`
  color: red;
  background: blue;
`

export default ({ href, name }) => (
  <Link prefetch href={href} passHref>
    <StyledLink>{name}</StyledLink>
  </Link>
)

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

Chrome์—์„œ href ์†์„ฑ ์—†์ด a ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ •ํ™•ํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋งํฌ๋กœ ์Šคํƒ€์ผ์ด ์ง€์ •๋˜์ง€ ์•Š์•˜์œผ๋ฉฐ ์ผ๋ฐ˜ ๋งํฌ์˜ ๋ธŒ๋ผ์šฐ์ € ์ ‘๊ทผ์„ฑ ๊ธฐ๋Šฅ์ด ์—†์Šต๋‹ˆ๋‹ค. ํšจ๊ณผ๊ฐ€ ์žˆ์—ˆ๋˜ ๊ฒƒ์€ a ํƒœ๊ทธ์— ๋นˆ href ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ๋„ ๊ฒฝํ—˜ํ•ฉ๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๊ณต๋ฐฑ๋ณด๋‹ค href๋ฅผ ๋‘ ๋ฒˆ์งธ๋กœ ํฌํ•จํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ € URL ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์ „์šฉ์ธ ๊ฒฝ์šฐ.

ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ styledcomponents์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
https://github.com/styled-components/styled-components#third -party-components

import Link from 'next/link'
const StyledLink = styled(Link)`
  color: red;
  background: blue;
`

๊ทธ๊ฑธ ์จ

export default () => (<div><StyledLink href="mylink">MyText</StyledLink></div>)

@kennylavender ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์‹œ๋„ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค!

@sedubois ๊ฐ€ ํšจ๊ณผ๊ฐ€ ์žˆ์—ˆ๋‚˜์š”? className์„ Link์— ์ „๋‹ฌํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@luisrudge ๋Š” ์•„์ง ์‹œ๋„ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ์ถฉ๋ถ„ํ–ˆ์œผ๋ฉฐ styled-jsx๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ•œ ๋ฒˆ ๋” ์‹œ๋„ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค...

์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ํ™•์ธ๋˜๋ฉด ์•Œ๋ ค์ฃผ๊ณ  ๋‹ค์‹œ ์—ด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@sedubois @kennylavender ์˜ ์†”๋ฃจ์…˜์ด ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ์—ฌ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

pull ์š”์ฒญ์„ ๋งŒ๋“ค์–ด nextjs ๋งํฌ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์ด๋ฅผ ์ง€์›ํ•˜๋„๋ก ํ•˜๊ฑฐ๋‚˜ styledcomponents์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋Š” ๊ณ ์œ ํ•œ ๋ฒ„์ „์˜ nextjs ๋งํฌ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งํฌ ์ฝ”๋“œ๋ฅผ ๋ณด์ง€ ์•Š๊ณ  ์•ต์ปค ์š”์†Œ์— ์†Œํ’ˆ์„ ์ „๋‹ฌํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค.

nextjs ๋ผ์šฐํ„ฐ ๋ฅผ ๊ฐ€์ ธ์™€์„œ ์ž์‹ ๋งŒ์˜ ๋ผ์šฐํ„ฐ๋ฅผ ๋งŒ๋“  ๋‹ค์Œ styledcomponents๊ฐ€ https://www.styled-components.com/docs/basics#styling -any-components ๊ตฌ์„ฑ ์š”์†Œ์˜ ์Šคํƒ€์ผ์„ ์ง€์ •ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ๊ฐ„๋‹จํ•œ ์˜ˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ฝ”๋“œ๋ฅผ ์—ฌ๊ธฐ์— ์ง์ ‘ ์ž‘์„ฑํ–ˆ์„ ๋ฟ์ด๋ฉฐ ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ์˜ˆ์ œ๋กœ๋งŒ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

// my-app-link.js
import React from 'react'
import PropTypes from 'prop-types' // Import this from react if your using an older version.
import Router from 'next/router'

const handler = (href) => Router.push(href);

const Link = ({className, children, href, ...rest}={}) => (
  <a onClick={() => handler(href)} className={className} {...rest} >{children}</a>
);

Link.propTypes = {
  className: PropTypes.string,
  href: PropTypes.oneOfType([
    PropTypes.object,
    PropTypes.string,
  ]),
  children: PropTypes.node,
}

export default Link;

@kennylavender ์ข‹์€ ์ ‘๊ทผ ๋ฐฉ์‹์ด์ง€๋งŒ href ์†์„ฑ์„ ๋ Œ๋”๋งํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ถฉ๋ถ„ํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค(๋Œ€์‹  onClick ์ด๋ฒคํŠธ๋ฅผ ์‚ฌ์šฉ ์ค‘์ž…๋‹ˆ๋‹ค). ๊ทธ๋ž˜์„œ... ์ด ์ ‘๊ทผ ๋ฐฉ์‹์ด SEO์— ์–ผ๋งˆ๋‚˜ ์ข‹์€๊ฐ€์š”? ๋‹ค๋ฅธ ๋Œ€์•ˆ?

๋” ๋‚˜์•„๊ฐ€์•ผ ํ•˜๋Š” ์˜ˆ์‹œ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๊ฒŒ์‹œํ•œ ์ฝ”๋“œ ์œ„์— href ์†์„ฑ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๊ณ  ํ™•์‹คํžˆ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. nextjs/link๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„๋˜๋Š”์ง€ ์‚ดํŽด๋ณด๊ณ  ์–ด๋–ป๊ฒŒ ํ•˜๋Š”์ง€ ์•Œ์•„๋ณด์„ธ์š”.

์–˜๋“ค ์•„. 3.0.1-beta.13+ ๋ฒ„์ „์—์„œ passHref ๋ฅผ Link (๋ถ€์šธ ์†์„ฑ์œผ๋กœ)๋กœ ์„ค์ •ํ•˜์—ฌ href ๋ฅผ styled-components (๋˜๋Š” ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ž˜ํ•‘ํ•˜๋Š” ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)์— ๋…ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. <a/> ํƒœ๊ทธ).

๋ฌธ์ œ์˜ ์ฒซ ๋ฒˆ์งธ ์˜ˆ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

const StyledLink = styled.a`
  color: red;
  background: blue;
`

export default ({ href, name }) => (
  <Link prefetch href={href} passHref>
    <StyledLink>{name}</StyledLink>
  </Link>
)

์ฐธ๊ณ : next-routes ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

export default ({route, params, children}) => (
  <Link route={route} params={params} passHref>
    <StyledLink>{children}</StyledLink>
  </Link>
)

className ์†Œํ’ˆ์„ ์ง์ ‘ Link ๋กœ ์šฐํšŒํ•˜์—ฌ ์˜ฌ๋ฐ”๋ฅธ ๋ฒ”์œ„์—์„œ ์Šคํƒ€์ผ์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก @vjpr ์†”๋ฃจ์…˜์„ ๊ฐœ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋งํฌ.js

export default ({ route, params, children, className }) => (
  <Link route={route} params={params} passHref>
    <StyledLink className={className}>{children}</StyledLink>
  </Link>
)

๋‹ค๋ฅธ ๊ตฌ์„ฑ ์š”์†Œ.js

import Link fron 'components/Link';

const RedLink = styled(Link)`
  background-color: red;
`

@torresandres ์˜ ์•ฝ๊ฐ„ ๊ฐœ์„ ๋œ ๋ฒ„์ „์œผ๋กœ, Link ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ชจ๋“  ๊ตฌ์„ฑ ์š”์†Œ์— ์Šคํƒ€์ผ์ด ์ง€์ •๋œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์—†๋„๋ก ๊ตฌ์„ฑ ์š”์†Œ ๋‚ด๋ถ€์˜ ๋งํฌ ์Šคํƒ€์ผ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

๋งํฌ.js

const StyledLink = styled.a`
  //styles
`
export default ({ route, params, href, children, className }) => (
  <Link route={route} params={params} href={href} passHref>
    <StyledLink className={className}>{children}</StyledLink>
  </Link>
);

๋‹ค๋ฅธ ๊ตฌ์„ฑ ์š”์†Œ.js

<Link href="/">Login</Link>

className ๊ฐ€ Link์˜ ์†Œํ’ˆ์œผ๋กœ ์ œ๊ณต๋˜์ง€ ์•Š๋Š” ํŠน๋ณ„ํ•œ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด PR์„ ๋งŒ๋“ค๊ณ  ์‹ถ์ง€๋งŒ ๊ทธ๊ฒƒ์ด ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š” ์ด์œ ๊ฐ€ ์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‹ต์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค!
https://github.com/zeit/next.js/pull/1642#issuecomment -292431043

์Šคํƒ€์ผ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ๋งํฌ ์Šคํƒ€์ผ์„ ๋ณ€๊ฒฝํ•˜๋ ค๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด

const LinkItem = styled(Link)`
// your style
`;

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค <LinkItem to="/yourComponent">somthing</LinkItem>

์ด๊ฒƒ์„ ์•Œ์•„๋‚ด๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ์œผ๋ฏ€๋กœ TLDR์„ ์ž‘์„ฑํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค ๐Ÿ‘‡

TLDR passHref ๋ฅผ <Link> ํƒœ๊ทธ์— ์ถ”๊ฐ€ํ•˜๊ณ  ๊ทธ ์•ˆ์— ์›ํ•˜๋Š” ์Šคํƒ€์ผ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

์‹ค์ œ ์˜ˆ
์ƒ์œ„ ๊ตฌ์„ฑ์š”์†Œ์—์„œ:

<Link href="/login" passHref>
          <TopbarLink>Login</TopbarLink>
</Link>

TopbarLink๋ฅผ ์ •์˜ํ•˜๋Š” ์Šคํƒ€์ผ์ด ์ง€์ •๋œ ๊ตฌ์„ฑ ์š”์†Œ ํŒŒ์ผ์—์„œ:

export const TopbarLink = styled.a`
// your style
`;

@ferrucc-io ๊ท€ํ•˜์˜ ์˜ˆ์ œ๋Š” ์•ต์ปค ๋‚ด์—์„œ ์•ต์ปค๋ฅผ ๋ž˜ํ•‘ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ผ๋ฐ˜์ ์œผ๋กœ ๋งํฌ๋ฅผ ๋ฐฐ์น˜ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์Šคํƒ€์ผ์ด ์ง€์ •๋œ ๋‚ด๋ถ€ ๋ฌธ์ œ๋กœ ์ดˆ๊ธฐ ๋ฌธ์ œ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

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