{"id":75,"date":"2026-04-04T21:28:28","date_gmt":"2026-04-04T13:28:28","guid":{"rendered":"http:\/\/www.houzhibin.top\/?p=75"},"modified":"2026-04-04T21:28:41","modified_gmt":"2026-04-04T13:28:41","slug":"next-js-%e8%af%ad%e6%b3%95%e9%97%ae%e9%a2%98","status":"publish","type":"post","link":"https:\/\/www.houzhibin.top\/?p=75","title":{"rendered":"Next.js \u8bed\u6cd5\u95ee\u9898"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">\u4e00\u3001Next.js Server Action \u8868\u5355\u7ed1\u5b9a\u65b9\u5f0f<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u4e24\u79cd\u65b9\u5f0f\u5bf9\u6bd4<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">1. \u274c \u9519\u8bef\u65b9\u5f0f\uff08\u539f\u4ee3\u7801\uff09<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;form className=\"flex-1 flex flex-col min-w-64\"&gt;\n  &lt;Input name=\"email\" \/&gt;\n  &lt;SubmitButton formAction={signInAction}&gt;Sign in&lt;\/SubmitButton&gt;\n&lt;\/form&gt;\n<\/code><\/pre>\n\n\n\n<p><code>formAction<\/code> \u5c5e\u6027\u653e\u5728 button \u4e0a\uff0c<strong>\u53ea\u6709\u5728\u7eaf\u5ba2\u6237\u7aef\u8868\u5355\u4e2d\u624d\u6709\u6548<\/strong>\u3002\u4f46\u5728 Next.js \u670d\u52a1\u5668\u7ec4\u4ef6\u6e32\u67d3\u7684\u9875\u9762\u4e2d\uff0c\u8fd9\u79cd\u65b9\u5f0f\u53ef\u80fd\u65e0\u6cd5\u6b63\u786e\u7ed1\u5b9a\u3002<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">2. \u2705 \u6b63\u786e\u65b9\u5f0f\uff08\u4fee\u6539\u540e\uff09<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;form className=\"flex-1 flex flex-col min-w-64\" action={signInAction}&gt;\n  &lt;Input name=\"email\" \/&gt;\n  &lt;SubmitButton&gt;Sign in&lt;\/SubmitButton&gt;\n&lt;\/form&gt;\n<\/code><\/pre>\n\n\n\n<p><code>action<\/code> \u5c5e\u6027\u653e\u5728 form \u6807\u7b7e\u4e0a\uff0c\u8fd9\u662f <strong>HTML \u6807\u51c6\u8868\u5355\u63d0\u4ea4\u65b9\u5f0f<\/strong>\uff0c\u66f4\u53ef\u9760\u3002<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">\u4e3a\u4ec0\u4e48\u8fd9\u6837\u4fee\u6539\uff1f<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u7279\u6027<\/th><th><code>formAction<\/code>&nbsp;(button \u4e0a)<\/th><th><code>action<\/code>&nbsp;(form \u4e0a)<\/th><\/tr><\/thead><tbody><tr><td>HTML \u6807\u51c6<\/td><td>\u2705 \u652f\u6301<\/td><td>\u2705 \u652f\u6301<\/td><\/tr><tr><td>Next.js \u670d\u52a1\u5668\u7ec4\u4ef6<\/td><td>\u26a0\ufe0f \u53ef\u80fd\u5931\u6548<\/td><td>\u2705 \u5b8c\u5168\u652f\u6301<\/td><\/tr><tr><td>\u591a\u6309\u94ae\u8868\u5355<\/td><td>\u2705 \u4e0d\u540c\u6309\u94ae\u63d0\u4ea4\u4e0d\u540c\u52a8\u4f5c<\/td><td>\u274c \u6574\u4e2a\u8868\u5355\u53ea\u80fd\u4e00\u4e2a action<\/td><\/tr><tr><td>\u7b80\u5355\u5355\u63d0\u4ea4\u8868\u5355<\/td><td>\u2705 \u53ef\u7528<\/td><td>\u2705&nbsp;<strong>\u63a8\u8350<\/strong><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">\u672c\u9879\u76ee\u7684\u60c5\u51b5<\/h3>\n\n\n\n<p>\u8fd9\u4e2a\u767b\u5f55\/\u6ce8\u518c\u8868\u5355<strong>\u53ea\u6709\u4e00\u4e2a\u63d0\u4ea4\u6309\u94ae<\/strong>\uff0c\u6240\u4ee5\u628a <code>action<\/code> \u653e\u5728 form \u6807\u7b7e\u4e0a\u662f\u6700\u7b80\u5355\u53ef\u9760\u7684\u65b9\u5f0f\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ signInAction \u548c signUpAction \u90fd\u662f Server Action\nexport const signInAction = async (formData: FormData) =&gt; {\n  const email = formData.get(\"email\") as string;\n  const password = formData.get(\"password\") as string;\n  \/\/ ... \u5904\u7406\u903b\u8f91\n};\n<\/code><\/pre>\n\n\n\n<p>\u5f53\u7528\u6237\u70b9\u51fb\u63d0\u4ea4\u6309\u94ae\u65f6\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u8868\u5355\u6570\u636e\u901a\u8fc7 POST \u63d0\u4ea4\u5230\u00a0<code>action<\/code>\u00a0\u6307\u5b9a\u7684 Server Action<\/li>\n\n\n\n<li>Server Action \u5728\u670d\u52a1\u5668\u7aef\u6267\u884c\uff08\u8bbf\u95ee\u6570\u636e\u5e93\u3001\u8c03\u7528 API \u7b49\uff09<\/li>\n\n\n\n<li>\u6267\u884c\u00a0<code>redirect()<\/code>\u00a0\u8df3\u8f6c\u5230\u76ee\u6807\u9875\u9762<\/li>\n<\/ol>\n\n\n\n<p>\u8fd9\u5c31\u662f Next.js App Router \u63a8\u8350\u7684<strong>\u8868\u5355\u63d0\u4ea4\u6a21\u5f0f<\/strong>\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u4e8c\u3001\u9879\u76ee\u8bed\u6cd5\u95ee\u9898<\/h2>\n\n\n\n<p>\ud83d\udc49<strong><code>.ts<\/code> = \u7eaf TypeScript \u6587\u4ef6<\/strong>   \u5199\u903b\u8f91<br>\ud83d\udc49 <strong><code>.tsx<\/code> = \u53ef\u4ee5\u5199 JSX\uff08React \u4ee3\u7801\uff09\u7684 TypeScript \u6587\u4ef6<\/strong>   \u5199\u754c\u9762<\/p>\n\n\n\n<p>\ud83d\udc49 <strong>\u4f18\u5148\u7528 <code>export const<\/code>\uff08\u547d\u540d\u5bfc\u51fa\uff09<\/strong><br>\ud83d\udc49 <strong>\u53ea\u6709\u5728\u201c\u660e\u786e\u552f\u4e00\u5165\u53e3\u201d\u7684\u573a\u666f\u624d\u7528 <code>export default<\/code><\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u4e09\u3001\u6838\u5fc3\u533a\u522b\uff08\u672c\u8d28\uff09<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u5bf9\u6bd4\u70b9<\/th><th><code>export default<\/code><\/th><th><code>export const<\/code><\/th><\/tr><\/thead><tbody><tr><td>\u6570\u91cf<\/td><td>\u53ea\u80fd 1 \u4e2a<\/td><td>\u53ef\u4ee5\u591a\u4e2a<\/td><\/tr><tr><td>\u5bfc\u5165\u65b9\u5f0f<\/td><td>\u81ea\u5b9a\u4e49\u540d\u5b57<\/td><td>\u5fc5\u987b\u540c\u540d<\/td><\/tr><tr><td>\u53ef\u8bfb\u6027<\/td><td>\u274c \u4e0d\u76f4\u89c2<\/td><td>\u2705 \u5f88\u6e05\u6670<\/td><\/tr><tr><td>\u91cd\u6784\u53cb\u597d<\/td><td>\u274c \u5dee<\/td><td>\u2705 \u597d<\/td><\/tr><tr><td>\u63a8\u8350\u7a0b\u5ea6<\/td><td>\u2b50\u2b50<\/td><td>\u2b50\u2b50\u2b50\u2b50<\/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\">\u2705 1. \u53ef\u8bfb\u6027\u66f4\u5f3a<\/h2>\n\n\n\n<pre class=\"wp-block-preformatted\">\/\/ utils.ts<br>export const add = () =&gt; {};<br>export const sub = () =&gt; {};<\/pre>\n\n\n\n<p>\u5bfc\u5165\u65f6\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">import { add, sub } from \".\/utils\";<\/pre>\n\n\n\n<p>\ud83d\udc49 \u4e00\u773c\u77e5\u9053\u7528\u4e86\u54ea\u4e9b\u51fd\u6570 \ud83d\udc4d<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u274c default \u7684\u95ee\u9898<\/h2>\n\n\n\n<pre class=\"wp-block-preformatted\">export default function add() {}<\/pre>\n\n\n\n<pre class=\"wp-block-preformatted\">import abc from \".\/utils\";<\/pre>\n\n\n\n<p>\ud83d\udc49 <code>abc<\/code> \u662f\u5565\uff1f\uff1f\u5b8c\u5168\u770b\u4e0d\u51fa\u6765 \ud83d\ude05<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u2705 2. \u66f4\u5229\u4e8e\u56e2\u961f\u534f\u4f5c<\/h2>\n\n\n\n<p>\u591a\u4eba\u5f00\u53d1\u65f6\uff1a<\/p>\n\n\n\n<p>\ud83d\udc49 \u547d\u540d\u5bfc\u51fa\u5f3a\u5236\u7edf\u4e00\u540d\u5b57<br>\ud83d\udc49 \u4e0d\u4f1a\u51fa\u73b0\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">import fn1 from \".\/utils\";<br>import fn2 from \".\/utils\";<\/pre>\n\n\n\n<p>\u8fd9\u79cd\u6df7\u4e71\u60c5\u51b5<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u2705 3. \u66f4\u597d\u91cd\u6784\uff08\u975e\u5e38\u5173\u952e\uff09<\/h2>\n\n\n\n<p>IDE\uff08\u6bd4\u5982 VSCode\uff09\uff1a<\/p>\n\n\n\n<p>\ud83d\udc49 \u5bf9\u547d\u540d\u5bfc\u51fa\u652f\u6301\u66f4\u597d\uff08\u81ea\u52a8\u91cd\u547d\u540d\u3001\u8df3\u8f6c\uff09<\/p>\n\n\n\n<p>\ud83d\udc49 \u53ea\u5728\u8fd9\u4e9b\u573a\u666f\u7528\uff08\u8bb0\u4f4f\u8fd9\u51e0\u4e2a\u5c31\u591f\u4e86\uff09<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u2705 1. React \/ Next.js \u9875\u9762<\/h2>\n\n\n\n<pre class=\"wp-block-preformatted\">export default function Page() {<br>  return &lt;div&gt;\u9996\u9875&lt;\/div&gt;;<br>}<\/pre>\n\n\n\n<p>\ud83d\udc49 \u6846\u67b6\u8981\u6c42\u5fc5\u987b default<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u2705 2. \u5355\u4e00\u6838\u5fc3\u6a21\u5757<\/h2>\n\n\n\n<p>\u6bd4\u5982\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">export default class UserService {}<\/pre>\n\n\n\n<p>\ud83d\udc49 \u8fd9\u4e2a\u6587\u4ef6\u5c31\u5e72\u4e00\u4ef6\u4e8b<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u2705 3. UI\u7ec4\u4ef6\uff08\u6709\u4e89\u8bae\uff09<\/h2>\n\n\n\n<pre class=\"wp-block-preformatted\">export default function Button() {}<\/pre>\n\n\n\n<p>\ud83d\udc49 \u6709\u4e9b\u56e2\u961f\u5141\u8bb8\u8fd9\u6837\u5199<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<pre class=\"wp-block-preformatted\">1. \u5de5\u5177\u51fd\u6570 \u2192 \u4e00\u5f8b export const<br>2. hooks \u2192 export const<br>3. \u5e38\u91cf \/ \u7c7b\u578b \u2192 export const \/ export type<br>4. \u9875\u9762 \u2192 export default\uff08\u5fc5\u987b\uff09<br>5. \u5355\u4e00\u7c7b \/ \u670d\u52a1 \u2192 \u53ef\u7528 default<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">\u274c \u4e0d\u63a8\u8350\u5199\u6cd5<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">\/\/ utils.ts<br>export default function add() {}<\/pre>\n\n\n\n<pre class=\"wp-block-preformatted\">import xxx from \".\/utils\"; \/\/ \u274c \u4e0d\u6e05\u6670<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">\u2705 \u63a8\u8350\u5199\u6cd5<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">\/\/ utils.ts<br>export const add = () =&gt; {};<\/pre>\n\n\n\n<pre class=\"wp-block-preformatted\">import { add } from \".\/utils\"; \/\/ \u2705 \u6e05\u6670<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>\u4f60\u53ef\u4ee5\u8fd9\u6837\u603b\u7ed3\uff1a<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\u6211\u66f4\u503e\u5411\u4f7f\u7528 <code>export const<\/code>\uff0c\u56e0\u4e3a\u5b83\u5177\u5907\u66f4\u597d\u7684\u53ef\u8bfb\u6027\u3001\u53ef\u7ef4\u62a4\u6027\u548c\u91cd\u6784\u53cb\u597d\u6027\uff0c\u7279\u522b\u662f\u5728\u591a\u4eba\u534f\u4f5c\u65f6\u53ef\u4ee5\u907f\u514d\u547d\u540d\u6df7\u4e71\u3002<br>\u53ea\u6709\u5728\u660e\u786e\u5355\u4e00\u5bfc\u51fa\u7684\u573a\u666f\uff0c\u6bd4\u5982 Next.js \u9875\u9762\u6216\u6a21\u5757\u5165\u53e3\u65f6\uff0c\u6211\u624d\u4f1a\u4f7f\u7528 <code>export default<\/code>\u3002<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>\ud83d\udc49 <strong>Tree Shaking\uff08\u6253\u5305\u4f18\u5316\uff09<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>export const<\/code> \ud83d\udc49 \u66f4\u5bb9\u6613\u88ab\u4f18\u5316\u6389\u672a\u4f7f\u7528\u4ee3\u7801 \u2705<\/li>\n\n\n\n<li><code>export default<\/code> \ud83d\udc49 \u6709\u65f6\u4e0d\u5bb9\u6613\u4f18\u5316 \u274c<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>\ud83d\udc49 <strong>\u5f00\u53d1\u4f18\u5148\u7528 <code>export const<\/code>\uff0c\u6846\u67b6\u8981\u6c42\u624d\u7528 <code>export default<\/code><\/strong><\/p>\n\n\n\n<p> <\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u4e00\u3001Next.js Server Action \u8868\u5355\u7ed1\u5b9a\u65b9\u5f0f \u4e24\u79cd\u65b9\u5f0f\u5bf9\u6bd4 1. \u274c \u9519\u8bef\u65b9\u5f0f\uff08\u539f\u4ee3\u7801\uff09 fo [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-75","post","type-post","status-publish","format-standard","hentry","category-1"],"_links":{"self":[{"href":"https:\/\/www.houzhibin.top\/index.php?rest_route=\/wp\/v2\/posts\/75","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.houzhibin.top\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.houzhibin.top\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.houzhibin.top\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.houzhibin.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=75"}],"version-history":[{"count":1,"href":"https:\/\/www.houzhibin.top\/index.php?rest_route=\/wp\/v2\/posts\/75\/revisions"}],"predecessor-version":[{"id":76,"href":"https:\/\/www.houzhibin.top\/index.php?rest_route=\/wp\/v2\/posts\/75\/revisions\/76"}],"wp:attachment":[{"href":"https:\/\/www.houzhibin.top\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=75"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.houzhibin.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=75"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.houzhibin.top\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=75"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}