Next.jsã®ãã«ãããã»ã¹ã«ãããã¡ã¢ãªå¹çãæé©åããããã®å æ¬çã¬ã€ããã°ããŒãã«ã¢ããªã±ãŒã·ã§ã³ã®ããé«éã§ä¿¡é Œæ§ã®é«ããããã€ã¡ã³ããä¿èšŒããŸãã
Next.jsã®ã¡ã¢ãªç®¡çïŒã°ããŒãã«ã¢ããªã±ãŒã·ã§ã³åããã«ãããã»ã¹ã®æé©å
Next.jsã¯ãããã©ãŒãã³ã¹ãšæ¡åŒµæ§ã«åªããWebã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®äž»èŠãªãã¬ãŒã ã¯ãŒã¯ãšãªã£ãŠããŸãããµãŒããŒãµã€ãã¬ã³ããªã³ã°ïŒSSRïŒãéçãµã€ãçæïŒSSGïŒãªã©ã®æ©èœã¯ã倧ããªå©ç¹ãæäŸããŸããããããã¢ããªã±ãŒã·ã§ã³ãè€éåããç¹ã«å€æ§ãªããŒã¿ã»ãããããŒã«ã©ã€ãºèŠä»¶ãæã€ã°ããŒãã«ãªãªãŒãã£ãšã³ã¹ãã¿ãŒã²ããã«ããå Žåããã«ãããã»ã¹äžã®ã¡ã¢ãªç®¡çãéåžžã«éèŠã«ãªããŸããéå¹çãªã¡ã¢ãªäœ¿çšã¯ããã«ãã®é å»¶ããããã€ã®å€±æããããŠæçµçã«ã¯å£æªãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã«ã€ãªããå¯èœæ§ããããŸãããã®å æ¬çãªã¬ã€ãã§ã¯ãNext.jsã®ãã«ãããã»ã¹ãæé©åããŠã¡ã¢ãªå¹çãé«ããã°ããŒãã«ãªãŠãŒã¶ãŒããŒã¹ã«ãµãŒãã¹ãæäŸããã¢ããªã±ãŒã·ã§ã³ã®ã¹ã ãŒãºãªãããã€ãšé«æ§èœã確ä¿ããããã®æ§ã ãªæŠç¥ãšãã¯ããã¯ãæ¢ããŸãã
Next.jsãã«ãã«ãããã¡ã¢ãªæ¶è²»ã®çè§£
æé©åæè¡ã«é£ã³èŸŒãåã«ãNext.jsã®ãã«ãäžã«ã©ãã§ã¡ã¢ãªãæ¶è²»ãããããçè§£ããããšãäžå¯æ¬ ã§ããäž»ãªèŠå ã¯æ¬¡ã®ãšããã§ãã
- WebpackïŒNext.jsã¯Webpackãå©çšããŠJavaScriptãCSSããã®ä»ã®ã¢ã»ããããã³ãã«ããŸããWebpackã®äŸåé¢ä¿ã°ã©ãåæãšå€æããã»ã¹ã¯ãã¡ã¢ãªã倧éã«æ¶è²»ããŸãã
- BabelïŒBabelã¯ææ°ã®JavaScriptã³ãŒãããã©ãŠã¶äºæã®ããŒãžã§ã³ã«å€æããŸãããã®ããã»ã¹ã¯ã³ãŒãã®è§£æãšæäœãå¿ èŠãšããã¡ã¢ãªãæ¶è²»ããŸãã
- ç»åæé©åïŒæ§ã ãªããã€ã¹ãç»é¢ãµã€ãºã«åãããŠç»åãæé©åããããšã¯ãç¹ã«å€§ããªç»åã¢ã»ããã倿°ã®ãã±ãŒã«ãããå Žåãã¡ã¢ãªãå€§å¹ ã«æ¶è²»ããå¯èœæ§ããããŸãã
- ããŒã¿ãã§ããïŒSSRãšSSGã§ã¯ããã«ãããã»ã¹äžã«ããŒã¿ããã§ããããããšããããããŸããå€§èŠæš¡ãªããŒã¿ã»ãããè€éãªããŒã¿å€æã¯ãã¡ã¢ãªæ¶è²»ã®å¢å ã«ã€ãªããå¯èœæ§ããããŸãã
- éçãµã€ãçæïŒåã«ãŒãã®éçHTMLããŒãžãçæããã«ã¯ãçæãããã³ã³ãã³ããã¡ã¢ãªã«ä¿åããå¿ èŠããããŸããå€§èŠæš¡ãªãµã€ãã§ã¯ãããã«ããçžåœãªã¡ã¢ãªãæ¶è²»ãããå¯èœæ§ããããŸãã
- ããŒã«ã©ã€ãŒãŒã·ã§ã³ïŒi18nïŒïŒè€æ°ã®ãã±ãŒã«ãšç¿»èš³ã管çãããšãåãã±ãŒã«ãåŠçãšä¿åãå¿ èŠãšãããããã¡ã¢ãªãããããªã³ããå¢å ããŸããã°ããŒãã«ã¢ããªã±ãŒã·ã§ã³ã§ã¯ããããäž»èŠãªèŠå ã«ãªãããšããããŸãã
ã¡ã¢ãªã®ããã«ããã¯ãç¹å®ãã
ã¡ã¢ãªäœ¿çšéãæé©åããæåã®ã¹ãããã¯ãããã«ããã¯ãã©ãã«ããããç¹å®ããããšã§ããæ¹åãã¹ãé åãç¹å®ããã®ã«åœ¹ç«ã€ããã€ãã®æ¹æ³ã以äžã«ç€ºããŸãã
1. Node.jsã€ã³ã¹ãã¯ã¿
Node.jsã€ã³ã¹ãã¯ã¿ã䜿çšãããšãã¢ããªã±ãŒã·ã§ã³ã®ã¡ã¢ãªäœ¿çšéããããã¡ã€ãªã³ã°ã§ããŸããããã䜿çšããŠããŒãã¹ãããã·ã§ãããååŸãããã«ãããã»ã¹äžã®ã¡ã¢ãªå²ãåœãŠãã¿ãŒã³ãåæã§ããŸãã
äŸïŒ
node --inspect node_modules/.bin/next build
ãã®ã³ãã³ãã¯ãNode.jsã€ã³ã¹ãã¯ã¿ãæå¹ã«ããŠNext.jsãã«ãããã»ã¹ãéå§ããŸãããã®åŸãChrome DevToolsããã®ä»ã®äºæããŒã«ã䜿çšããŠã€ã³ã¹ãã¯ã¿ã«æ¥ç¶ã§ããŸãã
2. `memory-stats` ããã±ãŒãž
`memory-stats` ããã±ãŒãžã¯ããã«ãäžã«ãªã¢ã«ã¿ã€ã ã®ã¡ã¢ãªäœ¿çšéçµ±èšãæäŸããŸããã¡ã¢ãªãªãŒã¯ãäºæããªãã¡ã¢ãªã¹ãã€ã¯ãç¹å®ããã®ã«åœ¹ç«ã¡ãŸãã
ã€ã³ã¹ããŒã«ïŒ
npm install memory-stats
äœ¿çšæ¹æ³ïŒ
const memoryStats = require('memory-stats');
setInterval(() => {
console.log(memoryStats());
}, 1000);
Next.jsã®ãã«ãã¹ã¯ãªããã«ãã®ã³ãŒãã¹ãããããå«ããŠãã¡ã¢ãªäœ¿çšéãç£èŠããŸããæ¬çªç°å¢ã§ã¯ãããåé€ãŸãã¯ç¡å¹ã«ããããšãå¿ããªãã§ãã ããã
3. ãã«ãæéã®åæ
ãã«ãæéãåæããããšã§ã鿥çã«ã¡ã¢ãªã®åé¡ã瀺ãããšãã§ããŸãã察å¿ããã³ãŒãã®å€æŽãªãã«ãã«ãæéãæ¥æ¿ã«å¢å ããå Žåãã¡ã¢ãªã®ããã«ããã¯ã瀺åãããå¯èœæ§ããããŸãã
4. CI/CDãã€ãã©ã€ã³ã®ç£èŠ
CI/CDãã€ãã©ã€ã³ã®ã¡ã¢ãªäœ¿çšéãæ³šææ·±ãç£èŠããŠãã ãããã¡ã¢ãªäžè¶³ãšã©ãŒãåå ã§ãã«ããäžè²«ããŠå€±æããå Žåãããã¯ã¡ã¢ãªæé©åãå¿ èŠã§ããããšã®æç¢ºãªå åã§ããå€ãã®CI/CDãã©ãããã©ãŒã ã¯ã¡ã¢ãªäœ¿çšéã®ã¡ããªã¯ã¹ãæäŸããŠããŸãã
æé©åãã¯ããã¯
ã¡ã¢ãªã®ããã«ããã¯ãç¹å®ããããæ§ã ãªæé©åãã¯ããã¯ãé©çšããŠãNext.jsã®ãã«ãããã»ã¹äžã®ã¡ã¢ãªæ¶è²»ãåæžã§ããŸãã
1. Webpackã®æé©å
a. ã³ãŒãåå²
ã³ãŒãåå²ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ã³ãŒããããå°ããªãã£ã³ã¯ã«åå²ãããªã³ããã³ãã§ããŒãã§ããããã«ããŸããããã«ãããåæããŒãæéãšã¡ã¢ãªãããããªã³ããåæžãããŸããNext.jsã¯ããŒãžããšã«èªåçã«ã³ãŒãåå²ãåŠçããŸãããåçã€ã³ããŒãã䜿çšããŠããã«æé©åããããšãã§ããŸãã
äŸïŒ
import dynamic from 'next/dynamic';
const MyComponent = dynamic(() => import('../components/MyComponent'));
function MyPage() {
return (
);
}
export default MyPage;
ãã®ã³ãŒãã¹ãããã㯠`next/dynamic` ã€ã³ããŒãã䜿çšã㊠`MyComponent` ãéåæã«ããŒãããŸããããã«ãããã³ã³ããŒãã³ãã®ã³ãŒããå¿ èŠãªãšãã«ã®ã¿ããŒããããåæã®ã¡ã¢ãªãããããªã³ããåæžãããŸãã
b. ããªãŒã·ã§ã€ãã³ã°
ããªãŒã·ã§ã€ãã³ã°ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ãã³ãã«ããæªäœ¿çšã®ã³ãŒããåé€ããŸããããã«ãããå šäœã®ãã³ãã«ãµã€ãºãšã¡ã¢ãªãããããªã³ããåæžãããŸããããªãŒã·ã§ã€ãã³ã°ãæå¹ã«ããã«ã¯ãESã¢ãžã¥ãŒã«ãšäºææ§ã®ãããã³ãã©ïŒWebpackãªã©ïŒã䜿çšããŠããããšã確èªããŠãã ããã
äŸïŒ
ãŠãŒãã£ãªãã£ã©ã€ãã©ãªã«è€æ°ã®é¢æ°ãããããã³ã³ããŒãã³ãã1ã€ãã䜿çšããªãå ŽåãèããŸãã
// utils.js
export function add(a, b) {
return a + b;
}
export function subtract(a, b) {
return a - b;
}
// MyComponent.js
import { add } from './utils';
function MyComponent() {
return {add(2, 3)};
}
export default MyComponent;
ããªãŒã·ã§ã€ãã³ã°ã«ããã`add` 颿°ã®ã¿ãæçµãã³ãã«ã«å«ãŸãããã³ãã«ãµã€ãºãšã¡ã¢ãªäœ¿çšéãåæžãããŸãã
c. Webpackãã©ã°ã€ã³
ããã€ãã®Webpackãã©ã°ã€ã³ãã¡ã¢ãªäœ¿çšéã®æé©åã«åœ¹ç«ã¡ãŸãã
- `webpack-bundle-analyzer`ïŒWebpackãã³ãã«ã®ãµã€ãºãèŠèŠåãã倧ããªäŸåé¢ä¿ãç¹å®ããã®ã«åœ¹ç«ã¡ãŸãã
- `terser-webpack-plugin`ïŒJavaScriptã³ãŒããæå°åãããã³ãã«ãµã€ãºãåæžããŸãã
- `compression-webpack-plugin`ïŒã¢ã»ãããå§çž®ããã¡ã¢ãªã«ä¿åããå¿ èŠãããããŒã¿éãåæžããŸãã
äŸïŒ
// next.config.js
const withPlugins = require('next-compose-plugins');
const withBundleAnalyzer = require('@next/bundle-analyzer')({
enabled: process.env.ANALYZE === 'true',
});
const TerserPlugin = require('terser-webpack-plugin');
const CompressionPlugin = require('compression-webpack-plugin');
const nextConfig = {
webpack: (config, { isServer }) => {
if (!isServer) {
config.optimization.minimizer = config.optimization.minimizer || [];
config.optimization.minimizer.push(new TerserPlugin());
config.plugins.push(new CompressionPlugin());
}
return config;
},
};
module.exports = withPlugins([[withBundleAnalyzer]], nextConfig);
ãã®èšå®ã¯ããã³ãã«ã¢ãã©ã€ã¶ãŒãæå¹ã«ããTerserPluginã§JavaScriptã³ãŒããæå°åããCompressionPluginã§ã¢ã»ãããå§çž®ããŸãããŸãäŸåé¢ä¿ãã€ã³ã¹ããŒã«ããŸã `npm install --save-dev @next/bundle-analyzer terser-webpack-plugin compression-webpack-plugin`
2. ç»åã®æé©å
ç»åã¯ãŠã§ãã¢ããªã±ãŒã·ã§ã³å šäœã®ãµã€ãºã«å€§ããå¯äžããããšããããããŸããç»åãæé©åããããšã§ããã«ãããã»ã¹äžã®ã¡ã¢ãªæ¶è²»ãåçã«åæžãããŠã§ããµã€ãã®ããã©ãŒãã³ã¹ãåäžãããããšãã§ããŸããNext.js㯠`next/image` ã³ã³ããŒãã³ãã§çµã¿èŸŒã¿ã®ç»åæé©åæ©èœãæäŸããŠããŸãã
ãã¹ããã©ã¯ãã£ã¹ïŒ
- `next/image` ã䜿çšããïŒ`next/image` ã³ã³ããŒãã³ãã¯ãããŸããŸãªããã€ã¹ãç»é¢ãµã€ãºã«åãããŠç»åãèªåçã«æé©åããŸãã
- é å»¶èªã¿èŸŒã¿ïŒç»åããã¥ãŒããŒãã«è¡šç€ºããããšãã«ã®ã¿èªã¿èŸŒã¿ãŸããããã«ãããåæããŒãæéãšã¡ã¢ãªãããããªã³ããåæžãããŸãã`next/image` ã¯ããããã€ãã£ãã§ãµããŒãããŠããŸãã
- ç»åãã©ãŒãããã®æé©åïŒJPEGãPNGãããåªããå§çž®ãæäŸããWebPãªã©ã®ææ°ã®ç»åãã©ãŒãããã䜿çšããŸãã`next/image` ã¯ãã©ãŠã¶ããµããŒãããŠããå Žåãç»åãèªåçã«WebPã«å€æã§ããŸãã
- ç»åCDNïŒç»åã®æé©åãšé ä¿¡ãå°éã®ãµãŒãã¹ã«ãªãããŒãããããã«ãç»åCDNã®äœ¿çšãæ€èšããŠãã ããã
äŸïŒ
import Image from 'next/image';
function MyComponent() {
return (
);
}
export default MyComponent;
ãã®ã³ãŒãã¹ãããã㯠`next/image` ã³ã³ããŒãã³ãã䜿çšããŠç»åã衚瀺ããŸããNext.jsã¯èªåçã«ç»åãããŸããŸãªããã€ã¹ãç»é¢ãµã€ãºã«åãããŠæé©åããŸãã
3. ããŒã¿ãã§ããã®æé©å
å¹ççãªããŒã¿ãã§ããã¯ãç¹ã«SSRããã³SSGäžã®ã¡ã¢ãªæ¶è²»ãåæžããããã«éèŠã§ããå€§èŠæš¡ãªããŒã¿ã»ããã¯ãå©çšå¯èœãªã¡ã¢ãªãããã«äœ¿ãæããå¯èœæ§ããããŸãã
ãã¹ããã©ã¯ãã£ã¹ïŒ
- ããŒãžããŒã·ã§ã³ïŒããŒãžããŒã·ã§ã³ãå®è£ ããŠãããŒã¿ãããå°ããªãã£ã³ã¯ã§ããŒãããŸãã
- ããŒã¿ãã£ãã·ã³ã°ïŒé »ç¹ã«ã¢ã¯ã»ã¹ãããããŒã¿ããã£ãã·ã¥ããŠãåé·ãªãã§ãããåé¿ããŸãã
- GraphQLïŒGraphQLã䜿çšããŠå¿ èŠãªããŒã¿ã®ã¿ããã§ãããããªãŒããŒãã§ãããåé¿ããŸãã
- ã¹ããªãŒãã³ã°ïŒãµãŒããŒããã¯ã©ã€ã¢ã³ãã«ããŒã¿ãã¹ããªãŒãã³ã°ããäžåºŠã«ã¡ã¢ãªã«ä¿åããå¿ èŠãããããŒã¿éãåæžããŸãã
äŸïŒããŒãžããŒã·ã§ã³ïŒïŒ
async function getPosts(page = 1, limit = 10) {
const response = await fetch(`https://api.example.com/posts?page=${page}&limit=${limit}`);
const data = await response.json();
return data;
}
export async function getStaticProps() {
const posts = await getPosts();
return {
props: {
posts,
},
};
}
ãã®ã³ãŒãã¹ããããã¯ãæçš¿ãããŒãžåå²ããã圢åŒã§ãã§ããããäžåºŠã«ãã§ãããããããŒã¿éãåæžããŸãããŠãŒã¶ãŒã®æäœïŒã次ã®ããŒãžããã¿ã³ã®ã¯ãªãã¯ãªã©ïŒã«åºã¥ããŠåŸç¶ã®ããŒãžããã§ããããããžãã¯ãå®è£ ããå¿ èŠããããŸãã
4. ããŒã«ã©ã€ãŒãŒã·ã§ã³ïŒi18nïŒã®æé©å
è€æ°ã®ãã±ãŒã«ã管çãããšãç¹ã«ã°ããŒãã«ã¢ããªã±ãŒã·ã§ã³ã§ã¯ã¡ã¢ãªæ¶è²»ãå€§å¹ ã«å¢å ããå¯èœæ§ããããŸããã¡ã¢ãªå¹çãç¶æããããã«ã¯ãããŒã«ã©ã€ãŒãŒã·ã§ã³æŠç¥ãæé©åããããšãäžå¯æ¬ ã§ãã
ãã¹ããã©ã¯ãã£ã¹ïŒ
- 翻蚳ã®é å»¶èªã¿èŸŒã¿ïŒã¢ã¯ãã£ããªãã±ãŒã«ã®ç¿»èš³ã®ã¿ãèªã¿èŸŒã¿ãŸãã
- 翻蚳ã®ãã£ãã·ã³ã°ïŒç¿»èš³ããã£ãã·ã¥ããŠãåé·ãªèªã¿èŸŒã¿ãåé¿ããŸãã
- ãã±ãŒã«ããšã®ã³ãŒãåå²ïŒãã±ãŒã«ã«åºã¥ããŠã¢ããªã±ãŒã·ã§ã³ã®ã³ãŒããåå²ããåãã±ãŒã«ã«å¿ èŠãªã³ãŒãã®ã¿ãèªã¿èŸŒãŸããããã«ããŸãã
- 翻蚳管çã·ã¹ãã ïŒTMSïŒã®äœ¿çšïŒTMSã¯ã翻蚳ã®ç®¡çãšæé©åã«åœ¹ç«ã¡ãŸãã
äŸïŒ`next-i18next` ã䜿çšãã翻蚳ã®é å»¶èªã¿èŸŒã¿ïŒïŒ
// next-i18next.config.js
module.exports = {
i18n: {
defaultLocale: 'en',
locales: ['en', 'fr', 'es'],
localePath: path.resolve('./public/locales'),
localeStructure: '{lng}/{ns}.json', // Ensures lazy loading per namespace and locale
},
};
// pages/_app.js
import { appWithTranslation } from 'next-i18next';
function MyApp({ Component, pageProps }) {
return ;
}
export default appWithTranslation(MyApp);
`next-i18next` ã䜿çšãããã®èšå®ã¯ã翻蚳ã®é å»¶èªã¿èŸŒã¿ãæå¹ã«ããŸãã翻蚳ãã¡ã€ã«ã `public/locales` ãã£ã¬ã¯ããªã«ãæå®ããã `localeStructure` ã«åŸã£ãŠæ£ããæŽçãããŠããããšã確èªããŠãã ããããŸã `next-i18next` ããã±ãŒãžãã€ã³ã¹ããŒã«ããŠãã ããã
5. ã¬ããŒãžã³ã¬ã¯ã·ã§ã³
ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ïŒGCïŒã¯ã䜿çšãããªããªã£ãã¡ã¢ãªãåå©çšããããã»ã¹ã§ãããã«ãããã»ã¹äžã«ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã匷å¶å®è¡ããããšã§ãã¡ã¢ãªæ¶è²»ãåæžã§ããŸãããã ããéåºŠãªæåGCåŒã³åºãã¯ããã©ãŒãã³ã¹ãæãªãå¯èœæ§ããããããæ éã«äœ¿çšããŠãã ããã
äŸïŒ
if (global.gc) {
global.gc();
} else {
console.warn('Garbage collection unavailable. Run with --expose-gc');
}
ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãæå¹ã«ããŠãã«ãããã»ã¹ãå®è¡ããã«ã¯ã`--expose-gc` ãã©ã°ã䜿çšããŸãã
node --expose-gc node_modules/.bin/next build
éèŠïŒ`--expose-gc` ã®äœ¿çšã¯ãããã©ãŒãã³ã¹ã«æªåœ±é¿ãäžããå¯èœæ§ããããããæ¬çªç°å¢ã§ã¯äžè¬çã«æšå¥šãããŸãããäž»ã«éçºäžã®ãããã°ãšæé©åã«äœ¿çšããŠãã ãããç°å¢å€æ°ã䜿çšããŠæ¡ä»¶ä»ãã§æå¹ã«ããããšãæ€èšããŠãã ããã
6. ã€ã³ã¯ãªã¡ã³ã¿ã«ãã«ã
Next.jsã¯ã€ã³ã¯ãªã¡ã³ã¿ã«ãã«ããæäŸããŠãããæåŸã®ãã«ã以éã«å€æŽãããã¢ããªã±ãŒã·ã§ã³ã®éšåã®ã¿ãåãã«ãããŸããããã«ããããã«ãæéãšã¡ã¢ãªæ¶è²»ãå€§å¹ ã«åæžã§ããŸãã
æ°žç¶ãã£ãã·ã¥ã®æå¹åïŒ
Next.jsã®èšå®ã§æ°žç¶ãã£ãã·ã¥ãæå¹ã«ãªã£ãŠããããšã確èªããŠãã ããã
// next.config.js
module.exports = {
cache: {
type: 'filesystem',
allowCollectingMemory: true,
},
};
ãã®èšå®ã¯ãNext.jsã«ãã¡ã€ã«ã·ã¹ãã ããã£ãã·ã³ã°ã«äœ¿çšããããã«æç€ºãã以åã«ãã«ããããã¢ã»ãããåå©çšããŠãã«ãæéãšã¡ã¢ãªäœ¿çšéãåæžã§ããããã«ããŸãã`allowCollectingMemory: true` ã¯ãNext.jsãæªäœ¿çšã®ãã£ãã·ã¥ã¢ã€ãã ãã¯ãªãŒã³ã¢ããããŠãããã«ã¡ã¢ãªãããããªã³ããåæžã§ããããã«ããŸãããã®ãã©ã°ã¯Node v16以äžã§ã®ã¿æ©èœããŸãã
7. ãµãŒããŒã¬ã¹é¢æ°ã®ã¡ã¢ãªå¶é
Next.jsã¢ããªã±ãŒã·ã§ã³ããµãŒããŒã¬ã¹ãã©ãããã©ãŒã ïŒäŸïŒVercelãNetlifyãAWS LambdaïŒã«ãããã€ããå Žåããã©ãããã©ãŒã ã«ãã£ãŠèª²ãããã¡ã¢ãªå¶éã«æ³šæããŠãã ããããããã®å¶éãè¶ ãããšããããã€ã®å€±æã«ã€ãªããå¯èœæ§ããããŸãã
ã¡ã¢ãªäœ¿çšéã®ç£èŠïŒ
ãµãŒããŒã¬ã¹é¢æ°ã®ã¡ã¢ãªäœ¿çšéãæ³šææ·±ãç£èŠããããã«å¿ããŠã³ãŒãã調æŽããŠãã ããããã©ãããã©ãŒã ã®ç£èŠããŒã«ã䜿çšããŠãã¡ã¢ãªã倧éã«æ¶è²»ããæäœãç¹å®ããŸãã
颿°ãµã€ãºã®æé©åïŒ
ãµãŒããŒã¬ã¹é¢æ°ãã§ããã ãå°ãããçŠç¹ãçµã£ããã®ã«ä¿ã¡ãŸããäžèŠãªäŸåé¢ä¿ãå«ãããã颿°å ã§è€éãªæäœãå®è¡ãããããããšã¯é¿ããŠãã ããã
8. ç°å¢å€æ°
ç°å¢å€æ°ã广çã«æŽ»çšããŠãèšå®ãæ©èœãã©ã°ã管çããŸããç°å¢å€æ°ãé©åã«èšå®ããããšã§ãã¡ã¢ãªäœ¿çšãã¿ãŒã³ã«åœ±é¿ãäžããç°å¢ïŒéçºãã¹ããŒãžã³ã°ãæ¬çªïŒã«åºã¥ããŠã¡ã¢ãªã倧éã«æ¶è²»ããæ©èœãæå¹ãŸãã¯ç¡å¹ã«ããããšãã§ããŸãã
äŸïŒ
// next.config.js
module.exports = {
env: {
ENABLE_IMAGE_OPTIMIZATION: process.env.NODE_ENV === 'production',
},
};
// components/MyComponent.js
function MyComponent() {
const enableImageOptimization = process.env.ENABLE_IMAGE_OPTIMIZATION === 'true';
return (
{enableImageOptimization ? (
) : (
)}
);
}
ãã®äŸã§ã¯ãæ¬çªç°å¢ã§ã®ã¿ç»åæé©åãæå¹ã«ããéçºãã«ãäžã®ã¡ã¢ãªäœ¿çšéãåæžããå¯èœæ§ããããŸãã
ã±ãŒã¹ã¹ã¿ãã£ãšã°ããŒãã«ãªäŸ
äžçäžã®ããŸããŸãªäŒæ¥ãã¡ã¢ãªå¹çã®ããã«Next.jsã®ãã«ãããã»ã¹ãã©ã®ããã«æé©åããããããã€ãã®ã±ãŒã¹ã¹ã¿ãã£ãšäŸãèŠãŠã¿ãŸãããã
ã±ãŒã¹ã¹ã¿ãã£1ïŒEã³ããŒã¹ãã©ãããã©ãŒã ïŒã°ããŒãã«å±éïŒ
è€æ°ã®åœã«é¡§å®¢ãæã€å€§èŠæš¡ãªEã³ããŒã¹ãã©ãããã©ãŒã ã¯ãèšå€§ãªéã®è£œåããŒã¿ãç»åã翻蚳ã®ããã«ããã«ãæéãšã¡ã¢ãªã®åé¡ãå¢å ããŠããŸããã圌ãã®æé©åæŠç¥ã«ã¯ä»¥äžãå«ãŸããŠããŸããã
- ãã«ãæã®è£œåããŒã¿ååŸã«ããŒãžããŒã·ã§ã³ãå®è£ ã
- ç»åæé©åããªãããŒãããããã«ç»åCDNã䜿çšã
- ç°ãªããã±ãŒã«ã®ç¿»èš³ãé å»¶èªã¿èŸŒã¿ã
- å°ççå°åã«åºã¥ãã³ãŒãåå²ã
ãããã®æé©åã«ããããã«ãæéãšã¡ã¢ãªæ¶è²»ãå€§å¹ ã«åæžãããäžçäžã®ãŠãŒã¶ãŒã«å¯ŸããŠããé«éãªãããã€ãšæ¹åããããŠã§ããµã€ãããã©ãŒãã³ã¹ãå¯èœã«ãªããŸããã
ã±ãŒã¹ã¹ã¿ãã£2ïŒãã¥ãŒã¹ã¢ã°ãªã²ãŒã¿ãŒïŒå€èšèªã³ã³ãã³ãïŒ
è€æ°ã®èšèªã§ã³ã³ãã³ããæäŸãããã¥ãŒã¹ã¢ã°ãªã²ãŒã¿ãŒã¯ããã«ãããã»ã¹äžã«ã¡ã¢ãªäžè¶³ãšã©ãŒãçºçããŠããŸããã圌ãã®è§£æ±ºçã«ã¯ä»¥äžãå«ãŸããŠããŸããã
- ããã¡ã¢ãªå¹çã®é«ã翻蚳管çã·ã¹ãã ãžã®åãæ¿ãã
- æªäœ¿çšã®ã³ãŒããåé€ããããã®ç©æ¥µçãªããªãŒã·ã§ã€ãã³ã°ã®å®è£ ã
- ç»åãã©ãŒãããã®æé©åãšé å»¶èªã¿èŸŒã¿ã®äœ¿çšã
- åãã«ãæéãççž®ããããã®ã€ã³ã¯ãªã¡ã³ã¿ã«ãã«ãã®æŽ»çšã
ãããã®å€æŽã«ãããã¡ã¢ãªå¶éãè¶ ããããšãªãã¢ããªã±ãŒã·ã§ã³ãæ£åžžã«ãã«ãããã³ãããã€ã§ããããã«ãªããã°ããŒãã«ãªãªãŒãã£ãšã³ã¹ã«ãã¥ãŒã¹ã³ã³ãã³ããã¿ã€ã ãªãŒã«é ä¿¡ããããšãä¿èšŒãããŸããã
äŸïŒåœéæ è¡äºçŽãã©ãããã©ãŒã
ã°ããŒãã«ãªæ è¡äºçŽãã©ãããã©ãŒã ã¯ãããã³ããšã³ãéçºã«Next.jsãå©çšããŠããŸãã圌ãã¯ããã©ã€ããããã«ããã®ä»ã®æ è¡ãµãŒãã¹ã«é¢é£ãã倧éã®åçããŒã¿ãæ±ã£ãŠããŸããã¡ã¢ãªç®¡çãæé©åããããã«ã圌ãã¯æ¬¡ã®ããšãè¡ã£ãŠããŸãã
- åé·ãªããŒã¿ãã§ãããæå°éã«æããããã«ããã£ãã·ã³ã°ã䌎ããµãŒããŒãµã€ãã¬ã³ããªã³ã°ãæ¡çšã
- ç¹å®ã®ã«ãŒããã³ã³ããŒãã³ãã«å¿ èŠãªããŒã¿ã®ã¿ããã§ããããããã«GraphQLã䜿çšã
- ãŠãŒã¶ãŒã®ããã€ã¹ãšå Žæã«åºã¥ããŠç»åã®ãµã€ãºå€æŽãšãã©ãŒããã倿ãåŠçããããã«ãCDNã䜿çšããå ç¢ãªç»åæé©åãã€ãã©ã€ã³ãå®è£ ã
- ç°å¢ïŒéçºãã¹ããŒãžã³ã°ãæ¬çªïŒã«åºã¥ããŠãªãœãŒã¹ã倧éã«æ¶è²»ããæ©èœïŒè©³çްãªå°å³ã¬ã³ããªã³ã°ãªã©ïŒãæå¹ãŸãã¯ç¡å¹ã«ããããã«ãç°å¢åºæã®èšå®ã掻çšã
çµè«
ã¡ã¢ãªå¹çã®ããã«Next.jsã®ãã«ãããã»ã¹ãæé©åããããšã¯ãç¹ã«ã°ããŒãã«ãªãªãŒãã£ãšã³ã¹ãã¿ãŒã²ãããšããã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠãã¹ã ãŒãºãªãããã€ãšé«æ§èœã確ä¿ããããã«éåžžã«éèŠã§ããã¡ã¢ãªæ¶è²»ã«å¯äžããèŠå ãçè§£ããããã«ããã¯ãç¹å®ãããã®ã¬ã€ãã§èª¬æããæé©åãã¯ããã¯ãé©çšããããšã§ãã¡ã¢ãªäœ¿çšéãå€§å¹ ã«åæžããNext.jsã¢ããªã±ãŒã·ã§ã³ã®å šäœçãªä¿¡é Œæ§ãšã¹ã±ãŒã©ããªãã£ãåäžãããããšãã§ããŸããã¢ããªã±ãŒã·ã§ã³ãé²åããã«ã€ããŠããã«ãããã»ã¹ãç¶ç¶çã«ç£èŠããæé©åæŠç¥ãé©å¿ãããŠæé©ãªããã©ãŒãã³ã¹ãç¶æããŠãã ããã
ç¹å®ã®ã¢ããªã±ãŒã·ã§ã³ãšã€ã³ãã©ã¹ãã©ã¯ãã£ã«ãšã£ãŠæã倧ããªåœ±é¿ãäžãããã¯ããã¯ãåªå ããããšãå¿ããªãã§ãã ããããã«ãããã»ã¹ã宿çã«ãããã¡ã€ãªã³ã°ããã³åæããããšã§ãæ¹åã®äœå°ãããé åãç¹å®ããNext.jsã¢ããªã±ãŒã·ã§ã³ãäžçäžã®ãŠãŒã¶ãŒã«ãšã£ãŠã¡ã¢ãªå¹çãé«ããããã©ãŒãã³ã¹ãåªããŠããããšãä¿èšŒã§ããŸãã