{"id":12331,"date":"2026-02-02T13:33:41","date_gmt":"2026-02-02T13:33:41","guid":{"rendered":"https:\/\/withcode.tech\/media\/?p=12331"},"modified":"2026-03-10T06:09:12","modified_gmt":"2026-03-10T06:09:12","slug":"jamstackform_explanation","status":"publish","type":"post","link":"https:\/\/withcode.tech\/media\/jamstackform_explanation\/","title":{"rendered":"\u3010\u5b9f\u6848\u4ef6\u3067\u4f7f\u3048\u308b\u3011Jamstack\u30d5\u30a9\u30fc\u30e0\u51e6\u7406 | \u30b5\u30fc\u30d0\u30fc\u30ec\u30b9\u3067\u306e\u5b9f\u88c5\u65b9\u6cd5\u3092\u5fb9\u5e95\u89e3\u8aac"},"content":{"rendered":"<div class=\"swell-block-balloon\"><div class=\"c-balloon -bln-left\" data-col=\"gray\"><div class=\"c-balloon__icon -square\"><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/withcode.tech\/media\/wp-content\/uploads\/2025\/06\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2025-06-15-14.40.37.jpg\" alt=\"\" class=\"c-balloon__iconImg\" width=\"80px\" height=\"80px\"><span class=\"c-balloon__iconName\">\u751f\u5f92<\/span><\/div><div class=\"c-balloon__body -speaking -border-none\"><div class=\"c-balloon__text\">\n<p><strong>\u5148\u751f\u3001\u9759\u7684\u30b5\u30a4\u30c8\u3067\u304a\u554f\u3044\u5408\u308f\u305b\u30d5\u30a9\u30fc\u30e0\u3092\u5b9f\u88c5\u3057\u305f\u3044\u3093\u3067\u3059\u3051\u3069\u3001\u30d0\u30c3\u30af\u30a8\u30f3\u30c9\u30b5\u30fc\u30d0\u30fc\u304c\u306a\u3044\u3068\u30d5\u30a9\u30fc\u30e0\u9001\u4fe1\u3067\u304d\u307e\u305b\u3093\u3088\u306d\u2026\u3069\u3046\u3059\u308c\u3070\u3044\u3044\u3067\u3059\u304b\uff1f<\/strong><\/p>\n<span class=\"c-balloon__shapes\"><span class=\"c-balloon__before\"><\/span><span class=\"c-balloon__after\"><\/span><\/span><\/div><\/div><\/div><\/div>\n\n<div class=\"swell-block-balloon\"><div class=\"c-balloon -bln-right\" data-col=\"gray\"><div class=\"c-balloon__icon -square\"><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/withcode.tech\/media\/wp-content\/uploads\/2025\/06\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2025-06-15-15.11.23.jpg\" alt=\"\" class=\"c-balloon__iconImg\" width=\"80px\" height=\"80px\"><span class=\"c-balloon__iconName\">\u30da\u30f3\u535a\u58eb<\/span><\/div><div class=\"c-balloon__body -speaking -border-none\"><div class=\"c-balloon__text\">\n<p><strong>\u3088\u30fc\u304f\u805e\u304f\u3093\u3060\u305e\u3002\u4eca\u65e5\u306f\u30b5\u30fc\u30d0\u30fc\u30ec\u30b9\u95a2\u6570\u3092\u4f7f\u3063\u305f\u30d5\u30a9\u30fc\u30e0\u51e6\u7406\u306b\u3064\u3044\u3066\u8a73\u3057\u304f\u89e3\u8aac\u3059\u308b\u305e\u3044\uff01\u9759\u7684\u30b5\u30a4\u30c8\u3067\u3082\u7c21\u5358\u306b\u30d5\u30a9\u30fc\u30e0\u6a5f\u80fd\u3092\u5b9f\u88c5\u3067\u304d\u308b\u3093\u3058\u3083\uff01<\/strong><\/p>\n<span class=\"c-balloon__shapes\"><span class=\"c-balloon__before\"><\/span><span class=\"c-balloon__after\"><\/span><\/span><\/div><\/div><\/div><\/div>\n\n<div class=\"swell-block-balloon\"><div class=\"c-balloon -bln-left\" data-col=\"gray\"><div class=\"c-balloon__icon -square\"><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/withcode.tech\/media\/wp-content\/uploads\/2025\/06\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2025-06-15-14.48.08.jpg\" alt=\"\" class=\"c-balloon__iconImg\" width=\"80px\" height=\"80px\"><span class=\"c-balloon__iconName\">\u751f\u5f92<\/span><\/div><div class=\"c-balloon__body -speaking -border-none\"><div class=\"c-balloon__text\">\n<p><strong>\u305d\u3046\u8a00\u3046\u65b9\u6cd5\u304c\u3042\u308b\u3093\u3067\u3059\u306d\uff01\u306f\u3044\uff01\u304a\u9858\u3044\u3057\u307e\u3059\uff01<\/strong><\/p>\n<span class=\"c-balloon__shapes\"><span class=\"c-balloon__before\"><\/span><span class=\"c-balloon__after\"><\/span><\/span><\/div><\/div><\/div><\/div>\n\n\n<p>Jamstack\u30b5\u30a4\u30c8\u306f\u3001\u9ad8\u901f\u3067\u30bb\u30ad\u30e5\u30a2\u306aWeb\u30b5\u30a4\u30c8\u3092\u69cb\u7bc9\u3067\u304d\u308b\u4e00\u65b9\u3067\u3001<strong><span class=\"swl-marker mark_yellow\">\u52d5\u7684\u306a\u51e6\u7406\u304c\u5fc5\u8981\u306a\u30d5\u30a9\u30fc\u30e0\u9001\u4fe1<\/span><\/strong>\u3067\u306f\u8ab2\u984c\u304c\u767a\u751f\u3057\u307e\u3059\u3002\u5f93\u6765\u306e\u30b5\u30fc\u30d0\u30fc\u30b5\u30a4\u30c9\u51e6\u7406\u304c\u4f7f\u3048\u306a\u3044\u305f\u3081\u3001\u30d5\u30a9\u30fc\u30e0\u30c7\u30fc\u30bf\u306e\u53d7\u4fe1\u3084\u30e1\u30fc\u30eb\u9001\u4fe1\u3092\u5225\u306e\u65b9\u6cd5\u3067\u5b9f\u88c5\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u305d\u3053\u3067\u6d3b\u7528\u3059\u308b\u306e\u304c\u3001<strong><span class=\"swl-marker mark_yellow\">\u30b5\u30fc\u30d0\u30fc\u30ec\u30b9\u95a2\u6570\uff08Serverless Functions\uff09<\/span><\/strong>\u3067\u3059\u3002\u30b5\u30fc\u30d0\u30fc\u30ec\u30b9\u95a2\u6570\u3092\u4f7f\u3048\u3070\u3001<strong><span class=\"swl-marker mark_yellow\">\u30b5\u30fc\u30d0\u30fc\u3092\u7ba1\u7406\u3059\u308b\u3053\u3068\u306a\u304f\u3001\u30d5\u30a9\u30fc\u30e0\u51e6\u7406\u3092\u5b9f\u88c5<\/span><\/strong>\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u672c\u8a18\u4e8b\u3067\u306f\u3001Jamstack\u30b5\u30a4\u30c8\u3067\u306e\u30d5\u30a9\u30fc\u30e0\u51e6\u7406\u3092\u30b5\u30fc\u30d0\u30fc\u30ec\u30b9\u3067\u5b9f\u88c5\u3059\u308b\u65b9\u6cd5\u3092\u3001\u8907\u6570\u306e\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\uff08Netlify\u3001Vercel\u3001AWS Lambda\uff09\u3092\u4f7f\u3063\u305f\u5b9f\u88c5\u4f8b\u3068\u3068\u3082\u306b\u8a73\u3057\u304f\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"is-style-icon_announce\">\u300c\u5b66\u7fd2\u2192\u6848\u4ef6\u7372\u5f97\u300d\u306b\u3064\u306a\u3052\u305f\u53d7\u8b1b\u751f\u306e\u30ea\u30a2\u30eb\u306a\u4f53\u9a13\u8ac7\u3082\u516c\u958b\u4e2d\uff01<br>\u50cd\u304d\u65b9\u3092\u5909\u3048\u305f\u3044\u65b9\u306b\u3082\u97ff\u304f\u30b9\u30c8\u30fc\u30ea\u30fc\u3067\u3059\u3002<\/p>\n\n\n\n<p class=\"is-style-icon_info\"><strong><strong>\u83c5\u4e95<\/strong>\u3055\u3093<\/strong><br>\u5c06\u6765\u7684\u3078\u306e\u4e0d\u5b89\u3068\u5b50\u80b2\u3066\u3068\u3044\u3046\u80cc\u666f\u304b\u3089\u300c\u526f\u696d\u300d\u306b\u6311\u6226\u3057\u3088\u3046\u3068\u6c7a\u610f\u3002\u72ec\u5b66\u304b\u3089\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0\u306e\u5b66\u7fd2\u3092\u958b\u59cb\u3057\u3066\u3044\u305f\u304c\u3001WithCode\u306b\u51fa\u4f1a\u3044\u4f53\u9a13\u30b3\u30fc\u30b9\u3092\u53d7\u8b1b\u3002\u7d044\u30f6\u6708\u306e\u5b66\u7fd2\u306b\u53d6\u308a\u7d44\u307f\u3001\u5f53\u521d\u306e\u76ee\u6a19\u3067\u3042\u3063\u305f\u5352\u696d\u30c6\u30b9\u30c8\u5408\u683c\u3092\u5b9f\u73fe\u3057\u305f\u3002WithCode Platinum\u306b\u30663\u4ef6\u306e\u6848\u4ef6\u3092\u62c5\u5f53\u3057\u3001\u73fe\u5728\u306f\u526f\u696d\u3060\u3051\u3067\u306a\u304f\u672c\u683c\u7684\u306b\u300c\u30d5\u30ea\u30fc\u30e9\u30f3\u30b9\u300d\u3068\u3057\u3066\u5728\u5b85\u3067\u6d3b\u8e8d\u3057\u3066\u3044\u304d\u305f\u3044\u3068\u8003\u3048\u308b\u3088\u3046\u306b\u306a\u308b\u3002<\/p>\n\n\n\n<p>\u8a73\u3057\u304f\u306f<a href=\"https:\/\/withcode.tech\/media\/interview_5\/\" title=\"\">\u3053\u3061\u3089\u306e\u8a18\u4e8b<\/a>\u3092\u3054\u89a7\u304f\u3060\u3055\u3044\u3002<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-withcode-media wp-block-embed-withcode-media\"><div class=\"wp-block-embed__wrapper\">\nhttps:\/\/withcode.tech\/media\/interview_5\/\n<\/div><\/figure>\n\n\n\n<p class=\"is-style-balloon_box2\"><strong>\u83c5\u4e95\u3055\u3093\u306e\u4e3b\u306a\u5236\u4f5c\u5b9f\u7e3e\u306f\u3053\u3061\u3089<\/strong><\/p>\n\n\n<div class=\"swell-block-postLink\">\t\t\t<div class=\"p-blogCard -external\" data-type=\"type3\" data-onclick=\"clickLink\">\n\t\t\t\t<div class=\"p-blogCard__inner\">\n\t\t\t\t\t<span class=\"p-blogCard__caption\">\u5e83\u544a\u7528\u9014\u3067\u306e\u65b0\u898fLP\u5236\u4f5c<\/span>\n\t\t\t\t\t<div class=\"p-blogCard__thumb c-postThumb\"><figure class=\"c-postThumb__figure\"><img decoding=\"async\" src=\"https:\/\/withcode.tech\/media\/wp-content\/uploads\/2025\/07\/\u83c5\u4e95\u3055\u3093.webp\" alt=\"\" class=\"c-postThumb__img u-obf-cover\" width=\"320\" height=\"180\"><\/figure><\/div>\t\t\t\t\t<div class=\"p-blogCard__body\">\n\t\t\t\t\t\t<a class=\"p-blogCard__title\" href=\"https:\/\/withcode.tech\/works\/yourdelt\/\" target=\"_blank\" rel=\"noopener noreferrer\">\u682a\u5f0f\u4f1a\u793eYOURDELT \u69d8<\/a>\n\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t<\/div>\n\t\t<\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Jamstack\u3068\u306f\uff1f<\/h2>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"alignleft size-full\"><img decoding=\"async\" width=\"1536\" height=\"1024\" src=\"https:\/\/withcode.tech\/media\/wp-content\/uploads\/2026\/02\/1000006389.jpg\" alt=\"\" class=\"wp-image-12847\" srcset=\"https:\/\/withcode.tech\/media\/wp-content\/uploads\/2026\/02\/1000006389.jpg 1536w, https:\/\/withcode.tech\/media\/wp-content\/uploads\/2026\/02\/1000006389-768x512.jpg 768w\" sizes=\"(max-width: 1536px) 100vw, 1536px\" \/><\/figure>\n<\/div>\n\n\n<p>Jamstack\uff08\u30b8\u30e3\u30e0\u30b9\u30bf\u30c3\u30af\uff09\u306f\u3001JavaScript\u3001API\u3001Markup\u306e\u982d\u6587\u5b57\u3092\u53d6\u3063\u305f\u3001\u30e2\u30c0\u30f3\u306aWeb\u958b\u767a\u30a2\u30fc\u30ad\u30c6\u30af\u30c1\u30e3\u3067\u3059\u3002\u5f93\u6765\u306e\u30b5\u30fc\u30d0\u30fc\u30b5\u30a4\u30c9\u30ec\u30f3\u30c0\u30ea\u30f3\u30b0\u3067\u306f\u306a\u304f\u3001<strong><span class=\"swl-marker mark_yellow\">\u4e8b\u524d\u306bHTML\u3092\u751f\u6210\uff08Pre-rendering\uff09\u3057\u3001CDN\u3067\u914d\u4fe1\u3059\u308b<\/span><\/strong>\u3053\u3068\u3067\u3001\u9ad8\u901f\u3067\u5b89\u5168\u306aWeb\u30b5\u30a4\u30c8\u3092\u5b9f\u73fe\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Jamstack\u306e\u7279\u5fb4<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u9ad8\u901f\u306a\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9<\/strong>\uff1a\u9759\u7684\u30d5\u30a1\u30a4\u30eb\u3092CDN\u304b\u3089\u914d\u4fe1\u3059\u308b\u305f\u3081\u3001\u8868\u793a\u901f\u5ea6\u304c\u901f\u3044<\/li>\n\n\n\n<li><strong>\u9ad8\u3044\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3<\/strong>\uff1a\u30b5\u30fc\u30d0\u30fc\u30b5\u30a4\u30c9\u306e\u653b\u6483\u5bfe\u8c61\u304c\u5c11\u306a\u3044<\/li>\n\n\n\n<li><strong>\u30b9\u30b1\u30fc\u30e9\u30d3\u30ea\u30c6\u30a3<\/strong>\uff1aCDN\u3067\u914d\u4fe1\u3055\u308c\u308b\u305f\u3081\u3001\u30a2\u30af\u30bb\u30b9\u5897\u52a0\u306b\u5f37\u3044<\/li>\n\n\n\n<li><strong>\u4f4e\u30b3\u30b9\u30c8<\/strong>\uff1a\u30b5\u30fc\u30d0\u30fc\u7ba1\u7406\u304c\u4e0d\u8981\u3067\u3001\u30db\u30b9\u30c6\u30a3\u30f3\u30b0\u8cbb\u7528\u304c\u5b89\u3044<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\u4e3b\u8981\u306aJamstack\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Netlify<\/strong>\uff1a\u30d5\u30a9\u30fc\u30e0\u6a5f\u80fd\u3001Functions\u3001\u30c7\u30d7\u30ed\u30a4\u304c\u7d71\u5408<\/li>\n\n\n\n<li><strong>Vercel<\/strong>\uff1aNext.js\u3068\u306e\u76f8\u6027\u304c\u826f\u3044\u3001Serverless Functions\u3092\u63d0\u4f9b<\/li>\n\n\n\n<li><strong>Cloudflare Pages<\/strong>\uff1a\u9ad8\u901f\u306aCDN\u3001Workers\u6a5f\u80fd<\/li>\n\n\n\n<li><strong>AWS Amplify<\/strong>\uff1aAWS\u30a8\u30b3\u30b7\u30b9\u30c6\u30e0\u3068\u306e\u7d71\u5408<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Jamstack\u30b5\u30a4\u30c8\u306e\u30d5\u30a9\u30fc\u30e0\u51e6\u7406\u306e\u8ab2\u984c<\/h2>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"alignleft size-full\"><img decoding=\"async\" width=\"1536\" height=\"1024\" src=\"https:\/\/withcode.tech\/media\/wp-content\/uploads\/2026\/02\/1000006425.jpg\" alt=\"\" class=\"wp-image-12850\" srcset=\"https:\/\/withcode.tech\/media\/wp-content\/uploads\/2026\/02\/1000006425.jpg 1536w, https:\/\/withcode.tech\/media\/wp-content\/uploads\/2026\/02\/1000006425-768x512.jpg 768w\" sizes=\"(max-width: 1536px) 100vw, 1536px\" \/><\/figure>\n<\/div>\n\n<div class=\"swell-block-balloon\"><div class=\"c-balloon -bln-left\" data-col=\"gray\"><div class=\"c-balloon__icon -square\"><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/withcode.tech\/media\/wp-content\/uploads\/2025\/06\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2025-06-15-15.00.55.jpg\" alt=\"\" class=\"c-balloon__iconImg\" width=\"80px\" height=\"80px\"><span class=\"c-balloon__iconName\">\u751f\u5f92<\/span><\/div><div class=\"c-balloon__body -speaking -border-none\"><div class=\"c-balloon__text\">\n<p><strong>\u9759\u7684\u30b5\u30a4\u30c8\u3060\u3068\u3001\u306a\u305c\u30d5\u30a9\u30fc\u30e0\u51e6\u7406\u304c\u96e3\u3057\u3044\u3093\u3067\u3059\u304b\uff1f<\/strong><\/p>\n<span class=\"c-balloon__shapes\"><span class=\"c-balloon__before\"><\/span><span class=\"c-balloon__after\"><\/span><\/span><\/div><\/div><\/div><\/div>\n\n<div class=\"swell-block-balloon\"><div class=\"c-balloon -bln-right\" data-col=\"gray\"><div class=\"c-balloon__icon -square\"><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/withcode.tech\/media\/wp-content\/uploads\/2025\/06\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2025-06-15-15.11.23.jpg\" alt=\"\" class=\"c-balloon__iconImg\" width=\"80px\" height=\"80px\"><span class=\"c-balloon__iconName\">\u30da\u30f3\u535a\u58eb<\/span><\/div><div class=\"c-balloon__body -speaking -border-none\"><div class=\"c-balloon__text\">\n<p><strong>\u9759\u7684\u30b5\u30a4\u30c8\u306b\u306f\u30d0\u30c3\u30af\u30a8\u30f3\u30c9\u30b5\u30fc\u30d0\u30fc\u304c\u306a\u3044\u304b\u3089\u3001\u30d5\u30a9\u30fc\u30e0\u30c7\u30fc\u30bf\u3092\u53d7\u3051\u53d6\u308b\u4ed5\u7d44\u307f\u3092\u5225\u9014\u7528\u610f\u3059\u308b\u5fc5\u8981\u304c\u3042\u308b\u3093\u3058\u3083\uff01<\/strong><\/p>\n<span class=\"c-balloon__shapes\"><span class=\"c-balloon__before\"><\/span><span class=\"c-balloon__after\"><\/span><\/span><\/div><\/div><\/div><\/div>\n\n\n<h3 class=\"wp-block-heading\">\u5f93\u6765\u306e\u30d5\u30a9\u30fc\u30e0\u51e6\u7406\uff08\u30b5\u30fc\u30d0\u30fc\u30b5\u30a4\u30c9\uff09<\/h3>\n\n\n\n<p>\u5f93\u6765\u306eWeb\u30b5\u30a4\u30c8\u3067\u306f\u3001PHP\u3084Node.js\u306a\u3069\u306e\u30b5\u30fc\u30d0\u30fc\u30b5\u30a4\u30c9\u8a00\u8a9e\u3067\u30d5\u30a9\u30fc\u30e0\u30c7\u30fc\u30bf\u3092\u53d7\u3051\u53d6\u308a\u3001\u51e6\u7406\u3057\u3066\u3044\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-php\" data-lang=\"PHP\"><code>\/\/ \u5f93\u6765\u306ePHP\u3067\u306e\u30d5\u30a9\u30fc\u30e0\u51e6\u7406\u4f8b\n&lt;?php\nif ($_POST[&#39;name&#39;] && $_POST[&#39;email&#39;]) {\n  $name = $_POST[&#39;name&#39;];\n  $email = $_POST[&#39;email&#39;];\n  mail(&#39;admin@example.com&#39;, &#39;\u304a\u554f\u3044\u5408\u308f\u305b&#39;, $message);\n}\n?&gt;<\/code><\/pre><\/div>\n\n\n\n<p>\u3057\u304b\u3057\u3001Jamstack\u30b5\u30a4\u30c8\u306f<strong><span class=\"swl-marker mark_yellow\">\u9759\u7684\u30d5\u30a1\u30a4\u30eb\u306e\u307f<\/span><\/strong>\u3067\u69cb\u6210\u3055\u308c\u308b\u305f\u3081\u3001\u3053\u306e\u3088\u3046\u306a\u51e6\u7406\u304c\u3067\u304d\u307e\u305b\u3093\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Jamstack\u3067\u306e\u30d5\u30a9\u30fc\u30e0\u51e6\u7406\u306e\u89e3\u6c7a\u7b56<\/h3>\n\n\n\n<p>Jamstack\u30b5\u30a4\u30c8\u3067\u30d5\u30a9\u30fc\u30e0\u51e6\u7406\u3092\u5b9f\u73fe\u3059\u308b\u65b9\u6cd5\u306f\u3001\u4e3b\u306b\u4ee5\u4e0b\u306e3\u3064\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30b5\u30fc\u30d0\u30fc\u30ec\u30b9\u95a2\u6570\uff08Serverless Functions\uff09<\/strong>\uff1a\u81ea\u5206\u3067\u30b3\u30fc\u30c9\u3092\u66f8\u3044\u3066\u51e6\u7406<\/li>\n\n\n\n<li><strong>\u30d5\u30a9\u30fc\u30e0\u9001\u4fe1\u30b5\u30fc\u30d3\u30b9<\/strong>\uff1aNetlify Forms\u3001Formspree\u306a\u3069\u306e\u5c02\u7528\u30b5\u30fc\u30d3\u30b9\u3092\u5229\u7528<\/li>\n\n\n\n<li><strong>\u5916\u90e8API<\/strong>\uff1aSendGrid\u3001Mailgun\u3001Firebase Firestore\u306a\u3069\u3092\u5229\u7528<\/li>\n<\/ol>\n\n\n\n<p>\u6b21\u3067\u306f\u3001<strong><span class=\"swl-marker mark_yellow\">\u30b5\u30fc\u30d0\u30fc\u30ec\u30b9\u95a2\u6570<\/span><\/strong>\u3092\u4f7f\u3063\u305f\u5b9f\u88c5\u65b9\u6cd5\u3092\u4e2d\u5fc3\u306b\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u30b5\u30fc\u30d0\u30fc\u30ec\u30b9\u95a2\u6570\u3068\u306f\uff1f<\/h2>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"alignleft size-full\"><img decoding=\"async\" width=\"1536\" height=\"1024\" src=\"https:\/\/withcode.tech\/media\/wp-content\/uploads\/2026\/02\/1000006426.jpg\" alt=\"\" class=\"wp-image-12851\" srcset=\"https:\/\/withcode.tech\/media\/wp-content\/uploads\/2026\/02\/1000006426.jpg 1536w, https:\/\/withcode.tech\/media\/wp-content\/uploads\/2026\/02\/1000006426-768x512.jpg 768w\" sizes=\"(max-width: 1536px) 100vw, 1536px\" \/><\/figure>\n<\/div>\n\n\n<p>\u30b5\u30fc\u30d0\u30fc\u30ec\u30b9\u95a2\u6570\uff08Serverless Functions\uff09\u306f\u3001<strong><span class=\"swl-marker mark_yellow\">\u30b5\u30fc\u30d0\u30fc\u3092\u7ba1\u7406\u305b\u305a\u306b\u5b9f\u884c\u3067\u304d\u308b\u95a2\u6570<\/span><\/strong>\u3067\u3059\u3002\u5fc5\u8981\u306a\u3068\u304d\u3060\u3051\u5b9f\u884c\u3055\u308c\u3001\u4f7f\u3063\u305f\u5206\u3060\u3051\u8ab2\u91d1\u3055\u308c\u308b\u4ed5\u7d44\u307f\u3067\u3001\u904b\u7528\u30b3\u30b9\u30c8\u304c\u4f4e\u3044\u306e\u304c\u7279\u5fb4\u3067\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u30b5\u30fc\u30d0\u30fc\u30ec\u30b9\u95a2\u6570\u306e\u7279\u5fb4<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u30b5\u30fc\u30d0\u30fc\u7ba1\u7406\u4e0d\u8981<\/strong>\uff1a\u30a4\u30f3\u30d5\u30e9\u306e\u8a2d\u5b9a\u3084\u4fdd\u5b88\u304c\u4e0d\u8981<\/li>\n\n\n\n<li><strong>\u81ea\u52d5\u30b9\u30b1\u30fc\u30ea\u30f3\u30b0<\/strong>\uff1a\u30a2\u30af\u30bb\u30b9\u6570\u306b\u5fdc\u3058\u3066\u81ea\u52d5\u7684\u306b\u51e6\u7406\u80fd\u529b\u304c\u8abf\u6574\u3055\u308c\u308b<\/li>\n\n\n\n<li><strong>\u5f93\u91cf\u8ab2\u91d1<\/strong>\uff1a\u5b9f\u884c\u3057\u305f\u56de\u6570\u30fb\u6642\u9593\u306b\u5fdc\u3058\u305f\u8ab2\u91d1<\/li>\n\n\n\n<li><strong>\u9ad8\u53ef\u7528\u6027<\/strong>\uff1a\u8907\u6570\u306e\u30ea\u30fc\u30b8\u30e7\u30f3\u3067\u81ea\u52d5\u7684\u306b\u5197\u9577\u5316<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\u4e3b\u8981\u306a\u30b5\u30fc\u30d0\u30fc\u30ec\u30b9\u95a2\u6570\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0<\/th><th>\u30b5\u30fc\u30d3\u30b9\u540d<\/th><th>\u8a00\u8a9e<\/th><th>\u7121\u6599\u67a0<\/th><\/tr><\/thead><tbody><tr><td>Netlify<\/td><td>Netlify Functions<\/td><td>JavaScript\u3001TypeScript\u3001Go<\/td><td>125,000\u30ea\u30af\u30a8\u30b9\u30c8\/\u6708<\/td><\/tr><tr><td>Vercel<\/td><td>Serverless Functions<\/td><td>JavaScript\u3001TypeScript\u3001Go\u3001Python\u3001Ruby<\/td><td>100GB-\u6642\u9593\/\u6708<\/td><\/tr><tr><td>AWS<\/td><td>Lambda<\/td><td>Node.js\u3001Python\u3001Go\u3001Java\u3001C#\u306a\u3069<\/td><td>100\u4e07\u30ea\u30af\u30a8\u30b9\u30c8\/\u6708<\/td><\/tr><tr><td>Firebase<\/td><td>Cloud Functions<\/td><td>JavaScript\u3001TypeScript<\/td><td>200\u4e07\u547c\u3073\u51fa\u3057\/\u6708<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u5b9f\u88c5\u65b9\u6cd51\uff1aNetlify Functions\u3092\u4f7f\u3063\u305f\u30d5\u30a9\u30fc\u30e0\u51e6\u7406<\/h2>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"alignleft size-full\"><img decoding=\"async\" width=\"1536\" height=\"1024\" src=\"https:\/\/withcode.tech\/media\/wp-content\/uploads\/2026\/02\/1000006391.jpg\" alt=\"\" class=\"wp-image-12852\" srcset=\"https:\/\/withcode.tech\/media\/wp-content\/uploads\/2026\/02\/1000006391.jpg 1536w, https:\/\/withcode.tech\/media\/wp-content\/uploads\/2026\/02\/1000006391-768x512.jpg 768w\" sizes=\"(max-width: 1536px) 100vw, 1536px\" \/><\/figure>\n<\/div>\n\n<div class=\"swell-block-balloon\"><div class=\"c-balloon -bln-left\" data-col=\"gray\"><div class=\"c-balloon__icon -square\"><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/withcode.tech\/media\/wp-content\/uploads\/2025\/06\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2025-06-15-15.00.55.jpg\" alt=\"\" class=\"c-balloon__iconImg\" width=\"80px\" height=\"80px\"><span class=\"c-balloon__iconName\">\u751f\u5f92<\/span><\/div><div class=\"c-balloon__body -speaking -border-none\"><div class=\"c-balloon__text\">\n<p><strong>Netlify Functions\u3063\u3066\u306a\u3093\u3067\u3059\u304b\uff1f<\/strong><\/p>\n<span class=\"c-balloon__shapes\"><span class=\"c-balloon__before\"><\/span><span class=\"c-balloon__after\"><\/span><\/span><\/div><\/div><\/div><\/div>\n\n<div class=\"swell-block-balloon\"><div class=\"c-balloon -bln-right\" data-col=\"gray\"><div class=\"c-balloon__icon -square\"><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/withcode.tech\/media\/wp-content\/uploads\/2025\/06\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2025-06-15-15.09.27.jpg\" alt=\"\" class=\"c-balloon__iconImg\" width=\"80px\" height=\"80px\"><span class=\"c-balloon__iconName\">\u30da\u30f3\u535a\u58eb<\/span><\/div><div class=\"c-balloon__body -speaking -border-none\"><div class=\"c-balloon__text\">\n<p><strong>Netlify Functions\u306f\u3001Netlify\u304c\u63d0\u4f9b\u3059\u308b\u30b5\u30fc\u30d0\u30fc\u30ec\u30b9\u95a2\u6570\u30b5\u30fc\u30d3\u30b9\u3058\u3083\u3002\u30c7\u30d7\u30ed\u30a4\u304c\u7c21\u5358\u3067\u3001\u521d\u5fc3\u8005\u306b\u3082\u6271\u3044\u3084\u3059\u3044\u306e\u304c\u7279\u5fb4\u3058\u3083\uff01<\/strong><\/p>\n<span class=\"c-balloon__shapes\"><span class=\"c-balloon__before\"><\/span><span class=\"c-balloon__after\"><\/span><\/span><\/div><\/div><\/div><\/div>\n\n\n<h3 class=\"wp-block-heading\">\u30b9\u30c6\u30c3\u30d71\uff1a\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u69cb\u9020\u306e\u6e96\u5099<\/h3>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>my-jamstack-site\/\n\u251c\u2500\u2500 public\/\n\u2502   \u2514\u2500\u2500 index.html\n\u251c\u2500\u2500 netlify\/\n\u2502   \u2514\u2500\u2500 functions\/\n\u2502       \u2514\u2500\u2500 form-handler.js\n\u2514\u2500\u2500 netlify.toml<\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">\u30b9\u30c6\u30c3\u30d72\uff1a\u30d5\u30a9\u30fc\u30e0HTML\u306e\u4f5c\u6210<\/h3>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-html\" data-lang=\"HTML\"><code>&lt;!DOCTYPE html&gt;\n&lt;html lang=&quot;ja&quot;&gt;\n&lt;head&gt;\n  &lt;meta charset=&quot;UTF-8&quot;&gt;\n  &lt;title&gt;\u304a\u554f\u3044\u5408\u308f\u305b\u30d5\u30a9\u30fc\u30e0&lt;\/title&gt;\n\n  &lt;style&gt;\n    body {\n      font-family: system-ui, sans-serif;\n      line-height: 1.6;\n    }\n\n    h1 {\n      margin-bottom: 24px;\n    }\n\n    #contact-form {\n      display: flex;\n      flex-direction: column;\n      gap: 24px; \n      max-width: 500px;\n    }\n\n    \/* \u5404\u30d5\u30a3\u30fc\u30eb\u30c9 *\/\n    #contact-form &gt; div {\n      display: flex;\n      flex-direction: column;\n      gap: 8px; \/* \u30e9\u30d9\u30eb\u3068\u5165\u529b\u6b04\u306e\u9593\u9694 *\/\n    }\n\n    label {\n      font-weight: 600;\n    }\n\n    input,\n    textarea {\n      padding: 12px;\n      border: 1px solid #ccc;\n      border-radius: 6px;\n      font-size: 16px;\n    }\n\n    button {\n      padding: 14px;\n      border: none;\n      border-radius: 8px;\n      background: #0066cc;\n      color: white;\n      font-size: 16px;\n      cursor: pointer;\n      transition: background 0.2s ease;\n    }\n\n    button:hover {\n      background: #004999;\n    }\n  &lt;\/style&gt;\n&lt;\/head&gt;\n\n&lt;body&gt;\n  &lt;h1&gt;\u304a\u554f\u3044\u5408\u308f\u305b&lt;\/h1&gt;\n\n  &lt;form id=&quot;contact-form&quot;&gt;\n    &lt;div&gt;\n      &lt;label for=&quot;name&quot;&gt;\u304a\u540d\u524d&lt;\/label&gt;\n      &lt;input type=&quot;text&quot; id=&quot;name&quot; name=&quot;name&quot; required&gt;\n    &lt;\/div&gt;\n\n    &lt;div&gt;\n      &lt;label for=&quot;email&quot;&gt;\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9&lt;\/label&gt;\n      &lt;input type=&quot;email&quot; id=&quot;email&quot; name=&quot;email&quot; required&gt;\n    &lt;\/div&gt;\n\n    &lt;div&gt;\n      &lt;label for=&quot;message&quot;&gt;\u304a\u554f\u3044\u5408\u308f\u305b\u5185\u5bb9&lt;\/label&gt;\n      &lt;textarea id=&quot;message&quot; name=&quot;message&quot; rows=&quot;5&quot; required&gt;&lt;\/textarea&gt;\n    &lt;\/div&gt;\n\n    &lt;button type=&quot;submit&quot;&gt;\u9001\u4fe1&lt;\/button&gt;\n  &lt;\/form&gt;\n\n  &lt;script&gt;\n    const form = document.getElementById(&#39;contact-form&#39;);\n\n    form.addEventListener(&#39;submit&#39;, async (e) =&gt; {\n      e.preventDefault();\n\n      const formData = new FormData(form);\n      const data = Object.fromEntries(formData);\n\n      try {\n        const response = await fetch(&#39;\/.netlify\/functions\/form-handler&#39;, {\n          method: &#39;POST&#39;,\n          headers: { &#39;Content-Type&#39;: &#39;application\/json&#39; },\n          body: JSON.stringify(data),\n        });\n\n        if (response.ok) {\n          alert(&#39;\u9001\u4fe1\u304c\u5b8c\u4e86\u3057\u307e\u3057\u305f\uff01&#39;);\n          form.reset();\n        } else {\n          alert(&#39;\u9001\u4fe1\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002\u3082\u3046\u4e00\u5ea6\u304a\u8a66\u3057\u304f\u3060\u3055\u3044\u3002&#39;);\n        }\n      } catch (error) {\n        console.error(&#39;Error:&#39;, error);\n        alert(&#39;\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002&#39;);\n      }\n    });\n  &lt;\/script&gt;\n&lt;\/body&gt;\n&lt;\/html&gt;<\/code><\/pre><\/div>\n\n\n\n<h4 class=\"wp-block-heading\">\u5b9f\u88c5\u7d50\u679c<\/h4>\n\n\n\n<!DOCTYPE html>\n<html lang=\"ja\">\n<head>\n  <meta charset=\"UTF-8\">\n  <title>\u304a\u554f\u3044\u5408\u308f\u305b\u30d5\u30a9\u30fc\u30e0<\/title>\n\n  <style>\n    body {\n      font-family: system-ui, sans-serif;\n      line-height: 1.6;\n    }\n\n    h1 {\n      margin-bottom: 24px;\n    }\n\n    #contact-form {\n      display: flex;\n      flex-direction: column;\n      gap: 24px; \n      max-width: 500px;\n    }\n\n    \/* \u5404\u30d5\u30a3\u30fc\u30eb\u30c9 *\/\n    #contact-form > div {\n      display: flex;\n      flex-direction: column;\n      gap: 8px; \/* \u30e9\u30d9\u30eb\u3068\u5165\u529b\u6b04\u306e\u9593\u9694 *\/\n    }\n\n    label {\n      font-weight: 600;\n    }\n\n    input,\n    textarea {\n      padding: 12px;\n      border: 1px solid #ccc;\n      border-radius: 6px;\n      font-size: 16px;\n    }\n\n    button {\n      padding: 14px;\n      border: none;\n      border-radius: 8px;\n      background: #0066cc;\n      color: white;\n      font-size: 16px;\n      cursor: pointer;\n      transition: background 0.2s ease;\n    }\n\n    button:hover {\n      background: #004999;\n    }\n  <\/style>\n<\/head>\n\n<body>\n  <h1>\u304a\u554f\u3044\u5408\u308f\u305b<\/h1>\n\n  <form id=\"contact-form\">\n    <div>\n      <label for=\"name\">\u304a\u540d\u524d<\/label>\n      <input type=\"text\" id=\"name\" name=\"name\" required>\n    <\/div>\n\n    <div>\n      <label for=\"email\">\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9<\/label>\n      <input type=\"email\" id=\"email\" name=\"email\" required>\n    <\/div>\n\n    <div>\n      <label for=\"message\">\u304a\u554f\u3044\u5408\u308f\u305b\u5185\u5bb9<\/label>\n      <textarea id=\"message\" name=\"message\" rows=\"5\" required><\/textarea>\n    <\/div>\n\n    <button type=\"submit\">\u9001\u4fe1<\/button>\n  <\/form>\n\n  <script>\n    const form = document.getElementById('contact-form');\n\n    form.addEventListener('submit', async (e) => {\n      e.preventDefault();\n\n      const formData = new FormData(form);\n      const data = Object.fromEntries(formData);\n\n      try {\n        const response = await fetch('\/.netlify\/functions\/form-handler', {\n          method: 'POST',\n          headers: { 'Content-Type': 'application\/json' },\n          body: JSON.stringify(data),\n        });\n\n        if (response.ok) {\n          alert('\u9001\u4fe1\u304c\u5b8c\u4e86\u3057\u307e\u3057\u305f\uff01');\n          form.reset();\n        } else {\n          alert('\u9001\u4fe1\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002\u3082\u3046\u4e00\u5ea6\u304a\u8a66\u3057\u304f\u3060\u3055\u3044\u3002');\n        }\n      } catch (error) {\n        console.error('Error:', error);\n        alert('\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002');\n      }\n    });\n  <\/script>\n<\/body>\n<\/html>\n\n\n\n<h3 class=\"wp-block-heading\">\u30b9\u30c6\u30c3\u30d73\uff1aNetlify Function\u306e\u4f5c\u6210<\/h3>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-js\" data-lang=\"JavaScript\"><code>\/\/ netlify\/functions\/form-handler.js\nconst nodemailer = require(&#39;nodemailer&#39;);\n\nexports.handler = async (event, context) =&gt; {\n  \/\/ CORS\u30d8\u30c3\u30c0\u30fc\u306e\u8a2d\u5b9a\n  const headers = {\n    &#39;Access-Control-Allow-Origin&#39;: &#39;*&#39;,\n    &#39;Access-Control-Allow-Headers&#39;: &#39;Content-Type&#39;,\n    &#39;Access-Control-Allow-Methods&#39;: &#39;POST, OPTIONS&#39;,\n  };\n\n  \/\/ \u30d7\u30ea\u30d5\u30e9\u30a4\u30c8\u30ea\u30af\u30a8\u30b9\u30c8\u3078\u306e\u5bfe\u5fdc\n  if (event.httpMethod === &#39;OPTIONS&#39;) {\n    return {\n      statusCode: 200,\n      headers,\n      body: &#39;&#39;,\n    };\n  }\n\n  \/\/ POST\u30e1\u30bd\u30c3\u30c9\u306e\u307f\u8a31\u53ef\n  if (event.httpMethod !== &#39;POST&#39;) {\n    return {\n      statusCode: 405,\n      headers,\n      body: JSON.stringify({ error: &#39;Method Not Allowed&#39; }),\n    };\n  }\n\n  try {\n    \/\/ \u30ea\u30af\u30a8\u30b9\u30c8\u30dc\u30c7\u30a3\u306e\u30d1\u30fc\u30b9\n    const { name, email, message } = JSON.parse(event.body);\n\n    \/\/ \u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\n    if (!name || !email || !message) {\n      return {\n        statusCode: 400,\n        headers,\n        body: JSON.stringify({ error: &#39;\u5fc5\u9808\u9805\u76ee\u304c\u5165\u529b\u3055\u308c\u3066\u3044\u307e\u305b\u3093&#39; }),\n      };\n    }\n\n    \/\/ \u30e1\u30fc\u30eb\u9001\u4fe1\u306e\u8a2d\u5b9a\n    const transporter = nodemailer.createTransport({\n      host: process.env.SMTP_HOST,\n      port: process.env.SMTP_PORT,\n      secure: true,\n      auth: {\n        user: process.env.SMTP_USER,\n        pass: process.env.SMTP_PASS,\n      },\n    });\n\n    \/\/ \u30e1\u30fc\u30eb\u5185\u5bb9\n    const mailOptions = {\n      from: process.env.SMTP_USER,\n      to: &#39;admin@example.com&#39;,\n      subject: `\u3010\u304a\u554f\u3044\u5408\u308f\u305b\u3011${name}\u69d8\u3088\u308a`,\n      text: `\n\u304a\u540d\u524d: ${name}\n\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9: ${email}\n\u304a\u554f\u3044\u5408\u308f\u305b\u5185\u5bb9:\n${message}\n      `,\n      html: `\n        &lt;h2&gt;\u304a\u554f\u3044\u5408\u308f\u305b\u304c\u3042\u308a\u307e\u3057\u305f&lt;\/h2&gt;\n        &lt;p&gt;&lt;strong&gt;\u304a\u540d\u524d:&lt;\/strong&gt; ${name}&lt;\/p&gt;\n        &lt;p&gt;&lt;strong&gt;\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9:&lt;\/strong&gt; ${email}&lt;\/p&gt;\n        &lt;p&gt;&lt;strong&gt;\u304a\u554f\u3044\u5408\u308f\u305b\u5185\u5bb9:&lt;\/strong&gt;&lt;\/p&gt;\n        &lt;p&gt;${message.replace(\/\\n\/g, &#39;&lt;br&gt;&#39;)}&lt;\/p&gt;\n      `,\n    };\n\n    \/\/ \u30e1\u30fc\u30eb\u9001\u4fe1\n    await transporter.sendMail(mailOptions);\n\n    return {\n      statusCode: 200,\n      headers,\n      body: JSON.stringify({ message: &#39;\u9001\u4fe1\u304c\u5b8c\u4e86\u3057\u307e\u3057\u305f&#39; }),\n    };\n  } catch (error) {\n    console.error(&#39;Error:&#39;, error);\n    return {\n      statusCode: 500,\n      headers,\n      body: JSON.stringify({ error: &#39;\u30b5\u30fc\u30d0\u30fc\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f&#39; }),\n    };\n  }\n};<\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">\u30b9\u30c6\u30c3\u30d74\uff1apackage.json\u306e\u8a2d\u5b9a<\/h3>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-json\" data-lang=\"JSON\"><code>{\n  &quot;name&quot;: &quot;jamstack-form&quot;,\n  &quot;version&quot;: &quot;1.0.0&quot;,\n  &quot;dependencies&quot;: {\n    &quot;nodemailer&quot;: &quot;^6.9.0&quot;\n  }\n}<\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">\u30b9\u30c6\u30c3\u30d75\uff1a\u74b0\u5883\u5909\u6570\u306e\u8a2d\u5b9a<\/h3>\n\n\n\n<p>Netlify\u306e\u7ba1\u7406\u753b\u9762\u3067\u3001\u4ee5\u4e0b\u306e\u74b0\u5883\u5909\u6570\u3092\u8a2d\u5b9a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SMTP_HOST=smtp.gmail.com\nSMTP_PORT=465\nSMTP_USER=your-email@gmail.com\nSMTP_PASS=your-app-password<\/code><\/pre>\n\n\n\n<p class=\"is-style-big_icon_point\"><strong>\u30dd\u30a4\u30f3\u30c8\uff1a<\/strong> Gmail\u3092\u4f7f\u3046\u5834\u5408\u306f\u3001\u30a2\u30d7\u30ea\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u751f\u6210\u3057\u3066\u4f7f\u7528\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u5b9f\u88c5\u65b9\u6cd52\uff1aVercel Serverless Functions\u3092\u4f7f\u3063\u305f\u30d5\u30a9\u30fc\u30e0\u51e6\u7406<\/h2>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"alignleft size-full\"><img decoding=\"async\" width=\"1536\" height=\"1024\" src=\"https:\/\/withcode.tech\/media\/wp-content\/uploads\/2026\/02\/1000006392.jpg\" alt=\"\" class=\"wp-image-12853\" srcset=\"https:\/\/withcode.tech\/media\/wp-content\/uploads\/2026\/02\/1000006392.jpg 1536w, https:\/\/withcode.tech\/media\/wp-content\/uploads\/2026\/02\/1000006392-768x512.jpg 768w\" sizes=\"(max-width: 1536px) 100vw, 1536px\" \/><\/figure>\n<\/div>\n\n<div class=\"swell-block-balloon\"><div class=\"c-balloon -bln-left\" data-col=\"gray\"><div class=\"c-balloon__icon -square\"><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/withcode.tech\/media\/wp-content\/uploads\/2025\/06\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2025-06-15-15.00.55.jpg\" alt=\"\" class=\"c-balloon__iconImg\" width=\"80px\" height=\"80px\"><span class=\"c-balloon__iconName\">\u751f\u5f92<\/span><\/div><div class=\"c-balloon__body -speaking -border-none\"><div class=\"c-balloon__text\">\n<p><strong>Vercel\u306f\u3069\u3093\u306a\u6a5f\u80fd\u304c\u3042\u308b\u3093\u3067\u3057\u3087\u3046\u304b\uff1f<\/strong><\/p>\n<span class=\"c-balloon__shapes\"><span class=\"c-balloon__before\"><\/span><span class=\"c-balloon__after\"><\/span><\/span><\/div><\/div><\/div><\/div>\n\n<div class=\"swell-block-balloon\"><div class=\"c-balloon -bln-right\" data-col=\"gray\"><div class=\"c-balloon__icon -square\"><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/withcode.tech\/media\/wp-content\/uploads\/2025\/06\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2025-06-15-15.12.07.jpg\" alt=\"\" class=\"c-balloon__iconImg\" width=\"80px\" height=\"80px\"><span class=\"c-balloon__iconName\">\u30da\u30f3\u535a\u58eb<\/span><\/div><div class=\"c-balloon__body -speaking -border-none\"><div class=\"c-balloon__text\">\n<p><strong>Vercel\u306f\u3001Next.js\u3068\u306e\u7d71\u5408\u304c\u5f37\u529b\u3067\u3001<strong>TypeScript\u306e\u30b5\u30dd\u30fc\u30c8<\/strong>\u3082\u5145\u5b9f\u3057\u3066\u3044\u308b\u305e\u3044\uff01<\/strong><\/p>\n<span class=\"c-balloon__shapes\"><span class=\"c-balloon__before\"><\/span><span class=\"c-balloon__after\"><\/span><\/span><\/div><\/div><\/div><\/div>\n\n\n<h3 class=\"wp-block-heading\">\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u69cb\u9020<\/h3>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>my-jamstack-site\/\n\u251c\u2500\u2500 public\/\n\u2502   \u2514\u2500\u2500 index.html\n\u251c\u2500\u2500 api\/\n\u2502   \u2514\u2500\u2500 form-handler.ts\n\u2514\u2500\u2500 package.json<\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Serverless Function\u306e\u4f5c\u6210\uff08TypeScript\uff09<\/h3>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-ts\" data-lang=\"TypeScript\"><code>\/\/ api\/form-handler.ts\nimport type { VercelRequest, VercelResponse } from &#39;@vercel\/node&#39;;\nimport nodemailer from &#39;nodemailer&#39;;\n\nexport default async function handler(\n  req: VercelRequest,\n  res: VercelResponse\n) {\n  \/\/ CORS\u30d8\u30c3\u30c0\u30fc\u306e\u8a2d\u5b9a\n  res.setHeader(&#39;Access-Control-Allow-Origin&#39;, &#39;*&#39;);\n  res.setHeader(&#39;Access-Control-Allow-Methods&#39;, &#39;POST, OPTIONS&#39;);\n  res.setHeader(&#39;Access-Control-Allow-Headers&#39;, &#39;Content-Type&#39;);\n\n  \/\/ \u30d7\u30ea\u30d5\u30e9\u30a4\u30c8\u30ea\u30af\u30a8\u30b9\u30c8\n  if (req.method === &#39;OPTIONS&#39;) {\n    return res.status(200).end();\n  }\n\n  \/\/ POST\u30e1\u30bd\u30c3\u30c9\u306e\u307f\u8a31\u53ef\n  if (req.method !== &#39;POST&#39;) {\n    return res.status(405).json({ error: &#39;Method Not Allowed&#39; });\n  }\n\n  try {\n    const { name, email, message } = req.body;\n\n    \/\/ \u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\n    if (!name || !email || !message) {\n      return res.status(400).json({ error: &#39;\u5fc5\u9808\u9805\u76ee\u304c\u5165\u529b\u3055\u308c\u3066\u3044\u307e\u305b\u3093&#39; });\n    }\n\n    \/\/ \u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u306e\u5f62\u5f0f\u30c1\u30a7\u30c3\u30af\n    const emailRegex = \/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$\/;\n    if (!emailRegex.test(email)) {\n      return res.status(400).json({ error: &#39;\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u306e\u5f62\u5f0f\u304c\u6b63\u3057\u304f\u3042\u308a\u307e\u305b\u3093&#39; });\n    }\n\n    \/\/ \u30e1\u30fc\u30eb\u9001\u4fe1\u8a2d\u5b9a\n    const transporter = nodemailer.createTransport({\n      host: process.env.SMTP_HOST,\n      port: Number(process.env.SMTP_PORT),\n      secure: true,\n      auth: {\n        user: process.env.SMTP_USER,\n        pass: process.env.SMTP_PASS,\n      },\n    });\n\n    \/\/ \u30e1\u30fc\u30eb\u9001\u4fe1\n    await transporter.sendMail({\n      from: process.env.SMTP_USER,\n      to: &#39;admin@example.com&#39;,\n      subject: `\u3010\u304a\u554f\u3044\u5408\u308f\u305b\u3011${name}\u69d8\u3088\u308a`,\n      text: `\n\u304a\u540d\u524d: ${name}\n\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9: ${email}\n\u304a\u554f\u3044\u5408\u308f\u305b\u5185\u5bb9:\n${message}\n      `,\n    });\n\n    return res.status(200).json({ message: &#39;\u9001\u4fe1\u304c\u5b8c\u4e86\u3057\u307e\u3057\u305f&#39; });\n  } catch (error) {\n    console.error(&#39;Error:&#39;, error);\n    return res.status(500).json({ error: &#39;\u30b5\u30fc\u30d0\u30fc\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f&#39; });\n  }\n}\n<\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">\u30d5\u30a9\u30fc\u30e0\u304b\u3089\u306e\u9001\u4fe1<\/h3>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-js\" data-lang=\"JavaScript\"><code>\/\/ \u30d5\u30ed\u30f3\u30c8\u30a8\u30f3\u30c9\u304b\u3089\u306e\u9001\u4fe1\nconst response = await fetch(&#39;\/api\/form-handler&#39;, {\n  method: &#39;POST&#39;,\n  headers: {\n    &#39;Content-Type&#39;: &#39;application\/json&#39;,\n  },\n  body: JSON.stringify(data),\n});<\/code><\/pre><\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u5b9f\u88c5\u65b9\u6cd53\uff1a\u30d5\u30a9\u30fc\u30e0\u9001\u4fe1\u30b5\u30fc\u30d3\u30b9\u3092\u5229\u7528\uff08\u30b3\u30fc\u30c9\u4e0d\u8981\uff09<\/h2>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"alignleft size-full\"><img decoding=\"async\" width=\"1536\" height=\"1024\" src=\"https:\/\/withcode.tech\/media\/wp-content\/uploads\/2026\/02\/1000006426-1.jpg\" alt=\"\" class=\"wp-image-12854\" srcset=\"https:\/\/withcode.tech\/media\/wp-content\/uploads\/2026\/02\/1000006426-1.jpg 1536w, https:\/\/withcode.tech\/media\/wp-content\/uploads\/2026\/02\/1000006426-1-768x512.jpg 768w\" sizes=\"(max-width: 1536px) 100vw, 1536px\" \/><\/figure>\n<\/div>\n\n<div class=\"swell-block-balloon\"><div class=\"c-balloon -bln-left\" data-col=\"gray\"><div class=\"c-balloon__icon -square\"><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/withcode.tech\/media\/wp-content\/uploads\/2025\/06\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2025-06-15-15.00.55.jpg\" alt=\"\" class=\"c-balloon__iconImg\" width=\"80px\" height=\"80px\"><span class=\"c-balloon__iconName\">\u751f\u5f92<\/span><\/div><div class=\"c-balloon__body -speaking -border-none\"><div class=\"c-balloon__text\">\n<p><strong>\u30b3\u30fc\u30c9\u3092\u66f8\u304b\u305a\u306b\u30d5\u30a9\u30fc\u30e0\u3092\u5b9f\u88c5\u3059\u308b\u65b9\u6cd5\u306f\u3042\u308a\u307e\u305b\u3093\u304b\uff1f<\/strong><\/p>\n<span class=\"c-balloon__shapes\"><span class=\"c-balloon__before\"><\/span><span class=\"c-balloon__after\"><\/span><\/span><\/div><\/div><\/div><\/div>\n\n<div class=\"swell-block-balloon\"><div class=\"c-balloon -bln-right\" data-col=\"gray\"><div class=\"c-balloon__icon -square\"><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/withcode.tech\/media\/wp-content\/uploads\/2025\/06\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2025-06-15-15.11.23.jpg\" alt=\"\" class=\"c-balloon__iconImg\" width=\"80px\" height=\"80px\"><span class=\"c-balloon__iconName\">\u30da\u30f3\u535a\u58eb<\/span><\/div><div class=\"c-balloon__body -speaking -border-none\"><div class=\"c-balloon__text\">\n<p><strong>\u3082\u3061\u308d\u3093\u3042\u308b\u305e\u3044\uff01Netlify Forms\u3084Formspree\u306a\u3069\u306e\u30b5\u30fc\u30d3\u30b9\u3092\u4f7f\u3048\u3070\u3001\u30b3\u30fc\u30c9\u4e0d\u8981\u3067\u30d5\u30a9\u30fc\u30e0\u304c\u5b9f\u88c5\u3067\u304d\u308b\u3093\u3058\u3083\uff01<\/strong><\/p>\n<span class=\"c-balloon__shapes\"><span class=\"c-balloon__before\"><\/span><span class=\"c-balloon__after\"><\/span><\/span><\/div><\/div><\/div><\/div>\n\n\n<h3 class=\"wp-block-heading\">Netlify Forms\u306e\u5b9f\u88c5<\/h3>\n\n\n\n<p>Netlify\u304c\u63d0\u4f9b\u3059\u308b<strong><span class=\"swl-marker mark_yellow\">\u6a19\u6e96\u306e\u30d5\u30a9\u30fc\u30e0\u6a5f\u80fd<\/span><\/strong>\u3067\u3059\u3002HTML\u306b<code>netlify<\/code>\u5c5e\u6027\u3092\u8ffd\u52a0\u3059\u308b\u3060\u3051\u3067\u4f7f\u3048\u307e\u3059\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-html\" data-lang=\"HTML\"><code>&lt;form name=&quot;contact&quot; method=&quot;POST&quot; data-netlify=&quot;true&quot;&gt;\n  &lt;input type=&quot;hidden&quot; name=&quot;form-name&quot; value=&quot;contact&quot; \/&gt;\n\n  &lt;div&gt;\n    &lt;label for=&quot;name&quot;&gt;\u304a\u540d\u524d&lt;\/label&gt;\n    &lt;input type=&quot;text&quot; id=&quot;name&quot; name=&quot;name&quot; required&gt;\n  &lt;\/div&gt;\n\n  &lt;div&gt;\n    &lt;label for=&quot;email&quot;&gt;\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9&lt;\/label&gt;\n    &lt;input type=&quot;email&quot; id=&quot;email&quot; name=&quot;email&quot; required&gt;\n  &lt;\/div&gt;\n\n  &lt;div&gt;\n    &lt;label for=&quot;message&quot;&gt;\u304a\u554f\u3044\u5408\u308f\u305b\u5185\u5bb9&lt;\/label&gt;\n    &lt;textarea id=&quot;message&quot; name=&quot;message&quot; required&gt;&lt;\/textarea&gt;\n  &lt;\/div&gt;\n\n  &lt;button type=&quot;submit&quot;&gt;\u9001\u4fe1&lt;\/button&gt;\n&lt;\/form&gt;<\/code><\/pre><\/div>\n\n\n\n<h4 class=\"wp-block-heading\">\u30e1\u30ea\u30c3\u30c8<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u5b9f\u88c5\u304c\u7c21\u5358<\/strong>\uff1aHTML\u306b\u5c5e\u6027\u3092\u8ffd\u52a0\u3059\u308b\u3060\u3051<\/li>\n\n\n\n<li><strong>\u7ba1\u7406\u753b\u9762\u3067\u78ba\u8a8d<\/strong>\uff1a\u9001\u4fe1\u3055\u308c\u305f\u30c7\u30fc\u30bf\u3092Netlify\u306e\u7ba1\u7406\u753b\u9762\u3067\u78ba\u8a8d\u3067\u304d\u308b<\/li>\n\n\n\n<li><strong>\u30b9\u30d1\u30e0\u5bfe\u7b56<\/strong>\uff1areCAPTCHA\u3068\u306e\u7d71\u5408\u304c\u53ef\u80fd<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">\u30c7\u30e1\u30ea\u30c3\u30c8<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u7121\u6599\u67a0\u306e\u5236\u9650<\/strong>\uff1a\u6708100\u4ef6\u307e\u3067\uff08\u6709\u6599\u30d7\u30e9\u30f3\u3067\u62e1\u5f35\u53ef\u80fd\uff09<\/li>\n\n\n\n<li><strong>\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u6027\u304c\u4f4e\u3044<\/strong>\uff1a\u72ec\u81ea\u306e\u51e6\u7406\u3092\u8ffd\u52a0\u3057\u306b\u304f\u3044<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Formspree\u306e\u5b9f\u88c5<\/h3>\n\n\n\n<p>Formspree\u306f\u3001<strong><span class=\"swl-marker mark_yellow\">\u5916\u90e8\u306e\u30d5\u30a9\u30fc\u30e0\u9001\u4fe1\u30b5\u30fc\u30d3\u30b9<\/span><\/strong>\u3067\u3059\u3002\u4efb\u610f\u306e\u30b5\u30a4\u30c8\u3067\u4f7f\u7528\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-html\" data-lang=\"HTML\"><code>&lt;form action=&quot;https:\/\/formspree.io\/f\/YOUR_FORM_ID&quot; method=&quot;POST&quot;&gt;\n  &lt;label for=&quot;name&quot;&gt;\u304a\u540d\u524d&lt;\/label&gt;\n  &lt;input type=&quot;text&quot; name=&quot;name&quot; required&gt;\n\n  &lt;label for=&quot;email&quot;&gt;\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9&lt;\/label&gt;\n  &lt;input type=&quot;email&quot; name=&quot;_replyto&quot; required&gt;\n\n  &lt;label for=&quot;message&quot;&gt;\u304a\u554f\u3044\u5408\u308f\u305b\u5185\u5bb9&lt;\/label&gt;\n  &lt;textarea name=&quot;message&quot; required&gt;&lt;\/textarea&gt;\n\n  &lt;button type=&quot;submit&quot;&gt;\u9001\u4fe1&lt;\/button&gt;\n&lt;\/form&gt;\n<\/code><\/pre><\/div>\n\n\n\n<h4 class=\"wp-block-heading\">\u30e1\u30ea\u30c3\u30c8<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u3069\u306e\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u3067\u3082\u4f7f\u3048\u308b<\/strong>\uff1aNetlify\u4ee5\u5916\u3067\u3082\u5229\u7528\u53ef\u80fd<\/li>\n\n\n\n<li><strong>\u30b9\u30d1\u30e0\u5bfe\u7b56<\/strong>\uff1a\u81ea\u52d5\u7684\u306b\u30b9\u30d1\u30e0\u30d5\u30a3\u30eb\u30bf\u30ea\u30f3\u30b0<\/li>\n\n\n\n<li><strong>\u30e1\u30fc\u30eb\u901a\u77e5<\/strong>\uff1a\u30d5\u30a9\u30fc\u30e0\u9001\u4fe1\u6642\u306b\u30e1\u30fc\u30eb\u3067\u901a\u77e5<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">\u30c7\u30e1\u30ea\u30c3\u30c8<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u7121\u6599\u67a0\u306e\u5236\u9650<\/strong>\uff1a\u670850\u4ef6\u307e\u3067<\/li>\n\n\n\n<li><strong>\u5916\u90e8\u4f9d\u5b58<\/strong>\uff1aFormspree\u306e\u30b5\u30fc\u30d3\u30b9\u306b\u4f9d\u5b58\u3059\u308b<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5bfe\u7b56<\/h2>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"alignleft size-full\"><img decoding=\"async\" width=\"1536\" height=\"1024\" src=\"https:\/\/withcode.tech\/media\/wp-content\/uploads\/2026\/02\/1000006393.jpg\" alt=\"\" class=\"wp-image-12855\" srcset=\"https:\/\/withcode.tech\/media\/wp-content\/uploads\/2026\/02\/1000006393.jpg 1536w, https:\/\/withcode.tech\/media\/wp-content\/uploads\/2026\/02\/1000006393-768x512.jpg 768w\" sizes=\"(max-width: 1536px) 100vw, 1536px\" \/><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\">1. \u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u306e\u5b9f\u88c5<\/h3>\n\n\n\n<p>\u30d5\u30ed\u30f3\u30c8\u30a8\u30f3\u30c9\u3068\u30d0\u30c3\u30af\u30a8\u30f3\u30c9\u306e<strong><span class=\"swl-marker mark_yellow\">\u4e21\u65b9\u3067\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3<\/span><\/strong>\u3092\u5b9f\u88c5\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-js\" data-lang=\"JavaScript\"><code>\/\/ \u30b5\u30fc\u30d0\u30fc\u5074\u306e\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u4f8b\nfunction validateEmail(email) {\n  const re = \/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$\/;\n  return re.test(email);\n}\n\nfunction validateInput(data) {\n  if (!data.name || data.name.length &gt; 100) {\n    throw new Error(&#39;\u304a\u540d\u524d\u306f100\u6587\u5b57\u4ee5\u5185\u3067\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044&#39;);\n  }\n\n  if (!validateEmail(data.email)) {\n    throw new Error(&#39;\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u306e\u5f62\u5f0f\u304c\u6b63\u3057\u304f\u3042\u308a\u307e\u305b\u3093&#39;);\n  }\n\n  if (!data.message || data.message.length &gt; 1000) {\n    throw new Error(&#39;\u304a\u554f\u3044\u5408\u308f\u305b\u5185\u5bb9\u306f1000\u6587\u5b57\u4ee5\u5185\u3067\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044&#39;);\n  }\n}<\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">2. \u30ec\u30fc\u30c8\u5236\u9650\uff08Rate Limiting\uff09<\/h3>\n\n\n\n<p>\u540c\u4e00IP\u30a2\u30c9\u30ec\u30b9\u304b\u3089\u306e<strong><span class=\"swl-marker mark_yellow\">\u9023\u7d9a\u9001\u4fe1\u3092\u5236\u9650<\/span><\/strong>\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-js\" data-lang=\"JavaScript\"><code>\/\/ \u7c21\u6613\u7684\u306a\u30ec\u30fc\u30c8\u5236\u9650\u306e\u5b9f\u88c5\u4f8b\nconst rateLimit = new Map();\nfunction checkRateLimit(ip) {\n  const now = Date.now();\n  const windowMs = 60 * 1000; \/\/ 1\u5206\n  const maxRequests = 5; \/\/ 1\u5206\u9593\u306b5\u56de\u307e\u3067\n  if (!rateLimit.has(ip)) {\n    rateLimit.set(ip, []);\n  }\n  const requests = rateLimit.get(ip).filter(time =&gt; now - time &lt; windowMs);\n  if (requests.length &gt;= maxRequests) {\n    throw new Error(&#39;\u9001\u4fe1\u56de\u6570\u304c\u591a\u3059\u304e\u307e\u3059\u3002\u3057\u3070\u3089\u304f\u3057\u3066\u304b\u3089\u518d\u5ea6\u304a\u8a66\u3057\u304f\u3060\u3055\u3044\u3002&#39;);\n  }\n  requests.push(now);\n  rateLimit.set(ip, requests);\n}<\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">3. reCAPTCHA\u306e\u5c0e\u5165<\/h3>\n\n\n\n<p>Google\u306e<span class=\"swl-marker mark_yellow\"><strong>reCAPTCHA v3<\/strong>\u3092<\/span>\u5c0e\u5165\u3057\u3001\u30dc\u30c3\u30c8\u5bfe\u7b56\u3092\u5f37\u5316\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-js\" data-lang=\"JavaScript\"><code>&lt;!-- \u30d5\u30ed\u30f3\u30c8\u30a8\u30f3\u30c9 --&gt;\n&lt;script src=&quot;https:\/\/www.google.com\/recaptcha\/api.js?render=YOUR_SITE_KEY&quot;&gt;&lt;\/script&gt;\n\n&lt;script&gt;\nasync function handleSubmit(e) {\n  e.preventDefault();\n\n  \/\/ reCAPTCHA\u30c8\u30fc\u30af\u30f3\u53d6\u5f97\n  const token = await grecaptcha.execute(&#39;YOUR_SITE_KEY&#39;, { action: &#39;submit&#39; });\n\n  const formData = new FormData(form);\n  const data = Object.fromEntries(formData);\n  data.recaptchaToken = token;\n\n  \/\/ \u30b5\u30fc\u30d0\u30fc\u306b\u9001\u4fe1\n  await fetch(&#39;\/api\/form-handler&#39;, {\n    method: &#39;POST&#39;,\n    body: JSON.stringify(data),\n  });\n}\n&lt;\/script&gt;<\/code><\/pre><\/div>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-js\" data-lang=\"JavaScript\"><code>\/\/ \u30b5\u30fc\u30d0\u30fc\u5074\u3067reCAPTCHA\u30c8\u30fc\u30af\u30f3\u3092\u691c\u8a3c\nasync function verifyRecaptcha(token) {\n  const response = await fetch(&#39;https:\/\/www.google.com\/recaptcha\/api\/siteverify&#39;, {\n    method: &#39;POST&#39;,\n    headers: {\n      &#39;Content-Type&#39;: &#39;application\/x-www-form-urlencoded&#39;,\n    },\n    body: `secret=${process.env.RECAPTCHA_SECRET_KEY}&response=${token}`,\n  });\n  const data = await response.json();\n  if (!data.success || data.score &lt; 0.5) {\n    throw new Error(&#39;reCAPTCHA\u691c\u8a3c\u306b\u5931\u6557\u3057\u307e\u3057\u305f&#39;);\n  }\n}<\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">4. \u74b0\u5883\u5909\u6570\u306e\u9069\u5207\u306a\u7ba1\u7406<\/h3>\n\n\n\n<p>API\u30ad\u30fc\u3084\u30d1\u30b9\u30ef\u30fc\u30c9\u306f<strong><span class=\"swl-marker mark_yellow\">\u74b0\u5883\u5909\u6570<\/span><\/strong>\u3067\u7ba1\u7406\u3057\u3001\u30b3\u30fc\u30c9\u306b\u76f4\u63a5\u66f8\u304b\u306a\u3044\u3088\u3046\u306b\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0<\/h2>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"alignleft size-full\"><img decoding=\"async\" width=\"1536\" height=\"1024\" src=\"https:\/\/withcode.tech\/media\/wp-content\/uploads\/2026\/02\/1000006394.jpg\" alt=\"\" class=\"wp-image-12856\" srcset=\"https:\/\/withcode.tech\/media\/wp-content\/uploads\/2026\/02\/1000006394.jpg 1536w, https:\/\/withcode.tech\/media\/wp-content\/uploads\/2026\/02\/1000006394-768x512.jpg 768w\" sizes=\"(max-width: 1536px) 100vw, 1536px\" \/><\/figure>\n<\/div>\n\n<div class=\"swell-block-balloon\"><div class=\"c-balloon -bln-left\" data-col=\"gray\"><div class=\"c-balloon__icon -square\"><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/withcode.tech\/media\/wp-content\/uploads\/2025\/06\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2025-06-15-15.00.55.jpg\" alt=\"\" class=\"c-balloon__iconImg\" width=\"80px\" height=\"80px\"><span class=\"c-balloon__iconName\">\u751f\u5f92<\/span><\/div><div class=\"c-balloon__body -speaking -border-none\"><div class=\"c-balloon__text\">\n<p><strong>Jamstack\u30d5\u30a9\u30fc\u30e0\u51e6\u7406\u3092\u5bfe\u5fdc\u3059\u308b\u306b\u3042\u305f\u3063\u3066\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u306e\u3053\u3068\u3082\u77e5\u308a\u305f\u3044\u3067\u3059\uff01<\/strong><\/p>\n<span class=\"c-balloon__shapes\"><span class=\"c-balloon__before\"><\/span><span class=\"c-balloon__after\"><\/span><\/span><\/div><\/div><\/div><\/div>\n\n<div class=\"swell-block-balloon\"><div class=\"c-balloon -bln-right\" data-col=\"gray\"><div class=\"c-balloon__icon -square\"><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/withcode.tech\/media\/wp-content\/uploads\/2025\/06\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2025-06-15-15.09.27.jpg\" alt=\"\" class=\"c-balloon__iconImg\" width=\"80px\" height=\"80px\"><span class=\"c-balloon__iconName\">\u30da\u30f3\u535a\u58eb<\/span><\/div><div class=\"c-balloon__body -speaking -border-none\"><div class=\"c-balloon__text\">\n<p><strong><strong><strong>\u3046\u3080\u3002\u3053\u3053\u3067\u306f\u3001\u4e3b\u306a\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u30923\u3064\u7d39\u4ecb\u3059\u308b\u305e\u3044\uff01<\/strong><\/strong><\/strong><\/p>\n<span class=\"c-balloon__shapes\"><span class=\"c-balloon__before\"><\/span><span class=\"c-balloon__after\"><\/span><\/span><\/div><\/div><\/div><\/div>\n\n\n<h3 class=\"wp-block-heading\">\u554f\u984c1: \u30e1\u30fc\u30eb\u304c\u9001\u4fe1\u3055\u308c\u306a\u3044<\/h3>\n\n\n\n<p><strong>\u539f\u56e0\u3068\u89e3\u6c7a\u6cd5<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>SMTP\u8a2d\u5b9a\u304c\u9593\u9055\u3063\u3066\u3044\u308b<\/strong> \u2192 \u74b0\u5883\u5909\u6570\u3092\u78ba\u8a8d<\/li>\n\n\n\n<li><strong>Gmail\u306e\u30a2\u30d7\u30ea\u30d1\u30b9\u30ef\u30fc\u30c9\u304c\u7121\u52b9<\/strong> \u2192 Google\u30a2\u30ab\u30a6\u30f3\u30c8\u30672\u6bb5\u968e\u8a8d\u8a3c\u3092\u6709\u52b9\u5316\u3057\u3066\u30a2\u30d7\u30ea\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u751f\u6210<\/li>\n\n\n\n<li><strong>\u30dd\u30fc\u30c8\u756a\u53f7\u304c\u9593\u9055\u3063\u3066\u3044\u308b<\/strong> \u2192 465\uff08SSL\uff09\u307e\u305f\u306f587\uff08TLS\uff09\u3092\u4f7f\u7528<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\u554f\u984c2: CORS\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3059\u308b<\/h3>\n\n\n\n<p><strong>\u539f\u56e0\u3068\u89e3\u6c7a\u6cd5<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>CORS\u30d8\u30c3\u30c0\u30fc\u304c\u8a2d\u5b9a\u3055\u308c\u3066\u3044\u306a\u3044<\/strong> \u2192 \u30ec\u30b9\u30dd\u30f3\u30b9\u306b<code>Access-Control-Allow-Origin<\/code>\u30d8\u30c3\u30c0\u30fc\u3092\u8ffd\u52a0<\/li>\n\n\n\n<li><strong>OPTIONS\u30e1\u30bd\u30c3\u30c9\u306b\u5bfe\u5fdc\u3057\u3066\u3044\u306a\u3044<\/strong> \u2192 \u30d7\u30ea\u30d5\u30e9\u30a4\u30c8\u30ea\u30af\u30a8\u30b9\u30c8\u3092\u51e6\u7406\u3059\u308b\u30b3\u30fc\u30c9\u3092\u8ffd\u52a0<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\u554f\u984c3: \u95a2\u6570\u304c\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u3059\u308b<\/h3>\n\n\n\n<p><strong>\u539f\u56e0\u3068\u89e3\u6c7a\u6cd5<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u30e1\u30fc\u30eb\u9001\u4fe1\u306b\u6642\u9593\u304c\u304b\u304b\u3063\u3066\u3044\u308b<\/strong> \u2192 \u975e\u540c\u671f\u51e6\u7406\u3092\u78ba\u8a8d<\/li>\n\n\n\n<li><strong>\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u8a2d\u5b9a\u304c\u77ed\u3044<\/strong> \u2192 Netlify\/Vercel\u306e\u8a2d\u5b9a\u3067\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u6642\u9593\u3092\u5ef6\u9577<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n<div class=\"swell-block-balloon\"><div class=\"c-balloon -bln-left\" data-col=\"gray\"><div class=\"c-balloon__icon -square\"><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/withcode.tech\/media\/wp-content\/uploads\/2025\/06\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2025-06-15-14.48.08.jpg\" alt=\"\" class=\"c-balloon__iconImg\" width=\"80px\" height=\"80px\"><span class=\"c-balloon__iconName\">\u751f\u5f92<\/span><\/div><div class=\"c-balloon__body -speaking -border-none\"><div class=\"c-balloon__text\">\n<p><strong>Jamstack\u30b5\u30a4\u30c8\u3067\u3082\u3001\u30b5\u30fc\u30d0\u30fc\u30ec\u30b9\u95a2\u6570\u3092\u4f7f\u3048\u3070\u7c21\u5358\u306b\u30d5\u30a9\u30fc\u30e0\u304c\u5b9f\u88c5\u3067\u304d\u308b\u3093\u3067\u3059\u306d\uff01<\/strong><\/p>\n<span class=\"c-balloon__shapes\"><span class=\"c-balloon__before\"><\/span><span class=\"c-balloon__after\"><\/span><\/span><\/div><\/div><\/div><\/div>\n\n<div class=\"swell-block-balloon\"><div class=\"c-balloon -bln-right\" data-col=\"gray\"><div class=\"c-balloon__icon -square\"><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/withcode.tech\/media\/wp-content\/uploads\/2025\/06\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2025-06-15-15.12.07.jpg\" alt=\"\" class=\"c-balloon__iconImg\" width=\"80px\" height=\"80px\"><span class=\"c-balloon__iconName\">\u30da\u30f3\u535a\u58eb<\/span><\/div><div class=\"c-balloon__body -speaking -border-none\"><div class=\"c-balloon__text\">\n<p><strong>\u305d\u306e\u901a\u308a\u3058\u3083\uff01\u307e\u305a\u306fNetlify Forms\u3084Formspree\u306a\u3069\u306e\u30b5\u30fc\u30d3\u30b9\u304b\u3089\u59cb\u3081\u3066\u3001\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u304c\u5fc5\u8981\u306b\u306a\u3063\u305f\u3089\u30b5\u30fc\u30d0\u30fc\u30ec\u30b9\u95a2\u6570\u3092\u5b9f\u88c5\u3059\u308b\u306e\u304c\u304a\u3059\u3059\u3081\u3058\u3083\u305e\uff01<\/strong><\/p>\n<span class=\"c-balloon__shapes\"><span class=\"c-balloon__before\"><\/span><span class=\"c-balloon__after\"><\/span><\/span><\/div><\/div><\/div><\/div>\n\n<div class=\"swell-block-balloon\"><div class=\"c-balloon -bln-left\" data-col=\"gray\"><div class=\"c-balloon__icon -square\"><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/withcode.tech\/media\/wp-content\/uploads\/2025\/06\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2025-06-15-15.06.05.jpg\" alt=\"\" class=\"c-balloon__iconImg\" width=\"80px\" height=\"80px\"><span class=\"c-balloon__iconName\">\u751f\u5f92<\/span><\/div><div class=\"c-balloon__body -speaking -border-none\"><div class=\"c-balloon__text\">\n<p><strong>\u306f\u3044\uff01\u6b21\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3067Netlify Functions\u3092\u4f7f\u3063\u305f\u30d5\u30a9\u30fc\u30e0\u51e6\u7406\u306b\u6311\u6226\u3057\u3066\u307f\u307e\u3059\uff01\u3042\u308a\u304c\u3068\u3046\u3054\u3056\u3044\u307e\u3057\u305f\uff01<\/strong><\/p>\n<span class=\"c-balloon__shapes\"><span class=\"c-balloon__before\"><\/span><span class=\"c-balloon__after\"><\/span><\/span><\/div><\/div><\/div><\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u307e\u3068\u3081<\/h2>\n\n\n\n<p>\u672c\u8a18\u4e8b\u3067\u306f\u3001Jamstack\u30b5\u30a4\u30c8\u306e\u30d5\u30a9\u30fc\u30e0\u51e6\u7406\u3092\u30b5\u30fc\u30d0\u30fc\u30ec\u30b9\u3067\u5b9f\u88c5\u3059\u308b\u65b9\u6cd5\u306b\u3064\u3044\u3066\u3001\u8907\u6570\u306e\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u3092\u4f7f\u3063\u305f\u5b9f\u88c5\u4f8b\u3068\u3068\u3082\u306b\u8a73\u3057\u304f\u89e3\u8aac\u3057\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<p>\u91cd\u8981\u306a\u30dd\u30a4\u30f3\u30c8\u306f\u4ee5\u4e0b\u306e\u901a\u308a\u3067\u3059\u3002<\/p>\n\n\n\n<p class=\"is-style-big_icon_point\"><strong>\u30fbJamstack\u306e\u8ab2\u984c<\/strong>\uff1a\u9759\u7684\u30b5\u30a4\u30c8\u3067\u306f\u30d0\u30c3\u30af\u30a8\u30f3\u30c9\u51e6\u7406\u304c\u3067\u304d\u306a\u3044\u305f\u3081\u3001\u30b5\u30fc\u30d0\u30fc\u30ec\u30b9\u95a2\u6570\u304c\u5fc5\u8981<br><strong>\u30fb\u5b9f\u88c5\u65b9\u6cd5<\/strong>\uff1aNetlify Functions\u3001Vercel Serverless Functions\u3001\u30d5\u30a9\u30fc\u30e0\u9001\u4fe1\u30b5\u30fc\u30d3\u30b9\u306e3\u3064<br><strong>\u30fb\u63a8\u5968\u65b9\u6cd5<\/strong>\uff1a\u521d\u5fc3\u8005\u306fNetlify Forms\u3084Formspree\u3001\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u304c\u5fc5\u8981\u306a\u3089\u30b5\u30fc\u30d0\u30fc\u30ec\u30b9\u95a2\u6570<br><strong>\u30fb\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5bfe\u7b56<\/strong>\uff1a\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u3001\u30ec\u30fc\u30c8\u5236\u9650\u3001reCAPTCHA\u3001\u74b0\u5883\u5909\u6570\u7ba1\u7406\u304c\u91cd\u8981<br><strong>\u30fb\u9078\u5b9a\u57fa\u6e96<\/strong>\uff1a\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u898f\u6a21\u3001\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u6027\u3001\u4e88\u7b97\u306b\u5fdc\u3058\u3066\u6700\u9069\u306a\u65b9\u6cd5\u3092\u9078\u629e<\/p>\n\n\n\n<p><strong><span class=\"swl-marker mark_yellow\">WithCode\u3067\u5b66\u3093\u3060HTML\u30fbCSS\u30fbJavaScript\u306e\u57fa\u790e\u77e5\u8b58\u306b\u3001\u30b5\u30fc\u30d0\u30fc\u30ec\u30b9\u95a2\u6570\u306e\u6280\u8853\u3092\u7d44\u307f\u5408\u308f\u305b\u308c\u3070\u3001\u3069\u3093\u306a\u5b9f\u6848\u4ef6\u3067\u3082\u5bfe\u5fdc\u3067\u304d\u307e\u3059\u3002<\/span><\/strong><\/p>\n\n\n\n<p>Jamstack\u30b5\u30a4\u30c8\u306e\u30d5\u30a9\u30fc\u30e0\u51e6\u7406\u306f\u3001\u30b5\u30fc\u30d0\u30fc\u30ec\u30b9\u95a2\u6570\u3092\u4f7f\u3048\u3070\u30b7\u30f3\u30d7\u30eb\u306b\u5b9f\u88c5\u3067\u304d\u307e\u3059\u3002\u305c\u3072\u5b9f\u969b\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3067\u6d3b\u7528\u3057\u3001\u9ad8\u901f\u3067\u5b89\u5168\u306aWeb\u30b5\u30a4\u30c8\u3092\u69cb\u7bc9\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"index_id17\">WithCode\u3092\u4f53\u9a13\u3067\u304d\u308b\u521d\u7d1a\u30b3\u30fc\u30b9\u516c\u958b\u4e2d\uff01<\/h2>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"alignleft size-full\"><img decoding=\"async\" width=\"600\" height=\"500\" src=\"https:\/\/withcode.tech\/media\/wp-content\/uploads\/2024\/04\/\u30d0\u30ca\u30fc_300\u00d7250_20240425.png\" alt=\"\" class=\"wp-image-2650\"\/><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\">\u521d\u7d1a\u30b3\u30fc\u30b9(\u00a549,800)\u304c\u5b8c\u5168\u7121\u6599\u306b\uff01<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u671f\u9593\uff1a1\u9031\u9593<\/strong><\/li>\n\n\n\n<li><strong>\u5b66\u7fd2\u5185\u5bb9\uff1a<\/strong><br><strong>\u30ed\u30fc\u30c9\u30de\u30c3\u30d7\/\u57fa\u790e\u77e5\u8b58\/\u74b0\u5883\u69cb\u7bc9\/HTML\/CSS\/LP\u30fb\u30dd\u30fc\u30c8\u30d5\u30a9\u30ea\u30aa\u4f5c\u6210<\/strong><br><strong>\u2192 <span class=\"swl-marker mark_yellow\">\u6b63\u3057\u3044\u5b66\u7fd2\u65b9\u6cd5\u3067\u300c\u78ba\u304b\u306a\u6210\u9577\u300d\u3092\u5b9f\u611f\u3067\u304d\u308b\u30ab\u30ea\u30ad\u30e5\u30e9\u30e0\u3002<\/span><\/strong><\/li>\n<\/ul>\n\n\n\n<p>\u526f\u696d\u30fb\u30d5\u30ea\u30fc\u30e9\u30f3\u30b9\u304c\u4e3b\u6d41\u306b\u306a\u3063\u3066\u3044\u308b\u4eca\u3053\u305d\u3001\u81ea\u3089\u306e\u30b9\u30ad\u30eb\u3067\u7a3c\u3052\u308b\u4eba\u6750\u3092\u76ee\u6307\u3057\u3066\u307f\u307e\u305b\u3093\u304b\uff1f<\/p>\n\n\n\n<p>\u672a\u7d4c\u9a13\u3067\u3082\u5fc3\u914d\u3059\u308b\u3053\u3068\u3042\u308a\u307e\u305b\u3093\u3002\u521d\u7d1a\u30b3\u30fc\u30b9\u3092\u53d7\u8b1b\u3055\u308c\u308b\u65b9\u306e\u5927\u591a\u6570\u306f\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0\u672a\u7d4c\u9a13\u3067\u3059\u3002\u307e\u305a\u306f\u7121\u6599\u30ab\u30a6\u30f3\u30bb\u30ea\u30f3\u30b0\u3067\u3001\u60a9\u307f\u3084\u4e0d\u5b89\u3092\u304a\u805e\u304b\u305b\u304f\u3060\u3055\u3044\uff01<\/p>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link has-white-color has-text-color has-background has-link-color wp-element-button\" href=\"https:\/\/withcode.tech\/reservation\/\" style=\"background-color:#ffbf00\"><strong>\u516c\u5f0f\u30b5\u30a4\u30c8\u304b\u3089\u7121\u6599\u30ab\u30a6\u30f3\u30bb\u30ea\u30f3\u30b0\u306b\u7533\u3057\u8fbc\u3080<\/strong> <strong>\u2192<\/strong><\/a><\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Jamstack\u30b5\u30a4\u30c8\u306f\u3001\u9ad8\u901f\u3067\u30bb\u30ad\u30e5\u30a2\u306aWeb\u30b5\u30a4\u30c8\u3092\u69cb\u7bc9\u3067\u304d\u308b\u4e00\u65b9\u3067\u3001\u52d5\u7684\u306a\u51e6\u7406\u304c\u5fc5\u8981\u306a\u30d5\u30a9\u30fc\u30e0\u9001\u4fe1\u3067\u306f\u8ab2\u984c\u304c\u767a\u751f\u3057\u307e\u3059\u3002\u5f93\u6765\u306e\u30b5\u30fc\u30d0\u30fc\u30b5\u30a4\u30c9\u51e6\u7406\u304c\u4f7f\u3048\u306a\u3044\u305f\u3081\u3001\u30d5\u30a9\u30fc\u30e0\u30c7\u30fc\u30bf\u306e\u53d7\u4fe1\u3084\u30e1\u30fc\u30eb\u9001\u4fe1\u3092\u5225\u306e\u65b9\u6cd5\u3067\u5b9f\u88c5\u3059\u308b\u5fc5 [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":12567,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"swell_btn_cv_data":"","footnotes":""},"categories":[34,358,361],"tags":[61,66,68],"class_list":["post-12331","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-programming","category-html","category-css","tag-css","tag-web","tag-html"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/withcode.tech\/media\/wp-json\/wp\/v2\/posts\/12331","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/withcode.tech\/media\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/withcode.tech\/media\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/withcode.tech\/media\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/withcode.tech\/media\/wp-json\/wp\/v2\/comments?post=12331"}],"version-history":[{"count":14,"href":"https:\/\/withcode.tech\/media\/wp-json\/wp\/v2\/posts\/12331\/revisions"}],"predecessor-version":[{"id":12857,"href":"https:\/\/withcode.tech\/media\/wp-json\/wp\/v2\/posts\/12331\/revisions\/12857"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/withcode.tech\/media\/wp-json\/wp\/v2\/media\/12567"}],"wp:attachment":[{"href":"https:\/\/withcode.tech\/media\/wp-json\/wp\/v2\/media?parent=12331"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/withcode.tech\/media\/wp-json\/wp\/v2\/categories?post=12331"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/withcode.tech\/media\/wp-json\/wp\/v2\/tags?post=12331"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}