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ãéçºã¢ãŒãã§å®è¡ããŠããå Žåã«ã®ã¿çºçããŸãã 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ã¢ãŒãã§æŽæ°ãååŸããã®ã¯é¢åã§ãã
åé¿çãšããŠãChromeéçºããŒã«ã®ããªã¯ãšã¹ããããã¯ãæ©èœã䜿çšããŠ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ã®ããããã£ã¿ã€ãã«åé¡ããããŸã-éåžžã«ã€ã©ã€ã©ããŸãã åç §ïŒ https ïŒ
ããã«å¯Ÿããç§ã®åé¿çã¯ã request blocking
ãæå¹ã«ããŠããããããã¯ããããªã¯ãšã¹ãã®ãªã¹ãã«on-demand-entries-ping
ãªã¯ãšã¹ããè¿œå ããããš
Next.js v7 +ã§ãããã¢ãžã¥ãŒã«ãªããŒãïŒHMRïŒãç¡å¹ã«ããã«ã¯ãããã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ãå€æŽæã«åã³ã³ãã€ã«ãããªãããšãæå³
å€æŽã®ãã³ã«ããŒãžå šäœã匷å¶çã«åèªã¿èŸŒã¿ãããœãªã¥ãŒã·ã§ã³ã«ã€ããŠã¯ã以äžã®ã³ã¡ã³ããåç §ããŠãã ããã
FWIWã¯ãããããã«ããŒãžããŸãïŒ //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æ¥ç¶ã¯åŒãç¶ãããã¯ã°ã©ãŠã³ãã§è¡ãããCookieããã«ãã¹ã©ãã·ã³ã°ããŠããã®ã¯ãã®æ¥ç¶ã§ãããšç§ã¯ä¿¡ããŠããŸãã
èŠç¹ïŒçæ³çãªãœãªã¥ãŒã·ã§ã³ã§ã¯ãHMRãå®å šã«ç¡å¹ã«ããå¿ èŠããããŸãã ããããšãïŒ
æ®å¿µãªããããããnext.config.js
è¿œå ããããšã¯ã§ããŸããã
module.exports = {
webpackDevMiddleware: config => {
config.lazy = true;
return config;
},
};
ãã®ãªãã·ã§ã³ã¯ãã¢ãžã¥ãŒã«ã«ãã¬ã€ãžãŒãã¢ãŒãã§åäœããããã«æ瀺ããŸããã€ãŸãããã¡ã€ã«ãå€æŽããããšãã«åã³ã³ãã€ã«ãããã®ã§ã¯ãªããèŠæ±ããšã«åã³ã³ãã€ã«ãããŸãã @jesstelfordã®ãœãªã¥ãŒã·ã§ã³ãŸã§è¡ããªããŠããç§ãã¡ã®å€ããæãã§ããããšã®ããã«
ãœãŒã¹ïŒ https ïŒ
next 7.0.2
ã§ãããè©ŠããŠã¿ããšã次ã®ãšã©ãŒãçºçããŸãã
ä»æ¥ãCreate ReactAppãããžã§ã¯ãã§äœæ¥ããæ©äŒããããŸããã
ãã®HMRã®åé¡ã®æ ¹æ¬ã¯ãHMRãå®è£ ãããŠããæ¹æ³ã»ã©æªã§ãããšããããšã§ã¯ãªããšæããŸãã
ç°¡åã«èšãã°ãã¯ã©ã€ã¢ã³ãããµãŒããŒãå®æçã«ããŒãªã³ã°ããããšã¯çæ³çãšã¯èšããŸããã
ãã£ãšèŠ³å¯ãããšãCRAã¯ããã¡ã€ã«ãå€æŽããããšãã«ã®ã¿ã¯ã©ã€ã¢ã³ããšéä¿¡ãããœã±ããæ¥ç¶ã䜿çšããŠããããã«èŠããŸãããã®åŸãã¯ã©ã€ã¢ã³ãã¯ããŒãžããªããŒãããŸãã ãã®ã¹ããŒã ã§ã¯ãæäœã次ã®ããŒãªã³ã°ééã«äŸåããªãããããã©ãŠã¶ãŒã®æŽæ°ãé«éã«ãªããŸãã
CRAã¯ãªãŒãã³ãœãŒã¹ã§ãã æéãšé¢å¿ã®ãã人ãNextã®HMRãã¢ããã°ã¬ãŒãããŠCRAã¢ãã«ã«åŸãããšãã§ããã°çŽ æŽããããšæããŸãïŒãã¡ãããç°¡åã«ç¡å¹ã«ããããšãã§ããŸã:-)
@gihrig人ã ãHMRãç¡å¹ã«ããããšããŠããçç±ã¯ããããããã€ããããŸãã
ç§ã®ç解ã§ã¯ãreact-hot-loaderã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã®äœææ¹æ³ãç¶æ ã®ã¢ãã«åæ¹æ³ãããã³éèŠãªãªããžã§ã¯ãIDã®æ¬ åŠã«ã€ããŠä¿æããããã®ç¹å®ã®ä»®å®ãå¿ èŠã§ãã ãããã®ä»®å®ã¯éåžžãæ£ããèšè¿°ãããreduxããŒã¹ã®ã¢ããªã«ã¯åœãŠã¯ãŸããŸãããä»ã®ã¢ãããŒãã䜿çšããŠèšèšãããã¢ããªã«ã¯åœãŠã¯ãŸããªãå ŽåããããŸãã åé¡ã¯HMRãæªã§ãããšããããšã§ã¯ãªããäžè¬çãªããŒã«ã§ã¯ãªããšããããšã ãã«åæããŸãã ããã«ããããããã®èšèšäžã®æ±ºå®ã«ãšããããªããã¬ãŒã ã¯ãŒã¯ã®ã³ã³ããã¹ãã§äžååé³ãçºçããŸãã
ããŒãªã³ã°ããWebSocketã«åãæ¿ããããšã¯ããããè¯ãèãã§ãããããŒãªã³ã°ã¯ãåé¡ã®æ ¹æ¬ãã§ã¯ãªãããããããã§äººã ãééããåé¡ã®å°ãªããšãããã€ããšã¯ç¡é¢ä¿ã§ãã
æåŸã®2ã€ã®ã³ã¡ã³ãã¯ã©ã¡ããééã£ãä»®å®ãããŠããããšã«æ³šæããŠãã ããã
@timneutkensèããŠ
å®éãES2017ãã«ããéçºã§å®è¡ã§ããããã«ãªããŸããïŒ
2幎éHMRã«ã€ããŠäžå¹³ãèšã£ãåŸããããç¡å¹ã«ããå ¬åŒã®æ¹æ³ã¯ãŸã ãããŸãããïŒ!!
ãã®logginãNONnext.jsã¢ããªã§/ _next / on-demand-entries-pingïŒpage = /ãååŸããã®ã¯ãªãã§ããïŒ
-èªå·±è§£æ±ºïŒãã¬ãŒapp.useãã³ã¡ã³ãã¢ãŠãããå¿ èŠããããŸãããïŒmorganïŒdevïŒïŒå¥åŠãªããšã«ãMorganã¯next.jsã®ãªãå¥ã®ã¢ããªã«ã€ã³ã¹ããŒã«ãããŠãããããããããã°ã«èšé²ãããŠäœããèµ·ãã£ãŠããŸããã¢ãŒã¬ã³ããªããããèµ·ãã£ãŠããã®ãç¥ãããã ããã¯ãnext.jsãå¥ã®ãããžã§ã¯ãã«ã€ã³ã¹ããŒã«ããåã¯çºçããŠããŸããã§ããã
åé¡ãå床éããŠãã ãããåé¡ã¯å®å šã«è§£æ±ºãããŠããŸããã
+1
æãåèã«ãªãã³ã¡ã³ã
2幎éHMRã«ã€ããŠäžå¹³ãèšã£ãåŸããããç¡å¹ã«ããå ¬åŒã®æ¹æ³ã¯ãŸã ãããŸãããïŒ!!