μλ νμΈμ,
ν΄λΌμ΄μΈνΈμ μλ² λͺ¨λμμ μλνλ μ΄λ―Έμ§ λ° κΈ°ν μμ°μλ‘λνλ κ°μ₯ μ’μ λ°©λ²μ 무μμ
λκΉ?
url-loader
λ° file-loader
λ₯Ό webpack ꡬμ±μ μΆκ° ν μ μμ§λ§ μλ²μμλ μλνμ§ μμ΅λλ€.
λ€λ₯Έ μ΅μ μ΄ μμ΅λκΉ?
κ°μ¬,
λ.
μλ₯Ό λ€μ΄ κΈκΌ΄μ κ²½μ° λ€μμ μΆκ° ν μ μμ΅λλ€.
,
{
test: /\.(woff)(\?v=[0-9]\.[0-9]\.[0-9])?$/,
loader: "url?limit=100000&mimetype=application/font-woff"
}
μλ²κ° μ΄λ―Έμ§ νμ₯μλ₯Ό μ΄ν΄νμ§ λͺ»ν©λλ€. ssrμ νμν νν¬λ₯Ό μ¬μ©ν΄μΌν©λλ€.
https://github.com/bahmutov/node-hook
λνμ΄ νμΌ μλ²μ μΆκ° ν μ μμ΅λλ€.
require('babel-register')
if (development variable) require.extensions['.png'] = function () {};
require('./server')
https://github.com/tcoopman/image-webpack-loader λ₯Ό μ¬μ©νμ¬ μ΄λ―Έμ§λ₯Ό μ²λ¦¬νμ΅λλ€. νμΌ λ‘λλ₯Ό κΈ°λ°μΌλ‘νλ€κ³ μκ°νμ§λ§ μ΄λ―Έμ§λ₯Ό μ΅μ ν ν μ μμ΅λλ€.
μ΄κ±° λ«μ
@jaredpalmer μλ νμΈμ, κ΅μ₯ν ν€νΈμ κ°μ¬λ립λλ€ :)μ΄ λ°±μ μ
// logo-component.js
import LogoImage from './logo.png' // colocated image in component folder
export default ({ linkUrl }) =>
<a href={linkUrl}>
<img src={LogoImage} alt="Logo" />
</a>
μμ κ²½μ°λ₯Ό μ²λ¦¬νκΈ° μν΄ webpack-isomorphic-tools
μ μ¬μ©νμ§λ§ μλνμ§λ§ μΈμ²΄ 곡ν λ° μ€μ μ΄ λ§€μ° λΆμμ§κΈ° μ½κ³ μλ§μΈ λλμ΄ λ€μμ΅λλ€. λ€λ₯Έ νλ‘μ νΈλ₯Ό μμνλ €κ³ ν©λλ€. μ¬λ¬λΆμ μκ°μ λ£κ³ μ λ§ μ’μ κ²μ
λλ€. μ κ·Ό λ°©μ- assets.json
λ ν΅κ³μ μ¬μ©λ μμλ κ² κ°μ΅λλ€.
λ€μ ν λ² jaredμκ² κ°μ¬λ립λλ€. μ 곡 ν μμλ λͺ¨λ λ°©ν₯, μμ©κ΅¬ λλ μΉν© ꡬμ±μ λλ¨ν κ°μ¬νκ² μ΅λλ€. μ€νν°μ μΆκ°νκ³ μΆμ κ²μ΄ μμΌλ©΄ PRμ μ μΆν΄ λλ¦¬κ² μ΅λλ€.
λλ μλ§ λ΄κ° μμ£Ό κ°λ¨ν ν΄κ²°μ± μ κ°κ³Όνκ³ μλ€κ³ μκ°νλ€ .... λ€μ κ°μ¬νλ€ !! :)
npmμ ν΅ν΄ url-loader
λ₯Ό μ€μΉνκ³ κ° webpack.configμ λ€μμ μΆκ°νκΈ° λ§νλ©΄λ©λλ€.
....
{
test: /\.(gif|jpe?g|png|ico)$/,
loader: 'url-loader?limit=10000'
},
{
test: /\.(otf|eot|svg|ttf|woff|woff2).*$/,
loader: 'url-loader?limit=10000'
}
...
κ·Έλ° λ€μ μμμ μ€λͺ
νλλ‘ μ νν μꡬν μ μμ΅λλ€. BTW limit λ§€κ° λ³μλ μ€μ λ‘ μ΄λ―Έμ§λ₯Ό μμ±ν΄μΌνλ μκ³ κ°κ³Ό data-uriλ₯Ό μμ±ν΄μΌνλ μκ³ κ°μμ url-loader
λ₯Ό μλ €μ€λλ€.
νΈμ§νλ€:
λν μΉν© μλ² κ΅¬μ±μμ new webpack.IgnorePlugin(/\.(css|less|scss|svg|png|jpe?g|png)$/),
λ₯Ό μ κ±°νμμμ€.
@jaredpalmer μλ΅μ κ°μ¬λ립λλ€ :) μ νν λ΄κ° https://www.npmjs.com/package/webpack-isomorphic-toolsλ₯Ό μ¬μ©νμ¬ ν΄κ²°ν μ μμμ§λ§ μ λ§ λλ λ§€μ° ν¬λ°ν ...
@ rowellx68 image-webpack-loaderλ₯Ό μ¬μ©νμ¬ μΈκΈ
@ b2 node-hook
μ루μ
μ λν μΆκ° 컨ν
μ€νΈ λ μμ λ₯Ό μ 곡 νμκ² μ΅λκΉ? νλμ 맀λνμ€νΈλ₯Ό μ¬μ©ν μ μλλ‘ μμ° νλ¬κ·ΈμΈκ³Ό ν΅ν©νλ λ°©λ²μ΄ μμ΅λκΉ?
@justingreenberg babel-registerλ μ΄λ―Έμ§ νμΌ μ νμ μ²λ¦¬ ν μ ββμμ΅λλ€. ν΄κ²° λ°©λ²μ μλ² λ₯Ό μμ νλ κ²
require('babel-register');
if (process.env.NODE_ENV == 'development') {
require.extensions['.png'] = function () {};
require.extensions['.jpg'] = function () {};
require.extensions['.jpeg'] = function () {};
require.extensions['.woff'] = function () {};
require.extensions['.woff2'] = function () {};
require.extensions['.ico'] = function () {};
require.extensions['.svg'] = function () {};
}
require('./server');
@justingreenberg image-webpack-loader
λ μ΄λ―Έμ§λ₯Ό μ΅μ νν©λλ€ ... file-loader
μ ν¨κ» μ¬μ©ν©λλ€.
...
{
test: /\.(png|jpg|jpeg|gif)(\?.*)?$/,
loaders: [
'file',
'image-webpack?' + JSON.stringify({
bypassOnDebug:true,
progressive: true,
optimizationLevel: 7,
interlaced: true,
pngquant: {
quality: "65-90",
speed: 4
},
svgo: {
removeUnknownsAndDefaults: false,
cleanupIDs: false
}
})
]
},
λλ μ¬μ ν κΈκΌ΄κ³Ό svgμ url-loader
λ₯Ό μ¬μ©ν©λλ€.
@ rowellx68 @ b2whats μ°λ¦¬λ url-loader
λ‘ μ΄κ²μ λν PRμ λ§λ€μ΄μΌν©λκΉ? devμμ require.extension
λ¨μ μ 무μμ
λκΉ? μΆμ
νμ§λ§ dev IMHOλ₯Ό μν΄ μλ²λ₯Ό λ²λ€λ‘ λ¬Άλ κ²λ³΄λ€ κΉ¨λν©λλ€. π€
@jaredpalmer re : ν¨μΉμλ ν΄κ²° λ°©λ²μ΄ νμν©λλ€. μ΄κ²μ ν₯λ―Έλ‘μ΄ μ κ·Ό λ°©μμ
λλ€. λ°λΌμ requireμ μλμΌλ‘ νμ₯μ λ±λ‘νλ©΄ λͺ¨λμ΄ url-loader
) λλ₯Ό μ μμ΅λλ€.
re : image-webpack, 그건 λ΄ μ΄ν΄ μμ§λ§ (μ λ§ μ΅μ ν) @ rowellx68 μ΄ μ΄λ―Έμ§μ μ¬μ©νκ³ μλ€κ³
λ€μ νλ² κ°μ¬λ립λλ€!
@jaredpalmer require.extensions
κ° λ μ΄μ μ¬μ©λμ§ μλ κ² κ°μ΅λλ€.
@justingreenberg re : image-webpack-loader
. μ€μ λ‘ μ£Όλ‘ μ΄λ―Έμ§ μ΅μ νλ₯Όμν κ²μ
λλ€. κ·Έλ¬λ κ²°κ³Ό μ΄λ―Έμ§λ assest.json
μΆκ°λμ§ μμμ΅λλ€.
λΏ‘λΏ‘
μ¬λΌμ΄μ€ κ°λ° λ° μ ν λͺ¨λκ° νμν©λλ€. webpack ꡬμ±μ λ€λ₯Ό μ μμ΅λλ€. κ°λ° λͺ¨λμμλ μλ²μμ μ΄λ―Έμ§μ μΌλ° URLμ κ°μ ΈμμΌν©λλ€. prod λͺ¨λμμλ λͺ¨λ μ΅μ νλ₯Ό μ¬μ©ν μ μμ΅λλ€.
λΉλ μ€ν¬λ¦½νΈλ₯Ό μμ νμ΅λλ€. μ΄μ robots.txt, favicon λ±μμν pbulic ν΄λκ° μμ΅λλ€. "μλ²½ν μ루μ
"μ μλμ§λ§ μλν©λλ€. λ²λ€ js-> public/assets
(gitμ 체ν¬μΈλμ§ μμ).
μ¦, μΈλΌμΈ μΊμ 무ν¨νλ₯Ό νμ©νλ κ²μ²λΌ 'μ requireHooks μ루μ μ @justingreenberg λͺ¨μ ν κ²μ λλ€.
μλ νμΈμ, μ΄κ²μ΄ λ²μλ₯Ό λ²μ΄λ κ²½μ° μλ €μ£Όμμμ€. κ·Έλ¬λ μ μ μμ° λ Όμλ λ€μ κ΄λ ¨μ΄μλ κ² κ°μ΅λλ€.
λλ μΉν© μΈκ³μ μλΉν μ΅μνμ§ μμ μ¬λμ΄κ³ (μ½λ λ°©λ² : μμ§ μ¬μ©νλ λ°©λ²μ λν λ¨μκ° μμ)μ΄ νλ‘μ νΈλ₯Ό μ¬μ©νμ¬ ν΄λΌμ΄μΈνΈμ μ€νμΌ κ°μ΄λλ₯Ό μ¬μ©νμ¬ μΉ μ±μ ꡬμΆνλ €κ³ ν©λλ€. CSS μ€νμΌμ λ°λ³΅ν΄μ μ μ©νλ λμ ν΄λΌμ΄μΈνΈμ μ€νμΌ κ°μ΄λκ° ν¬ν¨ λ CSS νμΌμλ‘λνλ €κ³ ν©λλ€. μ€νμΌ μνΈλ₯Ό μ μ μΌλ‘λ‘λ ν λ€μ μνλ‘λν λ₯Ό μ¬μ©νμ¬ λ μ΄μμ λ±μ κ΄λ¦¬νλ λΉ λ₯΄κ³ μλμ μΌλ‘ κ³ ν΅μλ λ°©λ²μ΄ μμ΅λκΉ?
target: 'node'
μ΅μ
μ μ¬μ©νμ¬ μΉν©κ³Ό ν¨κ» μλ² νλͺ©μ λ²λ€λ§νλ κ²μ μ΄λ»μ΅λκΉ?
μ°λ¦¬λ λ
Έλμ require ()λ₯Ό ν΄νΉνκ±°λ webpack-isomorphic-toolsλ₯Ό μ¬μ©ν νμμμ΄ μλ² μΈ‘μμ λͺ¨λ μΉν© λ‘λλ₯Ό μ¬μ©ν μ μμ΅λλ€.
μλλ©΄ λ΄κ° λ³΄μ§ λͺ»νμ΄ μ κ·Ό λ°©μμ μ€λν λ¬Έμ λ λ¨μ μ΄ μμ΅λκΉ? κ°λ°ν λ λ κ°μ μΉν© μκ³κ° νμν©λλ€.
νΈμ§ : μ΄λ―Έ prodλ₯Ό μν΄ μνλκ³ μμ§λ§ devλ μλ μ΄μ λ 무μμ λκΉ?
κ°μ₯ μ μ©ν λκΈ
@justingreenberg babel-registerλ μ΄λ―Έμ§ νμΌ μ νμ μ²λ¦¬ ν μ ββμμ΅λλ€. ν΄κ²° λ°©λ²μ μλ² λ₯Ό μμ νλ κ²