yarn dev
μ€νν λ HMRμ λΉνμ±ννλ λ°©λ²μ΄ κΆκΈν©λλ€.
HMRμ νμ κ°λ° λͺ¨λμμ μ§μλ©λλ€. 곡μμ μΌλ‘ λλ λ°©λ²μ μμ΅λλ€.
λ¨κΈ°κ°μ ν κ³νμ μμ΅λλ€.
μ΄κ²μ΄ μλ²μ λΆνλ₯Ό μΌμΌν€μ§ μλκ°, μ°λ¦¬λ νλ‘λμ μμ μ€ννκΈ° μν΄ HMRμ λλ λ°©λ²μ΄ νμν©λλ€.
μμ°μ€μ
λλ€. νλ‘λμ
μμ next build
λ° next start
λλ next build
λ° NODE_ENV=production node server.js
λ₯Ό μ€ν μ€μΈμ§ νμΈνμμμ€.
HMRμ λλ©΄ λ μ΄μμμμ μμ
ν λ μ μ©ν μ μμ΅λλ€. styled-components
λ° μΌλΆ μ μ CSS μ€νμΌμ νΈμ§νκ³ μμ§λ§ λ―Έλ¦¬λ³΄κΈ°κ° κ³§ κΉ¨μ§λλ€. κ·Έ μ΄μ λ νμ΄μ§μ SSR λ λλ§ μ€νμΌκ³Ό λ°©κΈ μμ±λ μ€νμΌμ΄ νΌν©λμ΄ μκΈ° λλ¬Έμ
λλ€. HMRμ λλ κ² μΈμλ μ΄λ₯Ό 극볡ν λ°©λ²μ΄ μλ κ² κ°μ΅λλ€.
HMRμ΄ μ¬μ ν ES5μλ§ νΈνλλ κ² μΈμλ(λͺ¨λ μ¬λμ΄ λ μ΄μ ν΄λμ€λ₯Ό νΈλμ€νμΌν νμκ° μμ), μ λ κ°λ° λ¨κ³μμλ§ λ°μνλ νΌλμ€λ¬μ΄ HMR κ΄λ ¨ λ²κ·Έλ₯Ό μ κΈ°μ μΌλ‘ μ νκ³ μμ΅λλ€. λΉνμ±ννλ λ°©λ²μ΄ μμΌλ©΄ μ λ§ μ’κ² μ΅λλ€.
ν΄νΉ μ루μ μ‘°μ°¨λ κ°μ¬ ν κ²μ λλ€. μ λͺ½μΌλ‘ λ°λκ³ μμ΅λλ€.
κ΄λ ¨ λ¬Έμ κ° λ°μνλ€κ³ μκ°ν©λλ€. νμ¬ Next.js νμ΄μ§μμ react-waypointλ₯Ό μ¬μ©νλ €κ³ ν©λλ€. Waypoint μ΄λ²€νΈ νΈλ€λ¬ λ΄μμ this.setState
λ₯Ό νΈμΆνλ©΄ Maximum call stack size exceeded
μ€λ₯κ° λ°μν©λλ€. μ΄κ²μ κ°λ° λͺ¨λμμ Next.jsλ₯Ό μ€νν λλ§ λ°μν©λλ€. I npm run build
λ° npm start
κ²½μ° λ¬Έμ κ° λ°μνμ§ μμ΅λλ€.
μλ§λ μ΄ λ¬Έμ μ κ΄λ ¨
μ΄λ€ μμΌλ‘λ μ΄ λ¬Έμ λ₯Ό λ€μ μ΄ μ μμ΅λλ€. HMRμ μ¬λ¬ μν©μμ λ§€μ° μ±κ°μ€ μ μμ΅λλ€. μ΄κ²μ΄ μ°μ μμκ° μλ κ²½μ° ν΄λΉ μ½λλ₯Ό μ°Ύμ μ μλ μμΉμ λν μ 보λ₯Ό μ 곡νκ±°λ(μλμΌλ‘ λΉνμ±ννκΈ° μν΄) PR @arunodaλ₯Ό λ§λ€ μ
μ§κΈ μ°λ¦¬λ Apollo GraphQL + Next JS(5.0.0)μ ν° λ¬Έμ λ₯Ό κ²ͺκ³ μμ΅λλ€. getDataFromTreeλ μλνμ§ μμΌλ©° μ΄λ μ€μ μμ λ§μ λΆλΆμ κΉ¨λ¨λ¦½λλ€.
@timneutkens , @arunoda , λ€μ μ΄ μ μλμ?
그건 κ·Έλ κ³ https://github.com/zeit/next.js/issues/1938#issuecomment -358195616
shouldComponentUpdate μ λ¬Έμ κ° μλ κ² μμλ ν« λ¦¬λ‘λ© κΈ°λ₯
νλ‘λμ λͺ¨λμμ λ‘μ»¬λ‘ μ€ννκ³ κΈ°λ₯μ μΌλΆ λ‘κΉ μ μΆκ°νλ€κ³ λ§νκ³ μΆμ΅λλ€.
μ΄κ² μ€μν κ² κ°λ€.
λλ‘λ λΆνμν λ©μμ§ λ Έμ΄μ¦λ‘ κ°λ° λꡬ λ€νΈμν¬ νμ μ΄μ§λ½νλ κ²μ νΌνκΈ° μν΄ κ°λ° λͺ¨λμμ HMRμ λΉνμ±ννκ³ μΆμ΅λλ€.
"on-demand-entries-ping?page=/xxx" λ±
νμ΄μ§λ₯Ό μλ‘κ³ μΉ¨νκΈ° μν΄ CMD-Rμ λλ₯΄λ κ²μ ν° λ¬Έμ κ° λμ§ μμΌλ©°, prod λͺ¨λμμ μ λ°μ΄νΈλ₯Ό λ°κΈ° μν΄ μλ²λ₯Ό λ€μ μμνλ κ²μ κ³ ν΅μ€λ½μ΅λλ€.
ν΄κ²° λ°©λ²μΌλ‘ ν¬λ‘¬ κ°λ° λꡬμ "μμ² μ°¨λ¨" κΈ°λ₯μ μ¬μ©νμ¬ hmr μμ²μ λ°©μ§ν μ μμ΅λλ€.
@vanmik μ’μ ν, κ°μ¬ν©λλ€! β¨
Chrome(μ΅μ 66)μμ μμ² μ°¨λ¨μ μ°ΎμΌλ €λ©΄ λ€μμ μνν΄μΌ ν μ μμ΅λλ€.
'DevTools μ¬μ©μ μ§μ λ° μ μ΄'(μΈλ‘ μ 3κ°) > More tools
> Request Blocking
μ½λλ€. κ·Έλ¬λ©΄ @vanmik μ μ€ν¬λ¦°μ·κ³Ό κ°μ΄ μ°¨λ¨ν μμ² μμ€λ₯Ό νμΈν μ μλ μμ² μ°¨λ¨ μ½μμ΄ μ΄λ¦½λλ€.
κ°λ° λꡬμ κ΅νλμ§ μλλ€λ μ μ μΈκΈνκ³ μΆμ΅λλ€. λΈλΌμ°μ νλ¬κ·ΈμΈμ μ¬μ©νμ¬ μμ²μ μ°¨λ¨ν μ μμ΅λλ€. μ΄ κ²½μ° λ§€λ² κ°λ° λꡬλ₯Ό μ΄μ΄ λ νμκ° μμ΅λλ€.
κ·Έλ¬λ λ―Έλμλ λ€μκ³Ό κ°μ΄ κ°λ¨ν κ²μ μ»μ μ μκΈ°λ₯Ό λ°λλλ€.
// next.config.js
module.exports = {
hmr: false
}
HRMμ μ§μ¦λ. μ΄λ μ΄μ λ³΄λ€ λ μμ£Ό μ΄λ €μμ κ°μ Έμ΅λλ€(μ: μ½λμ μΌλΆλ ν« λ¦¬λ‘λλκ³ μΌλΆλ κ·Έλ μ§ μμ μΌκ΄μ± μλ μνλ₯Ό μ λ°νλ κ²½μ°).
@vanmik μ νμ΄ μ€μ HMR μμ
μ μ€μ§νλ λμ λ΄ κ°λ° μ½μμ μ¬μ ν http://localhost:3000/_next/on-demand-entries-ping?page=/xxx
νλͺ©μΌλ‘ 볡μ‘νμ§λ§ μ§κΈμ μ€λ₯μ
λλ€.
λλ²κΉ μ νμ©λμ§ μμ :-/
νμ€ν κ°κ³ μΆμ΄
// next.config.js
module.exports = {
hmr: false
}
λκ΅°κ° μ΄κ²μ μν νλ¬κ·ΈμΈμ μμ±ν μ μμκΉμ ???
@gihrig μ½μ 컨ν μ€νΈ λ©λ΄λ₯Ό μ¬μ©νμ¬ μ΄λ¬ν μ€λ₯λ₯Ό νν°λ§ν μ μμ΅λλ€(μ€λ₯λ₯Ό λ§μ°μ€ μ€λ₯Έμͺ½ λ²νΌμΌλ‘ ν΄λ¦).
@arunoda μ΄κ²μ μ§μ μ΄ μμ΅λκΉ? HMR λ° immutablejs proptypesμ λ¬Έμ κ° μμ΅λλ€. λ§€μ° μ€λ§μ€λ½μ΅λλ€. μ°Έμ‘°: https://github.com/facebook/prop-types/issues/221
μ΄μ λν λ΄ ν΄κ²° λ°©λ²μ request blocking
λ₯Ό νμ±νν λ€μ μ°¨λ¨λ μμ² λͺ©λ‘μ on-demand-entries-ping
μμ²μ μΆκ°νλ κ²μ
λλ€. μ μ²λΌ HMRμ μ«μ΄νμλ λΆλ€κ» μ‘°κΈμ΄λλ§ λμμ΄ λμμΌλ©΄ ν©λλ€.
Next.js v7+μμ HMR(Hot Module Reloading)μ λΉνμ±ννλ €λ©΄ next.config.js
νμΌμ λ€μμ μΆκ°νμΈμ.
module.exports = {
webpackDevMiddleware: (config) => {
config.watchOptions = config.watchOptions || {};
config.watchOptions.ignored = [
// Don't watch _any_ files for changes
/.*/,
];
return config;
},
};
μ΄λ κ² νλ©΄ λ³κ²½ μ μ¬κ΅¬μΆμ΄ λΉνμ±νλμ΄ λΈλΌμ°μ κ° λ³κ²½ μ¬νμ "λ³Ό" μ μμΌλ―λ‘ μ무 κ²λ λ€μ λ‘λνμ§ μμ΅λλ€. μ΄κ²μ Next.js κ° λ³κ²½ μ¬νμ λν΄ λ€μ μ»΄νμΌλμ§ μμμ μλ―Έν©λλ€. λ³κ²½ μ¬νμ΄ μμ λλ§λ€ next.js μλ²λ₯Ό λ€μ μμν λ€μ λΈλΌμ°μ λ₯Ό μλ‘ κ³ μ³μΌ ν©λλ€.
λ³κ²½ν λλ§λ€ μ 체 νμ΄μ§λ₯Ό κ°μ λ‘ λ€μ λ‘λνλ μ루μ μ μλμ μ΄ μ€λͺ μ μ°Έμ‘°νμΈμ .
FWIW 곧 λ³ν©: https://github.com/zeit/next.js/pull/4508
λ³κ²½ μ νμ νμ΄μ§λ₯Ό λ€μ λ‘λ νλ μ루μ
μ κ²½μ° server.js
λ§λ€ μ
const next = require('next')
const dev = process.env.NODE_ENV !== 'production'
const app = next({ dev })
const handle = app.getRequestHandler()
app.prepare().then(() => {
// βΉοΈ Below is the magic which forces a page reload on every change
// βΉοΈ From https://github.com/zeit/next.js/issues/1109#issuecomment-446841487
// The publish function tells the client when there's a change that should be hot reloaded
const publish = app.hotReloader.webpackHotMiddleware.publish.bind(
app.hotReloader.webpackHotMiddleware,
);
// Intercept publish events so we can send something custom
app.hotReloader.webpackHotMiddleware.publish = (event, ...rest) => {
let forwardedEvent = event;
// upgrade from a "change" to a "reload" event to trick the browser into reloading
if (event.action === 'change') {
forwardedEvent = {
action: 'reload',
// Only `/_document` pages will trigger a full browser refresh, so we force it here.
data: ['/_document'],
};
}
// Forward the (original or upgraded) event on to the browser
publish(forwardedEvent, ...rest);
};
// βΉοΈ End force page reload on change
// ... Whatever custom server setup you have. See: https://github.com/zeit/next.js/#custom-server-and-routing
});
λλ μ΄κ²μ΄ λ―Έλμ 무λμ§ κ²μ΄λΌκ³ 80% νμ νλ€.
λμ°ν ν΄νΉμ΄μ§λ§ λΈλΌμ°μ νμ΄ >100% CPUλ₯Ό μλΉν λ€μ ν« μλ‘κ³ μΉ¨ν λλ§λ€ Chromeμμ μΆ©λμ μΌμΌν€λ λ²κ·Έλ₯Ό ν΄κ²°ν μ μλ μ μΌν λ°©λ²μ΄μμ΅λλ€.
ν΄νΉμ΄ μ€λ¨λ λκΉμ§ 곡μ μ루μ μ΄ μκ±°λ μ΄ λ¬Έμ μμ μΈκΈλ λ²κ·Έκ° μμ λκΈ°λ₯Ό λ°λλλ€ π
HMRμ λΉνμ±ννλ €λ μ΄μ λ HMR μ λ°μ΄νΈκ° λ°±κ·ΈλΌμ΄λμμ κ³μ λ°μνκΈ° λλ¬Έμ μ λ ₯ν λ DevTools/Applications/Cookies(Chrome Windows) ν¨λμ΄ ν¬μ»€μ€λ₯Ό μκΈ° λλ¬Έμ λλ€. webpackDevServerμ λͺ¨λ νμΌμ 무μνλλ‘ μ§μν΄λ μ΄ κ²½μ°κ° μλκΉ μκ°ν©λλ€. websocket μ°κ²°μ μ¬μ ν ββλ°±κ·ΈλΌμ΄λμμ μ΄λ£¨μ΄μ§λ©° μΏ ν€ ν¨λμ μ€λμ±νλ κ²μ μ΄ μ°κ²°μ΄λΌκ³ μκ°ν©λλ€.
μμ : μ΄μμ μΈ μ루μ μ HMRμ μμ ν λΉνμ±νν΄μΌ ν©λλ€. κ°μ¬ ν΄μ!
λΆννλ μ΄κ²μ next.config.js
μΆκ°ν μ μμ΅λλ€.
module.exports = {
webpackDevMiddleware: config => {
config.lazy = true;
return config;
},
};
μ΄ μ΅μ μ λͺ¨λμ΄ 'μ§μ°' λͺ¨λμμ μλνλλ‘ μ§μν©λλ€. μ¦, νμΌμ΄ λ³κ²½λ λ λ€μ μ»΄νμΌνμ§ μκ³ κ° μμ²μ λ°λΌ λ€μ μ»΄νμΌν©λλ€. @jesstelford μ μ루μ κΉμ§ κ°μ§ μκ³ λ μ°λ¦¬ μ€ λ§μ μ¬λλ€μ΄ λ°λΌκ³ μλ κ²μ²λΌ
μΆμ² : https://github.com/webpack/webpack-dev-middleware#lazy
next 7.0.2
μμ μ΄κ²μ μλνλ©΄ λ€μ μ€λ₯κ° λ°μν©λλ€.
μ€λ Create React App νλ‘μ νΈμ ν¨κ» μΌν κΈ°νκ° μμμ΅λλ€.
μ΄ HMR λ¬Έμ μ λΏλ¦¬λ HMRμ΄ κ΅¬νλλ λ°©μλ§νΌ μ νλ€λ κ²μ΄ μλλλ€.
κ°λ¨ν λ§ν΄μ ν΄λΌμ΄μΈνΈκ° μ£ΌκΈ°μ μΌλ‘ μλ²λ₯Ό ν΄λ§νλλ‘ νλ κ²μ μ΄μμ μ΄μ§ μμ΅λλ€.
νΌμμ μΈ κ΄μ°°μμ CRAλ νμΌμ΄ λ³κ²½λμμ λλ§ ν΄λΌμ΄μΈνΈμ ν΅μ νλ μμΌ μ°κ²°μ μ¬μ©νκ³ ν΄λΌμ΄μΈνΈκ° νμ΄μ§λ₯Ό λ€μ λ‘λνλ κ²μΌλ‘ 보μ λλ€. μ΄ κ΅¬μ±νλ₯Ό μ¬μ©νλ©΄ μμ μ΄ λ€μ ν΄λ§ κ°κ²©μ μ’ μλμ§ μμΌλ―λ‘ λΈλΌμ°μ μλ‘ κ³ μΉ¨μ΄ λ λΉ¨λΌμ§λλ€.
CRAλ μ€ν μμ€ μ λλ€. μκ°κ³Ό κ΄μ¬μ΄ μλ μ¬λμ΄ Nextμ HMRμ μ κ·Έλ μ΄λνμ¬ CRA λͺ¨λΈμ λ°λΌκ° μ μλ€λ©΄ μ’μ κ²μ λλ€(λ¬Όλ‘ μ½κ² λΉνμ±νν μλ μμ΅λλ€ :-)
@gihrig μ¬λλ€μ΄ HMRμ λΉνμ±ννλ €λ λͺ κ°μ§ λ€λ₯Έ μ΄μ κ° μμ μ μμ΅λλ€.
λ΄κ° μ΄ν΄νλ λ°μ λ°λ₯΄λ©΄ react-hot-loaderλ μ ν리μΌμ΄μ μμ± λ°©λ², μν λͺ¨λΈλ§ λ°©λ², μ€μν κ°μ²΄ ID λΆμ¬μ λν νΉμ κ°μ μ΄ νμν©λλ€. μ΄λ¬ν κ°μ μ μΌλ°μ μΌλ‘ μ¬λ°λ₯΄κ² μμ±λ redux κΈ°λ° μ±μ μ μ©λμ§λ§ λ€λ₯Έ μ κ·Ό λ°©μμ μ¬μ©νμ¬ μ€κ³λ μ±μλ μ μ©λμ§ μμ μ μμ΅λλ€. λλ λ¬Έμ κ° HMRμ΄ λμλ€λ κ²μ΄ μλλΌλ λ° λμν©λλ€. λ¨μ§ μΌλ°μ μΈ λκ΅¬κ° μλλΌλ κ²λΏμ λλ€. μ΄κ²μ μ΄λ¬ν λμμΈ κ²°μ μ λν΄ λΆκ°μ§λ‘ μ μΈ νλ μμν¬μ λ§₯λ½μμ μ½κ°μ λΆμΌμΉλ₯Ό λ§λλλ€.
ν΄λ§μμ μΉ μμΌμΌλ‘ μ ννλ κ²μ μ’μ μκ°μΌ μ μμ§λ§ ν΄λ§μ "λ¬Έμ μ κ·Όλ³Έ"μ΄ μλκ±°λ μ¬κΈ° μ¬λλ€μ΄ μ§λ©΄ν λ¬Έμ μ€ μ μ΄λ μΌλΆμ κ΄λ ¨μ΄ μμ΅λλ€.
λ§μ§λ§ 2κ°μ λκΈμ λͺ¨λ μλͺ»λ κ°μ μ ν©λλ€.
@timneutkens μ λ§
μ¬μ€, μ΄μ ES2017 λΉλλ₯Ό devμμ μ€νν μ μμ΅λλ€!
μ¬λλ€μ΄ HMRμ λν΄ λΆννμ§ 2λ μ΄ μ§λ μ§κΈλ 곡μμ μΌλ‘ λΉνμ±νν μ μλ λ°©λ²μ΄ μλ€?!
λ΄ NON next.js μ±μμ μ΄ λ‘κ·ΈμΈμ΄ GET /_next/on-demand-entries-ping?page=/μΈ μ΄μ λ 무μμ λκΉ?
-- self-resolved: λ‘κ±°λ₯Ό μ£Όμ μ²λ¦¬ν΄μΌ νμ΅λλ€. app.use.(morgan(dev)) μ΄μν μ μ Morganμ΄ next.jsκ° μλ λ€λ₯Έ μ±μ μ€μΉλμλ€λ κ²μ λλ€. λͺ¨κ±΄, μ μ΄λ° μΌμ΄ μΌμ΄λλμ§ μκ³ μΆμ΅λλ€. μ΄κ²μ λ€λ₯Έ νλ‘μ νΈμ next.jsλ₯Ό μ€μΉνκΈ° μ μλ λ°μνμ§ μμμ΅λλ€.
λ¬Έμ λ νμ€ν ν΄κ²°λμ§ μμμ΅λλ€.
+1
κ°μ₯ μ μ©ν λκΈ
μ¬λλ€μ΄ HMRμ λν΄ λΆννμ§ 2λ μ΄ μ§λ μ§κΈλ 곡μμ μΌλ‘ λΉνμ±νν μ μλ λ°©λ²μ΄ μλ€?!