Next.jsã®ãã³ãã«åæãã¯ããã¯ãçšããŠããã«ããµã€ãºãæé©åããã°ããŒãã«ãªãªãŒãã£ãšã³ã¹ã«åããŠãŠã§ããµã€ãã®ããã©ãŒãã³ã¹ãåäžãããããã®å æ¬çãªã¬ã€ãã
Next.js ãã³ãã«åæïŒã°ããŒãã«ããã©ãŒãã³ã¹ã®ããã®ãã«ããµã€ãºæé©å
仿¥ã®ãŸããŸãã°ããŒãã«åãé²ãäžçã«ãããŠãé«éãã€å¹ççãªãŠã§ãäœéšãæäŸããããšãæãéèŠã§ãã倿§ãªå°ççå Žæãã€ã³ã¿ãŒãããé床ãããã€ã¹ã®æ©èœãæã€ãŠãŒã¶ãŒã¯ãã·ãŒã ã¬ã¹ãªã€ã³ã¿ã©ã¯ã·ã§ã³ãæåŸ ããŠããŸãã人æ°ã®Reactãã¬ãŒã ã¯ãŒã¯ã§ããNext.jsã¯ãããã©ãŒãã³ã¹ã®é«ããŠã§ãã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®åŒ·åãªæ©èœãæäŸããŸãããããããã«ããµã€ãºã®æé©åãæ ããšãç¹ã«åž¯åå¹ ãéãããŠããããŸãã¯å€ãããã€ã¹ã䜿çšããŠãããŠãŒã¶ãŒã«ãšã£ãŠããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã«å€§ããªåœ±é¿ãäžããå¯èœæ§ããããŸãããã®ã¬ã€ãã§ã¯ãNext.jsã®ãã³ãã«åæãã¯ããã¯ãšãã«ããµã€ãºãæå°éã«æããããã®æŠç¥ãå æ¬çã«æŠèª¬ããã°ããŒãã«ãªãªãŒãã£ãšã³ã¹ã«åããŠæé©ãªããã©ãŒãã³ã¹ãä¿èšŒããŸãã
Next.js ãã³ãã©ãŒã®çè§£
Next.jsã¯ãå éšã§WebpackïŒãŸãã¯å°æ¥ã®ããŒãžã§ã³ã§ã¯ä»ã®ãã³ãã©ãŒã®å¯èœæ§ããããŸãïŒã䜿çšããŠãJavaScriptãCSSãããã³ãã®ä»ã®ã¢ã»ãããæé©åããããã³ãã«ã«ãŸãšãããã©ãŠã¶ã«æäŸããŸãããã³ãã©ãŒã®äž»ãªåœ¹å²ã¯ããã¹ãŠã®ãœãŒã¹ã³ãŒããšäŸåé¢ä¿ãååŸãããããããŠãŒã¶ãŒã®ãã©ãŠã¶ã«å¹ççã«é ä¿¡ã§ããäžé£ã®ãã¡ã€ã«ã«å€æããããšã§ãããã³ãã©ãŒã®ä»çµã¿ãçè§£ããããšã¯ãæé©åã®æœåšçãªé åãç¹å®ãã察åŠããããã«éåžžã«éèŠã§ãã
äž»èŠãªæŠå¿µ
- ãã³ãã«: ãã³ãã©ãŒã«ãã£ãŠçæãããåºåãã¡ã€ã«ã§ãã¢ããªã±ãŒã·ã§ã³ã®ã³ãŒããšã¢ã»ãããå«ãŸããŠããŸãã
- ãã£ã³ã¯: ãã³ãã«å ã®ããå°ããªã³ãŒãåäœã§ãå€ãã®å Žåãã³ãŒãåå²ã«ãã£ãŠäœæãããŸãã
- ã³ãŒãåå²: ã¢ããªã±ãŒã·ã§ã³ã®ã³ãŒããããªã³ããã³ãã§ããŒãã§ããããå°ããªãã£ã³ã¯ã«åå²ããåæããŒãæéãæ¹åããŸãã
- Tree Shaking: ãã³ãã«ãããããã³ãŒãïŒæªäœ¿çšã³ãŒãïŒãåé€ããããã»ã¹ã§ãã
- äŸåé¢ä¿: ã¢ããªã±ãŒã·ã§ã³ãäŸåããå€éšã©ã€ãã©ãªããã³ããã±ãŒãžã§ãã
ãã«ããµã€ãºãã°ããŒãã«ãªãŒãã£ãšã³ã¹ã«ãšã£ãŠéèŠãªçç±
ãã«ããµã€ãºã¯ãè¯å®çãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã«ãšã£ãŠéèŠãªãããã€ãã®äž»èŠãªããã©ãŒãã³ã¹ã¡ããªã¯ã¹ã«çŽæ¥åœ±é¿ãäžããŸããç¹ã«ãã€ã³ã¿ãŒãããæ¥ç¶ãé ãå°åã«ãããŠãŒã¶ãŒã«ãšã£ãŠã¯éèŠã§ãã
- Time to First Byte (TTFB): ãã©ãŠã¶ããµãŒããŒããããŒã¿ã®æåã®ãã€ããåä¿¡ãããŸã§ã«ãããæéããã«ããµã€ãºã倧ããã»ã©ãTTFBãå¢å ããŸãã
- First Contentful Paint (FCP): æåã®ã³ã³ãã³ããç»é¢ã«è¡šç€ºããããŸã§ã«ãããæéã
- Largest Contentful Paint (LCP): æå€§ã®ã³ã³ãã³ãèŠçŽ ã衚瀺ããããŸã§ã«ãããæéã
- Time to Interactive (TTI): ããŒãžãå®å šã«ã€ã³ã¿ã©ã¯ãã£ãã«ãªããŸã§ã«ãããæéã
- ãŠãŒã¶ãŒãšã³ã²ãŒãžã¡ã³ããšã³ã³ããŒãžã§ã³ç: ããŒããé ããŠã§ããµã€ãã¯ãå€ãã®å ŽåãããŠã³ã¹çãé«ããªããã³ã³ããŒãžã§ã³çãäœäžããŸãã
ããšãã°ãæ±åã¢ãžã¢ã®ãŠãŒã¶ãŒã3Gæ¥ç¶ã®ã¢ãã€ã«ããã€ã¹ã§eã³ããŒã¹ãŠã§ããµã€ãã«ã¢ã¯ã»ã¹ããããšãèããŠã¿ãŸãããã倧ãããæé©åãããŠããªããã³ãã«ã¯ãFCPãšTTIãå€§å¹ ã«é å»¶ããå¯èœæ§ããããäžæºã®æ®ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãšæœåšçãªå£²äžã®æå€±ã«ã€ãªãããŸãããã«ããµã€ãºãæé©åããããšã§ãå Žæãã€ã³ã¿ãŒãããé床ã«é¢ä¿ãªãããã¹ãŠã®ãŠãŒã¶ãŒã«ã¹ã ãŒãºã§é«éãªãšã¯ã¹ããªãšã³ã¹ãæäŸã§ããŸãã
Next.js ãã³ãã«åæã®ããã®ããŒã«
Next.jsãã³ãã«ãåæããæé©åã®é åãç¹å®ããããã«ãããã€ãã®ããŒã«ãå©çšå¯èœã§ãã
Webpack Bundle Analyzer
Webpack Bundle Analyzerã¯ããã³ãã«ã®æ§æãçè§£ããã®ã«åœ¹ç«ã€èŠèŠçãªããŒã«ã§ããã¢ããªã±ãŒã·ã§ã³å ã®åã¢ãžã¥ãŒã«ãšäŸåé¢ä¿ã®ãµã€ãºã瀺ãã€ã³ã¿ã©ã¯ãã£ããªããªãŒããããçæããŸãã
ã€ã³ã¹ããŒã«:
npm install --save-dev webpack-bundle-analyzer
èšå® (next.config.js):
const withBundleAnalyzer = require('@next/bundle-analyzer')({
enabled: process.env.ANALYZE === 'true',
})
module.exports = withBundleAnalyzer({
// your Next.js config here
})
ã¢ãã©ã€ã¶ãŒã®å®è¡:
ã¢ããªã±ãŒã·ã§ã³ããã«ããããšãã«ãANALYZE
ç°å¢å€æ°ãtrue
ã«èšå®ããŸã:
ANALYZE=true npm run build
ããã«ããããã©ãŠã¶ã§ãã³ãã«ã®èŠèŠçãªè¡šçŸãçæããã倧ããªäŸåé¢ä¿ãšæé©åã®æœåšçãªé åãç¹å®ã§ããŸãã
@next/bundle-analyzer
ããã¯ãå ¬åŒã®Next.jsãã³ãã«ã¢ãã©ã€ã¶ãŒã©ãããŒã§ãããNext.jsãããžã§ã¯ããšã®çµ±åã容æã«ããŸãã
ã€ã³ã¹ããŒã«:
npm install --save-dev @next/bundle-analyzer
äœ¿çšæ³ (next.config.js):
const withBundleAnalyzer = require('@next/bundle-analyzer')({
enabled: process.env.ANALYZE === 'true',
})
module.exports = withBundleAnalyzer({
// your Next.js config here
})
Webpack Bundle Analyzerãšåæ§ã«ããã«ãããã»ã¹äžã«ANALYZE
ç°å¢å€æ°ãtrue
ã«èšå®ããŠãåæã¬ããŒããçæããŸãã
Source Map Explorer
Source Map Explorerã¯ããœãŒã¹ãããã䜿çšããŠJavaScriptãã³ãã«ãåæããå¥ã®ããŒã«ã§ãããã³ãã«ãµã€ãºã«æãè²¢ç®ããå ã®ãœãŒã¹ã³ãŒããç¹å®ããã®ã«åœ¹ç«ã¡ãŸãã
ã€ã³ã¹ããŒã«:
npm install -g source-map-explorer
äœ¿çšæ³:
ãŸããæ¬çªãã«ãã®ãœãŒã¹ããããçæããŸããnext.config.js
ã§:
module.exports = {
productionBrowserSourceMaps: true,
}
次ã«ãSource Map Explorerãå®è¡ããŸã:
source-map-explorer .next/static/chunks/main-*.js
BundlePhobia
BundlePhobiaã䜿çšãããšãåã ã®npmããã±ãŒãžã®ãµã€ãºãã€ã³ã¹ããŒã«ããåã«åæã§ããŸããããã¯ãã©ã®äŸåé¢ä¿ã䜿çšãããã«ã€ããŠååãªæ å ±ã«åºã¥ããæææ±ºå®ãè¡ãã®ã«åœ¹ç«ã¡ããããããªã³ãã®å°ããæœåšçãªä»£æ¿ææ®µãç¹å®ããã®ã«åœ¹ç«ã¡ãŸãã
äœ¿çšæ³:
BundlePhobiaãŠã§ããµã€ã(bundlephobia.com)ã«ã¢ã¯ã»ã¹ããŠãåæããnpmããã±ãŒãžãæ€çŽ¢ããŸãããŠã§ããµã€ãã«ã¯ãããã±ãŒãžã®ãµã€ãºãäŸåé¢ä¿ãããŠã³ããŒãæéã«é¢ããæ å ±ã衚瀺ãããŸãã
Next.jsã§ã®ãã«ããµã€ãºæé©åã®æŠç¥
ãã³ãã«ãåæããæé©åã®æœåšçãªé åãç¹å®ããããæ¬¡ã®æŠç¥ãå®è£ ã§ããŸãã
1. ã³ãŒãåå²
ã³ãŒãåå²ã¯ãåæããŒãæéãççž®ããããã®æã广çãªãã¯ããã¯ã®1ã€ã§ããããã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ã³ãŒãããªã³ããã³ãã§ããŒãã§ããããå°ããªãã£ã³ã¯ã«åå²ããããšãå«ãŸããŸããNext.jsã¯ãã«ãŒãã¬ãã«ã§ã³ãŒãåå²ãèªåçã«å®è£ ããŸããã€ãŸããã¢ããªã±ãŒã·ã§ã³ã®åããŒãžã¯åå¥ã®ãã£ã³ã¯ãšããŠããŒããããŸãã
åçã€ã³ããŒã:
åçã€ã³ããŒã(import()
)ã䜿çšããŠãå¿
èŠãªãšãã«ã®ã¿ã³ã³ããŒãã³ããšã¢ãžã¥ãŒã«ãããŒãããããšã§ãã³ãŒãåå²ãããã«æé©åã§ããŸããããã¯ãããŒãžã«ããã«è¡šç€ºãããªã倧ããªã³ã³ããŒãã³ããŸãã¯ã¢ãžã¥ãŒã«ã«ç¹ã«åœ¹ç«ã¡ãŸãã
import dynamic from 'next/dynamic'
const MyComponent = dynamic(() => import('../components/MyComponent'))
function MyPage() {
return (
{/* Other content */}
)
}
export default MyPage
next/dynamic
颿°ã䜿çšãããšãã³ã³ããŒãã³ããåçã«ããŒãã§ããŸããã³ã³ããŒãã³ãã®ããŒãäžã«ããŒãã€ã³ãžã±ãŒã¿ãŒã衚瀺ããããã«æ§æããããšãã§ããŸãã
const MyComponent = dynamic(() => import('../components/MyComponent'), {
loading: () => Loading...
})
2. Tree Shaking
Tree Shakingã¯ããã³ãã«ãããããã³ãŒãïŒæªäœ¿çšã³ãŒãïŒãåé€ããããã»ã¹ã§ããWebpackã®ãããªææ°ã®JavaScriptãã³ãã©ãŒã¯ãTree Shakingãèªåçã«å®è¡ããŸãããã ããTree Shakingã«é©ããæ¹æ³ã§ã³ãŒããèšè¿°ãããŠããããšã確èªããããšã§ããã®å¹æãé«ããããšãã§ããŸãã
ESã¢ãžã¥ãŒã«:
CommonJS(require
)ã®ä»£ããã«ESã¢ãžã¥ãŒã«(import
ããã³export
æ§æ)ã䜿çšããŸããESã¢ãžã¥ãŒã«ã¯éçã«åæå¯èœã§ããããããã³ãã©ãŒã¯æªäœ¿çšã®ãšã¯ã¹ããŒããèå¥ããŠåé€ã§ããŸãã
å¯äœçšã®åé¿:
ã¢ãžã¥ãŒã«å ã§å¯äœçšã®ããã³ãŒãïŒã°ããŒãã«ç¶æ ã倿Žããã³ãŒãïŒãåé¿ããŸããå¯äœçšã«ããããã³ãã©ãŒãæªäœ¿çšã®ã³ãŒããå®å šã«åé€ã§ããªããªãå¯èœæ§ããããŸãã
3. äŸåé¢ä¿ã®æé©å
äŸåé¢ä¿ã¯ããã«ããµã€ãºã«å€§ããªåœ±é¿ãäžããå¯èœæ§ããããŸããäŸåé¢ä¿ãæ éã«è©äŸ¡ãã以äžãæ€èšããŠãã ããã
- ããå°ããªä»£æ¿ææ®µã®äœ¿çš: 倧ããªã©ã€ãã©ãªã®ããå°ããªä»£æ¿ææ®µãæ¢ããŸããããšãã°ã倧ããªæ¥ä»ãã©ãŒãããã©ã€ãã©ãªããããå°ãããããç¹æ®ãªã©ã€ãã©ãªã«çœ®ãæããããšãã§ããå ŽåããããŸãã
- å¿ èŠãªãã®ã ããã€ã³ããŒã: ã©ã€ãã©ãªå šäœãã€ã³ããŒããã代ããã«ãã©ã€ãã©ãªããå¿ èŠãªç¹å®ã®é¢æ°ãŸãã¯ã¢ãžã¥ãŒã«ã®ã¿ãã€ã³ããŒãããŸãã
- äŸåé¢ä¿ã®é å»¶ããŒã: åçã€ã³ããŒãã䜿çšããŠãããã«å¿ èŠã§ãªãäŸåé¢ä¿ãé å»¶ããŒãããŸãã
- æªäœ¿çšã®äŸåé¢ä¿ã®åé€:
package.json
ãã¡ã€ã«ã宿çã«ç¢ºèªãã䜿çšãããªããªã£ãäŸåé¢ä¿ãåé€ããŸãã
ããšãã°ãLodashã¯äººæ°ã®é«ããŠãŒãã£ãªãã£ã©ã€ãã©ãªã§ããããã³ãã«ãµã€ãºã«å€§ããªãªãŒããŒãããã远å ããå¯èœæ§ããããŸãã`lodash-es`(Tree Shakingå¯èœ)ã®ãããªããå°ããªä»£æ¿ææ®µã䜿çšããããåçŽãªã¿ã¹ã¯ã®ããã«ç¬èªã®ãŠãŒãã£ãªãã£é¢æ°ãäœæããããšãæ€èšããŠãã ããã
4. ç»åã®æé©å
ç»åã¯ããŠã§ããµã€ãã®è¥å€§åã®äž»ãªåå ãšãªãããšããããããŸããå質ãæãªãããšãªããç»åã®ãã¡ã€ã«ãµã€ãºãåæžããããã«æé©åããŸãã
- æé©åããã圢åŒã®äœ¿çš: JPEGãŸãã¯PNGãããåªããå§çž®ãæäŸãããWebPãAVIFã®ãããªæé©åãããç»å圢åŒã䜿çšããŸãã
- ç»åã®å§çž®: ç»åå§çž®ããŒã«ã䜿çšããŠãç»åã®ãã¡ã€ã«ãµã€ãºãåæžããŸãã
- ã¬ã¹ãã³ã·ãç»åã®äœ¿çš: ãŠãŒã¶ãŒã®ããã€ã¹ç»é¢ãµã€ãºã«åºã¥ããŠãç°ãªãç»åãµã€ãºãæäŸããŸããNext.jsã®
<Image>
ã³ã³ããŒãã³ãã¯ãã¬ã¹ãã³ã·ãç»åã®çµã¿èŸŒã¿ãµããŒããæäŸããŸãã - ç»åã®é
å»¶ããŒã: ç»é¢ã®æãè¿ãããäžã«ããç»åïŒç»é¢ã«ããã«è¡šç€ºãããªãç»åïŒãé
å»¶ããŒãããŸããNext.jsã®
<Image>
ã³ã³ããŒãã³ãã¯ãé å»¶ããŒãããµããŒãããŠããŸãã
Next.jsã¯ãç»åãèªåçã«æé©åããçµã¿èŸŒã¿ã®<Image>
ã³ã³ããŒãã³ããæäŸããŸããããã¯ã以äžããµããŒãããŸã:
- é å»¶ããŒã: ç»åã¯ããã¥ãŒããŒãã§è¡šç€ºãããããšããŠããå Žåã«ã®ã¿ããŒããããŸãã
- ã¬ã¹ãã³ã·ãç»å: ããã€ã¹ã®ç»é¢ãµã€ãºã«åºã¥ããŠãç°ãªãç»åãµã€ãºãæäŸãããŸãã
- æé©åããã圢åŒ: ãã©ãŠã¶ããµããŒãããŠããå Žåãç»åã¯WebPã®ãããªææ°ã®åœ¢åŒã«èªåçã«å€æãããŸãã
import Image from 'next/image'
function MyComponent() {
return (
)
}
5. ãã©ã³ãã®æé©å
ã«ã¹ã¿ã ãã©ã³ãããã«ããµã€ãºã«è²¢ç®ããããŒãžã®ããŒãæéã«åœ±é¿ãäžããå¯èœæ§ããããŸãããã©ã³ããæé©åããã«ã¯:
- ãŠã§ããã©ã³ã圢åŒã®äœ¿çš: TTFãŸãã¯OTFã®ãããªå€ã圢åŒãããåªããå§çž®ãæäŸãããWOFF2ã®ãããªææ°ã®ãŠã§ããã©ã³ã圢åŒã䜿çšããŸãã
- ãã©ã³ãã®ãµãã»ããå: ã¢ããªã±ãŒã·ã§ã³ã§å®éã«äœ¿çšããæåã®ã¿ãå«ããŸãã
- ãã©ã³ãã®ããªããŒã: ãã©ã³ããã§ããã ãæ©ãããŒããããããã«ããªããŒãããŸãã
<link rel="preload">
ã¿ã°ã䜿çšããŠãã©ã³ããããªããŒãã§ããŸãã - ãã©ã³ãã®è¡šç€º:
font-display
CSSããããã£ã䜿çšããŠããã©ã³ãã®ããŒãäžã«ãã©ã³ãã®è¡šç€ºæ¹æ³ãå¶åŸ¡ããŸããswap
å€ã¯å€ãã®å Žåé©åãªéžæè¢ã§ããããã¯ããã©ãŠã¶ã«ãã©ãŒã«ããã¯ãã©ã³ããããã«è¡šç€ºããã«ã¹ã¿ã ãã©ã³ããããŒãããããããã«åãæ¿ããããã«æç€ºããããã§ãã
Next.jsã¯ãnext/font
ããã±ãŒãžã䜿çšããŠãGoogleãã©ã³ããŸãã¯ããŒã«ã«ãã©ã³ããç°¡åã«ããŒãããã³æé©åã§ããããã«ããããšã§ããã©ã³ãã®æé©åããµããŒãããŸãã
import { Inter } from 'next/font/google'
const inter = Inter({ subsets: ['latin'] })
export default function RootLayout({ children }) {
return (
{children}
)
}
6. JavaScriptã®æå°å
ã¢ããªã±ãŒã·ã§ã³å ã®JavaScriptã³ãŒãã®éãæžããã«ã¯:
- ãµãŒããŒãµã€ãã¬ã³ããªã³ã°(SSR)ãŸãã¯éçãµã€ãçæ(SSG)ã®äœ¿çš: SSRããã³SSGã䜿çšãããšãã¢ããªã±ãŒã·ã§ã³ããµãŒããŒäžãŸãã¯ãã«ãæã«ã¬ã³ããªã³ã°ã§ããããããã©ãŠã¶ã§å®è¡ããå¿ èŠãããJavaScriptã®éãæžããããšãã§ããŸãã
- äžèŠãªJavaScriptã®åé¿: åçŽãªã¢ãã¡ãŒã·ã§ã³ãã€ã³ã¿ã©ã¯ã·ã§ã³ã«ã¯ãJavaScriptã®ä»£ããã«CSSã䜿çšããŸãã
- ãããŠã³ã¹ãšã¹ããããªã³ã°: ãããŠã³ã¹ãšã¹ããããªã³ã°ã䜿çšããŠãã€ãã³ããªã¹ããŒã®ãããªãè² è·ã®é«ãJavaScriptæäœã®é »åºŠãå¶éããŸãã
Next.jsã¯ãSSRãšSSGã®äž¡æ¹ãåªãããµããŒããæäŸããŸããã¢ããªã±ãŒã·ã§ã³ã®ããŒãºã«æé©ãªã¬ã³ããªã³ã°æŠç¥ãéžæããŠãã ããã
7. ã«ãŒãããŒã¹ã®æé©å
ç¹å®ã®èŠä»¶ã«åºã¥ããŠåã ã®ã«ãŒããæé©åããŸã:
- ã³ã³ããŒãã³ãã®é å»¶ããŒã: ç¹å®ã®ã«ãŒãã§å¿ èŠãªå Žåã«ã®ã¿ãã³ã³ããŒãã³ããåçã«ã€ã³ããŒãããŸãã
- ç»åã®æé©å: ã³ã³ãã³ããšãŠãŒã¶ãŒã®æåŸ ã«åºã¥ããŠãç°ãªãã«ãŒãã«ç°ãªãç»åæé©åæŠç¥ã䜿çšããŸãã
- æ¡ä»¶ä»ãããŒã: ã«ãŒãã«åºã¥ããŠç°ãªãäŸåé¢ä¿ãŸãã¯ã¢ãžã¥ãŒã«ãããŒãããŸãã
8. æå°åãšå§çž®
ã³ãŒããæ¬çªç°å¢ã«ãããã€ãããåã«ãã³ãŒããæå°åããã³å§çž®ãããŠããããšã確èªããŠãã ããã
- æå°å: ã³ãŒãããäžèŠãªæåïŒç©ºçœãã³ã¡ã³ãïŒãåé€ããŠããµã€ãºãåæžããŸããNext.jsã¯ãæ¬çªã¢ãŒãã§ã³ãŒããèªåçã«æå°åããŸãã
- å§çž®: gzipãŸãã¯Brotliã䜿çšããŠã³ãŒããå§çž®ãããµã€ãºãããã«åæžããŸãããŠã§ããµãŒããŒã¯ãå§çž®ãããã¢ã»ãããæäŸããããã«æ§æããå¿ èŠããããŸãã
Next.jsã¯æå°åãèªåçã«åŠçããŸãããå§çž®ãæå¹ã«ããããã«ãµãŒããŒãæ§æããå¿ èŠããããŸãïŒäŸïŒGzipãŸãã¯Brotliã䜿çšïŒãCloudflareããã³ãã®ä»ã®CDNã¯ãå€ãã®å Žåãå§çž®ãèªåçã«åŠçããŸãã
9. ã³ã³ãã³ãé ä¿¡ãããã¯ãŒã¯(CDN)ã®å©çš
ã³ã³ãã³ãé ä¿¡ãããã¯ãŒã¯(CDN)ã¯ãäžçäžã®ãŠãŒã¶ãŒã«ãšã£ãŠãŠã§ããµã€ãã®ããã©ãŒãã³ã¹ãå€§å¹ ã«åäžãããããšãã§ããŸããCDNã¯ããŠã§ããµã€ãã®ã¢ã»ããã®ã³ããŒããè€æ°ã®å°ççãªå Žæã«é 眮ããããµãŒããŒã«ä¿åããŸãããŠãŒã¶ãŒããŠã§ããµã€ããèŠæ±ãããšãCDNã¯ãŠãŒã¶ãŒã«æãè¿ããµãŒããŒããã¢ã»ãããæäŸããé å»¶ãæžãããããŠã³ããŒãé床ãåäžãããŸãã
ã°ããŒãã«ãªãã¬ãŒã³ã¹ãæã¡ã次ã®ãããªæ©èœããµããŒãããCDNã®äœ¿çšãæ€èšããŠãã ãã:
- ãšããžãã£ãã·ã¥: ãŠãŒã¶ãŒã®è¿ãã«ãããµãŒããŒã«ã¢ã»ããããã£ãã·ã¥ããŸãã
- å§çž®: ãŠãŒã¶ãŒã«é ä¿¡ããåã«ã¢ã»ãããèªåçã«å§çž®ããŸãã
- ç»åã®æé©å: ããŸããŸãªããã€ã¹ãšç»é¢ãµã€ãºã«åãããŠç»åãèªåçã«æé©åããŸãã
- ãããã³ã«ã®æé©å: HTTP/3ã®ãããªææ°ã®ãããã³ã«ã䜿çšããŠãããã©ãŒãã³ã¹ãåäžãããŸãã
äžè¬çãªCDNãããã€ããŒã«ã¯ã次ã®ãããªãã®ããããŸã:
- Cloudflare
- Akamai
- Amazon CloudFront
- Google Cloud CDN
- Fastly
10. ç£èŠãšæž¬å®
ãŠã§ããµã€ãã®ããã©ãŒãã³ã¹ãç¶ç¶çã«ç£èŠããæé©åã®åãçµã¿ã®åœ±é¿ã枬å®ããŸããGoogle PageSpeed InsightsãWebPageTestãLighthouseã®ãããªããŒã«ã䜿çšããŠãæ¹åã®é åãç¹å®ããŸãã
Google PageSpeed Insights: ãã¹ã¯ãããããã€ã¹ãšã¢ãã€ã«ããã€ã¹ã®äž¡æ¹ã§ã®ãŠã§ããµã€ãã®ããã©ãŒãã³ã¹ã«é¢ããæŽå¯ãæäŸããŸãã
WebPageTest: ããŸããŸãªå Žæããã©ãŠã¶ã®æ§æã§ãŠã§ããµã€ãã®ããã©ãŒãã³ã¹ããã¹ãã§ããŸãã
Lighthouse: ãŠã§ãããŒãžã®ããã©ãŒãã³ã¹ãã¢ã¯ã»ã·ããªãã£ãããã°ã¬ãã·ããŠã§ãã¢ããªã®ãã¹ããã©ã¯ãã£ã¹ãSEOãªã©ãç£æ»ãããªãŒãã³ãœãŒã¹ããŒã«ã§ãã
ã°ããŒãã«ããã©ãŒãã³ã¹ã®ããã®ãã¹ããã©ã¯ãã£ã¹
äžèšã§æŠèª¬ããç¹å®ã®æé©åæŠç¥ã«å ããŠãã°ããŒãã«ãªãŒãã£ãšã³ã¹ã«æé©ãªããã©ãŒãã³ã¹ãä¿èšŒããããã«ã次ã®ãã¹ããã©ã¯ãã£ã¹ãæ€èšããŠãã ãã:
- ã°ããŒãã«ã€ã³ãã©ã¹ãã©ã¯ãã£ãåãããã¹ãã£ã³ã°ãããã€ããŒã®éžæ: è€æ°ã®å°ççãªå Žæã«ããŒã¿ã»ã³ã¿ãŒãæã€ãã¹ãã£ã³ã°ãããã€ããŒãéžæããŸãã
- ã¢ãã€ã«ããã€ã¹ã®æé©å: ãŠã§ããµã€ããã¬ã¹ãã³ã·ãã§ã¢ãã€ã«ããã€ã¹ã«æé©åãããŠããããšã確èªããŸããã¢ãã€ã«ãŠãŒã¶ãŒã¯ãå€ãã®å Žåãã€ã³ã¿ãŒãããæ¥ç¶ãé ããç»é¢ãå°ãããªã£ãŠããŸãã
- ã³ã³ãã³ãã®ããŒã«ã©ã€ãº: ãŠãŒã¶ãŒã®åªå èšèªãšé貚ã§ã³ã³ãã³ããæäŸããŸãã
- ãããã¯ãŒã¯ã®ç¶æ³ã®èæ ®: ããŸããŸãªå°åã®ãããã¯ãŒã¯ã®ç¶æ³ãææ¡ããããã«å¿ããŠãŠã§ããµã€ããæé©åããŸãã
- ããŸããŸãªå Žæããã®ãã¹ã: ããŸããŸãªå°ççãªå ŽæãããŠã§ããµã€ãã®ããã©ãŒãã³ã¹ã宿çã«ãã¹ãããŸãã
çµè«
ãã«ããµã€ãºã®æé©åã¯ãã°ããŒãã«ãªãŒãã£ãšã³ã¹ã«é«éãã€å¹ççãªãŠã§ãäœéšãæäŸããããã«äžå¯æ¬ ã§ããNext.jsãã³ãã©ãŒãçè§£ããé©åãªåæããŒã«ã䜿çšãããã®ã¬ã€ãã§æŠèª¬ãããŠããæŠç¥ãå®è£ ããããšã§ããã«ããµã€ãºãå€§å¹ ã«åæžãããŠã§ããµã€ãã®ããã©ãŒãã³ã¹ãåäžãããå Žæãã€ã³ã¿ãŒãããé床ã«é¢ä¿ãªãããã¹ãŠã®äººã«åªãããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸã§ããŸãããŠã§ããµã€ãã®ããã©ãŒãã³ã¹ãç¶ç¶çã«ç£èŠããæé©åã®åãçµã¿ãç¹°ãè¿ããŠãåžžã«å¯èœãªéãæé«ã®äœéšãæäŸããŠããããšã確èªããŠãã ããã
説æãããã¯ããã¯ã¯ã1åéãã®ä¿®æ£ã§ã¯ãªããç¶ç¶çãªããã»ã¹ã§ããã¢ããªã±ãŒã·ã§ã³ãé²åããã«ã€ããŠãæ°ããäŸåé¢ä¿ãšæ©èœã远å ããããã³ãã«ãµã€ãºã«åœ±é¿ãäžããå¯èœæ§ããããŸããã°ããŒãã«ãªãŒãã£ãšã³ã¹ã«æé©ãªããã©ãŒãã³ã¹ãç¶æããã«ã¯ã宿çãªç£èŠãšæé©åãäžå¯æ¬ ã§ãã