๋ด ๊ตฌ์ฑ ์์์์ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์ด๋ป๊ฒ ์ฒ๋ฆฌํด์ผ ํ๋์ง ๊ถ๊ธํฉ๋๋ค. ์ด๋ฏธ์ง๋ฅผ ์ด๋์ ์ ์ฅํด์ผ ํฉ๋๊น? ๋ฌธ์ ๋๋ ์์ ์์ ์ฐพ์ ์ ์์ต๋๋ค.
์๋ ํ์ธ์!
๋ฌธ์์์ Static file serving. ./static/ is mapped to /static/
๋ฐ๋ผ์ ์ผ๋ฐ img
ํ๊ทธ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
static์ด๋ผ๋ ํด๋๋ฅผ ๋ง๋ค๊ณ ๊ทธ ์์ ์ด๋ฏธ์ง๋ฅผ ๋ฃ์ต๋๋ค.
๊ถ๊ธํ ์ ์ด ์์ผ๋ฉด ์ธ์ ๋ ์ง ๋ค์ ์ด์ด๋ณด์ธ์.
@impronunciable ๋ชจ๋ ์ด๋ฏธ์ง๋ฅผ ๋์ผํ ๊ธ๋ก๋ฒ static
ํด๋์ ์ ์ฅํ๋ ๊ฒ์ ์ข์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฌ์ฉ๋ ์ด๋ฏธ์ง์ ๋ ์ด์ ์ฌ์ฉ๋์ง ์๋ ์ด๋ฏธ์ง๋ฅผ 2๊ฐ์ ์์ ์ด๋ป๊ฒ ์ ์ ์์ต๋๊น? ์ด๋ฏธ์ง๋ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ๋ ๊ตฌ์ฑ ์์์ ๋์ผํ ํด๋์ ์ ์ฅ๋ ์ ์์ผ๋ฉฐ ์ถ์ํ ๊ณ์ธต์ ์ฌ์ฉํ์ฌ next.js ์์ฒด์ ์ํด /static์ผ๋ก ์ด๋ํ ์ ์์ผ๋ฏ๋ก ๋ค์๊ณผ ๊ฐ์ด ํ ์ ์์ต๋๋ค.
import myImg from './myImg.png';
๊ทธ๋ฆฌ๊ณ ๋์ค์
<img src={myImg} />
์ข์ ๊ฐ๋ฐ์ ๊ฒฝํ์ด ๋ ๊ฒ์ ๋๋ค.
@pietrasiak ๊ธ์, ์ด๋ฏธ์ง ์ ์ฅ์ ๋ํ ์ข์ ์์ด๋์ด์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์ถ๋ค๋ฉด ํ๋ก๋์
์ ์ํด CDN์ ์ ์ฅํด์ผ ํฉ๋๋ค. ์ ์ ํด๋๋ ๊ฐ๋ฐ์ ํ์ค์ด๋ฉฐ terrible
์์ด๋์ด๋ผ๊ณ ๋งํ์ง ์๊ฒ ์ต๋๋ค. ์นํฉ ๋ก๋๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ํ ๊ฒ์ ๋ฌ์ฑํ ์ ์์ง๋ง
๋ชจ๋ ์ ์ ํ์ผ์ ๊ตฌ์ฑ ์์์ ๋ถ๋ฆฌ๋ ๋จ์ผ ํด๋์ ๋ฃ๋ ๊ฒ์ ์์ ํ ๋์ฐํ ์๊ฐ์
๋๋ค. ๋ชจ๋ ํ์ผ์ ๊ธฐ์ตํ๊ธฐ ์ด๋ ต๊ณ ์ ์ ํด๋์ ์๋ ํ์ผ์ ์ด๋ฆ๋ ์ปดํฌ๋ํธ์ ๊ตฌ์กฐ์ ๋ง๊ฒ ๋ณ๊ฒฝํฉ๋๋ค. @pie6k ์ ์์ ๋์ํ์ง๋ง ๊ตฌํ์ด ์ด๋ ค์ด์ง ์๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ด๋ฌํ ์๋ฃจ์
์์ ์ฐ๋ฆฌ๋ svg-loaders์ ๊ฐ์ ๋ก๋ ์ต์ ํ์ ์ด์ ์ ์ป์ ์๋ ์์ต๋๋ค.
์ด ๊ธฐ๋ฅ์ ๊ตฌํํ๊ณ ์ถ์ง๋ง next.js๊ฐ ์ฒ์์
๋๋ค.
@impronunciable ๋๋ CDN์ด ์์ด๋ ์ข์ ํ์ผ ๊ตฌ์ฑ์ ๊ฐ์ถ ์ ์ ์๋ฒ์ ์ ์ฅํ๋ ๊ฒ์ด ์ข์ ์ถ๋ฐ์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ต์ข 'url'์ด ๋ฐํ๋๊ธฐ ์ ์ ์ด๋ค ๋ฐฉ์์ผ๋ก๋ ์ฒ๋ฆฌ(next.js์ ์ํด ์ ์ ํด๋๋ก ์ด๋, ์ด๋ฆ ๋ณ๊ฒฝ ๋ฑ)๋ ๊ฒฝ์ฐ ํด๋น ํ์ผ ์ด๋์ ๊ด๋ฆฌํ๋ ์ผ๋ถ ๊ธฐ๋ฅ์ ๊ฑฐ๊ธฐ์ ์ฐ๊ฒฐํ๋ ๊ฒ์ด ์๋์ ์ผ๋ก ์ฌ์ธ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. CDN์ ์ฐ๊ฒฐํ๋ฏ๋ก ๊ณ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
import myImg from './myImg.png';
// and then
console.log(myImg); // 'http://your.cdn/myImg.png'
๊ทธ๋ฌ๋ฉด ์์ ํ ์๋ก์ด ํด๋์ค์ next.js ํจ๊ณผ์ ์ธ ์ํฌํ๋ก ์ฌ์ฉ์ ์ง์ ์ด ๊ฐ๋ฅํฉ๋๋ค.
์ข์, ๋๋ ์ด ํ๋ฌ๊ทธ์ธ์ ์ถ๊ฐํ๋ค: babel-plugin-import-static-files
์ง๊ธ๊น์ง ์๋ ์ค์
๋๋ค. ๋ฌธ์ ๊ฐ ์์ผ๋ฉด ์๋ ค์ฃผ์ธ์.
๊ฐ์ ธ์จ ์ด๋ฏธ์ง๋ฅผ /static
ํด๋์ ๋ณต์ฌํ๊ณ ์ด๋ฏธ์ง ๊ฒฝ๋ก๋ฅผ /static/path/to/img.png
ํฌ์ธํธ๋ก ๋ณํํฉ๋๋ค. ์ด ํ๋ฌ๊ทธ์ธ์ babel-plugin-transform-assets-import-to-string ์์ ๋ถ๊ธฐ๋ฉ๋๋ค.
@ahalimkara ์ด๊ฒ์ด
๋ค์ 4.1.0
์์ "์ด ํ์ผ ์ ํ์ ์ฒ๋ฆฌํ๋ ค๋ฉด ์ ์ ํ ๋ก๋๊ฐ ํ์ํ ์ ์์ต๋๋ค"๋ผ๋ ๋ฉ์์ง๊ฐ ํ์๋ฉ๋๋ค.
@anselmdk by code example import myImg from './myImg.png'
๋๋ ๊ทธ๊ฒ์ด ์ค์ ๋ก ์ด๋ป๊ฒ ์๋ํ๋์ง๊ฐ ์๋๋ผ ์ด๋ป๊ฒ ์๋ํ๋์ง์ ๋ํ ์๋ฅผ ์๋ฏธํ์ต๋๋ค.
์๊ฒ ์ต๋๋ค. ์ด ์์ ์ ์ํํ๋ ค๋ฉด ์ฌ์ฉ์ ์ง์ ๋ก๋๊ฐ ํ์ํฉ๋๋ค.
@anselmdk ์ , ์๋ํด์ผ ํฉ๋๋ค. ๋ฌธ์ ๊ฐ ์์ผ๋ฉด ์๋ ค์ฃผ์ธ์.
@ahalimkara babel-plugin-import-static-files๊ฐ Windows์ ๊ฒฝ๋ก๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌ์ฑํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ค๋ฅ:
E:\Dropbox\Programming\client\src\static\E:\Dropbox\Programming\client\src\app\routes\Landing contains invalid WIN32 path characters.
@amosyuen ๊ธฐ๋ณธ ์ต์
์ ์ฌ์ฉํฉ๋๊น ์๋๋ฉด ์ฌ์ฉ์ ์ง์ ์ต์
์ ์ฌ์ฉํฉ๋๊น? Landing
ํ์ผ์ ํ์ฅ์๊ฐ ์์ต๋๊น?
( ๋ฌธ์ ํญ์ ํ์ฑํํ์ผ๋ฏ๋ก ์ฌ๊ธฐ์์ ์์ฒญ์ ์ ์ถํ ์ ์์ต๋๋ค.)
https://github.com/ahalimkara/babel-plugin-import-static-files/issues/1 ์์ฑํ ์ ๋ฌธ์ ์ ์์ธํ ๋ด์ฉ์ ๊ฒ์ํ์ต๋๋ค.
@ahalimkara ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๋๋ ๋น์ ์๊ฒ ๋ฌธ์ ๋ฅผ ๊ฒ์ํ์ต๋๋ค. ๋์์ฃผ ์๊ฒ ์ต๋๊น ahalimkara/babel-plugin-import-static-files#2
@luanwulin ๋ค ๋ฌธ์ ํ์ด์ง๋ฅผ ์ฌ์ฉํ์ญ์์ค. ๊ฑฐ๊ธฐ์์ ๋ชจ๋ ํ์ธํ๊ณ ์์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค.
@ahalimkara ๊ทํ์ ๋ฌธ์ ํ์ด์ง์ ๋ฌธ์ ๋ฅผ ๊ฒ์ํ์ต๋๋ค. ๋ฌธ์ #2
https://github.com/zeit/next.js/issues/79#issuecomment -300138252 ๊ถ์ฅ ์ฌํญ์ ๋ํ ๊ณต์ ์ง์(๋๋ ์ด๋ฅผ ๊ตฌํํ์ง ์๋ ์ด์ ์ ๋ํ ๊ณต์ ์ ์ฅ ๋๋ ๊ณต์ ๊ถ์ฅ ์ฌํญ)์ด ์์ ๋๊น์ง ๋๊ตฐ๊ฐ๊ฐ ๋ค์ ์ด ์ ์์ต๋๊น? ํด๊ฒฐ ๋ฐฉ๋ฒ)?
์ปค๋ฎค๋ํฐ์ ๋๋ถ๋ถ์ด https://github.com/zeit/next.js/issues/79#issuecomment -300138252์ ๋์ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
https://github.com/zeit/styled-jsx/pull/148 ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
ํ ์คํธ๋์ง ์์ ์ ์ฌ ์:
// components/Header/HeaderStyle.js
export default `
h3 { color: red; }
`
// components/Header/HeaderComponent.js
import style from './HeaderStyle'
export default () =>
<div>
<h3>Yo</h3>
<styled jsx>{style}</styled>
</div>
Nicolas Gallagher์ ๊ตฌ์ฑ ์์ ์ํคํ
์ฒ ์ค์ ์ ๊ด์ฌ์ด ์๋ ๊ฒฝ์ฐ HeaderComponent.js
๋ฅผ HeaderScript.js
๋ฐ HeaderTemplate.js
๋ก ๋ถํ ํ ์ ์์ต๋๋ค. ๐คทโโ๏ธ
์ด์ ๋ค์์์ require
๋๋ import
์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ค์ ๋ก v5์์ ์นํฉ ๋ก๋๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋๊ตฐ๊ฐ ์ด๋ฏธ ์ด๋ฏธ์ง ์ฒ๋ฆฌ์ฉ ํ๋ฌ๊ทธ์ธ์ ๋ง๋ค์์ต๋๋ค: https://github.com/arefaslani/next-images
์ฐธ์กฐ: https://github.com/zeit/next.js/issues/1935#issuecomment -367039454
...๋๋ https://github.com/arefaslani/next-images/blob/master/index.js์ ์ค์ ์ ๋ฐ๋ผ webpack ๊ตฌ์ฑ์ ์์ ํ์ญ์์ค.
publicPath: '/_next/static/images/',
outputPath: 'static/images/'
์ฌ๊ธฐ์์ ๋ณผ ์ ์๋ฏ์ด: https://github.com/arefaslani/next-images/blob/master/index.js
next-images๋ webpack๋ง ๊ตฌ์ฑํฉ๋๋ค.
๊ฐ๋ฐ์ sass์ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ง๋ง ์ด๋ฌํ ๋ชจ๋์ ๊ตฌ์ฑํ๋ ๋ฐ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
next.config.js์ @zeit/next-sass ๋ฐ next-images ๊ตฌ์ฑ ๋ฌธ์
``
const withSass = require('@zeit/next-sass')
const withImages = require('๋ค์ ์ด๋ฏธ์ง')
module.exports = withSass();
module.exports = withImages();
``
๊ทธ๊ฒ์ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ?
๊ฐ๋ฐ์ sass์ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ง๋ง ์ด๋ฌํ ๋ชจ๋์ ๊ตฌ์ฑํ๋ ๋ฐ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
next.config.js์ @zeit/next-sass ๋ฐ next-images ๊ตฌ์ฑ ๋ฌธ์
``
const withSass = require('@zeit/next-sass')
const withImages = require('๋ค์ ์ด๋ฏธ์ง')module.exports = withSass();
module.exports = withImages();
``๊ทธ๊ฒ์ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ?
์๋
ํ์ธ์ ๋ฐฉ๊ธ ์ด๊ฑธ ๋ดค์ต๋๋ค. ํ์ง๋ง ์ฌ์ ํ ์ด๋ฏธ์ง์ URL์ ๋ฆฌ๋๋ ์
ํ๋ ๋ฐ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
const withSass = require('@zeit/next-sass');
const withImages = require('๋ค์ ์ด๋ฏธ์ง');
module.exports = withImages(withSass({
์นํฉ: ๊ธฐ๋ฅ(๊ตฌ์ฑ) {
// ์ฌ์ฉ์ ์ ์ ๊ตฌ์ฑ
๊ตฌ์ฑ ๋ฐํ
}
}));
๊ฐ์ฌํฉ๋๋ค
@imronunciable ๋ชจ๋ ํ์ผ์
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
@impronunciable ๋ชจ๋ ์ด๋ฏธ์ง๋ฅผ ๋์ผํ ๊ธ๋ก๋ฒ
static
ํด๋์ ์ ์ฅํ๋ ๊ฒ์ ์ข์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฌ์ฉ๋ ์ด๋ฏธ์ง์ ๋ ์ด์ ์ฌ์ฉ๋์ง ์๋ ์ด๋ฏธ์ง๋ฅผ 2๊ฐ์ ์์ ์ด๋ป๊ฒ ์ ์ ์์ต๋๊น? ์ด๋ฏธ์ง๋ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ๋ ๊ตฌ์ฑ ์์์ ๋์ผํ ํด๋์ ์ ์ฅ๋ ์ ์์ผ๋ฉฐ ์ถ์ํ ๊ณ์ธต์ ์ฌ์ฉํ์ฌ next.js ์์ฒด์ ์ํด /static์ผ๋ก ์ด๋ํ ์ ์์ผ๋ฏ๋ก ๋ค์๊ณผ ๊ฐ์ด ํ ์ ์์ต๋๋ค.import myImg from './myImg.png';
๊ทธ๋ฆฌ๊ณ ๋์ค์
<img src={myImg} />
์ข์ ๊ฐ๋ฐ์ ๊ฒฝํ์ด ๋ ๊ฒ์ ๋๋ค.