{"id":300,"date":"2022-06-01T23:41:56","date_gmt":"2022-06-01T15:41:56","guid":{"rendered":"https:\/\/blog.indeex.club\/?p=300"},"modified":"2022-05-23T16:57:29","modified_gmt":"2022-05-23T08:57:29","slug":"%e4%bd%bf%e7%94%a8next-js%e5%81%9assr","status":"publish","type":"post","link":"https:\/\/blog.indeex.club\/index.php\/2022\/06\/01\/%e4%bd%bf%e7%94%a8next-js%e5%81%9assr\/","title":{"rendered":"\u4f7f\u7528next.js\u505assr"},"content":{"rendered":"<p>\u76ee\u524d\u4f7f\u7528<em>next.js<\/em>\u7684\u8d8a\u6765\u8d8a\u591a\uff0c\u8fd9\u91cc\u662f\u53ea\u662f\u4e00\u4e2a\u6a21\u7248\u8bb0\u5f55\u3002<\/p>\n<h2>\u5f00\u59cb<\/h2>\n<p>First, run the development server:<\/p>\n<pre><code class=\"language-bash\">npm run dev\n# or\nyarn dev<\/code><\/pre>\n<p>Open <a href=\"http:\/\/localhost:3000\">http:\/\/localhost:3000<\/a> with your browser to see the result.<\/p>\n<h2>sass<\/h2>\n<pre><code class=\"language-bash\">npm i -S sass<\/code><\/pre>\n<p>\u76f4\u63a5\u4f7f\u7528\uff0c\u65e0\u9700\u5176\u4ed6\u914d\u7f6e<\/p>\n<h2>\u79fb\u52a8\u7aef\u9002\u914d<\/h2>\n<p>\u5b89\u88c5<em>postcss-px-to-viewport<\/em><\/p>\n<pre><code class=\"language-bash\">npm i -D postcss-px-to-viewport<\/code><\/pre>\n<p>\u6839\u76ee\u5f55\u65b0\u5efa<em>postcss.config.js<\/em>\uff1a<\/p>\n<pre><code class=\"language-javascript\">\/*\n * @Author: indeex\n * @Date: 2019-05-19 19:30:45\n * @Email: indeex@qq.com\n *\/\nmodule.exports = {\n    plugins: {\n        &#039;postcss-px-to-viewport&#039;: {\n            \/\/ \u89c6\u7a97\u7684\u5bbd\u5ea6\uff0c\u5bf9\u5e94\u7684\u662f\u6211\u4eec\u8bbe\u8ba1\u7a3f\u7684\u5bbd\u5ea6\uff0c\u6211\u4eec\u516c\u53f8\u7528\u7684\u662f375\n            viewportWidth: 375,\n            \/\/ \u89c6\u7a97\u7684\u9ad8\u5ea6\uff0c\u6839\u636e750\u8bbe\u5907\u7684\u5bbd\u5ea6\u6765\u6307\u5b9a\uff0c\u4e00\u822c\u6307\u5b9a1334\uff0c\u4e5f\u53ef\u4ee5\u4e0d\u914d\u7f6e\n            \/\/ viewportHeight: 1334,\n            \/\/ \u6307\u5b9a`px`\u8f6c\u6362\u4e3a\u89c6\u7a97\u5355\u4f4d\u503c\u7684\u5c0f\u6570\u4f4d\u6570\n            unitPrecision: 3,\n            \/\/ \u6307\u5b9a\u9700\u8981\u8f6c\u6362\u6210\u7684\u89c6\u7a97\u5355\u4f4d\uff0c\u5efa\u8bae\u4f7f\u7528vw\n            viewportUnit: &#039;vw&#039;,\n            \/\/ \u6307\u5b9a\u4e0d\u8f6c\u6362\u4e3a\u89c6\u7a97\u5355\u4f4d\u7684\u7c7b\uff0c\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff0c\u53ef\u4ee5\u65e0\u9650\u6dfb\u52a0,\u5efa\u8bae\u5b9a\u4e49\u4e00\u81f3\u4e24\u4e2a\u901a\u7528\u7684\u7c7b\u540d\n            selectorBlackList: [&#039;.ignore&#039;],\n            \/\/ \u5c0f\u4e8e\u6216\u7b49\u4e8e`1px`\u4e0d\u8f6c\u6362\u4e3a\u89c6\u7a97\u5355\u4f4d\uff0c\u4f60\u4e5f\u53ef\u4ee5\u8bbe\u7f6e\u4e3a\u4f60\u60f3\u8981\u7684\u503c\n            minPixelValue: 1,\n            \/\/ \u5141\u8bb8\u5728\u5a92\u4f53\u67e5\u8be2\u4e2d\u8f6c\u6362`px`\n            mediaQuery: false\n            \/\/ exclude: undefined\n        }\n    }\n}<\/code><\/pre>\n<h2>CSS3\u81ea\u52a8\u8865\u5168<\/h2>\n<p>\u5b89\u88c5<em>autoprefixer<\/em><\/p>\n<pre><code class=\"language-bash\">npm i -D autoprefixer<\/code><\/pre>\n<p>\u4fee\u6539<em>postcss.config.js<\/em>\uff1a<\/p>\n<pre><code class=\"language-javascript\">\/\/...\n\nplugins: {\n    &#039;autoprefixer&#039;: {\n        overrideBrowserslist: [\n            &quot;Android 4.1&quot;,\n            &quot;iOS 7.1&quot;,\n            &quot;Chrome &gt; 31&quot;,\n            &quot;ff &gt; 31&quot;,\n            &quot;ie &gt;= 8&quot;\n            \/\/&#039;last 2 versions&#039;, \/\/ \u6240\u6709\u4e3b\u6d41\u6d4f\u89c8\u5668\u6700\u8fd12\u4e2a\u7248\u672c\n        ],\n        grid: true\n    },\n}\n\n\/\/...<\/code><\/pre>\n<p>\u5728<em>Home.module.scss<\/em>\u4e2d\u6dfb\u52a0\uff1a<\/p>\n<pre><code class=\"language-css\">transform:rotate(30deg);<\/code><\/pre>\n<p>\u8fdb\u884c\u6d4b\u8bd5<\/p>\n<h2>\u6dfb\u52a0meta<\/h2>\n<p>\u5728<em>index.js<\/em>\u4e2d\u6dfb\u52a0\uff1a<\/p>\n<pre><code class=\"language-html\">&lt;Head&gt;\n    &lt;meta charSet=&quot;utf-8&quot; \/&gt;\n    &lt;meta name=&quot;keywords&quot; content=&quot;indeex&quot; \/&gt;\n    &lt;meta name=&quot;description&quot; content=&quot;indeex&quot; \/&gt;\n    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no,viewport-fit=cover&quot; \/&gt;\n    &lt;meta httpEquiv=&quot;Pragma&quot; content=&quot;no-cache&quot; \/&gt;\n    &lt;meta httpEquiv=&quot;Expires&quot; content=&quot;0&quot; \/&gt;\n    &lt;meta httpEquiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot; \/&gt;\n    &lt;meta name=&quot;robots&quot; content=&quot;all&quot; \/&gt;\n    &lt;meta name=&quot;author&quot; content=&quot;indeex@qq.com&quot; \/&gt;\n    &lt;meta name=&quot;copyright&quot; content=&quot;&quot; \/&gt;\n    &lt;meta property=&quot;image&quot; content=&quot;https:\/\/blog.indeex.club\/wp-content\/uploads\/2020\/06\/cropped-author%E7%99%BD%E5%BA%95-1-32x32.png&quot; \/&gt;\n    &lt;meta itemProp=&quot;image&quot; content=&quot;https:\/\/blog.indeex.club\/wp-content\/uploads\/2020\/06\/cropped-author%E7%99%BD%E5%BA%95-1-32x32.png&quot; \/&gt;\n    &lt;meta name=&quot;description&quot; itemProp=&quot;description&quot; content=&quot;indeex&quot; \/&gt;\n    &lt;meta property=&quot;og:type&quot; content=&quot;indeex&quot; \/&gt;\n    &lt;meta property=&quot;og:title&quot; content=&quot;indeex&quot; \/&gt;\n    &lt;meta property=&quot;og:description&quot; content=&quot;indeex&quot; \/&gt;\n    &lt;meta property=&quot;og:image&quot; content=&quot;https:\/\/blog.indeex.club\/wp-content\/uploads\/2020\/06\/cropped-author%E7%99%BD%E5%BA%95-1-32x32.png&quot; \/&gt;\n    &lt;meta property=&quot;og:url&quot; content=&quot;&quot; \/&gt;\n    &lt;meta property=&quot;og:videosrc&quot; content=&quot;&quot; \/&gt;\n    &lt;meta property=&quot;og:width&quot; content=&quot;300&quot; \/&gt;\n    &lt;meta property=&quot;og:height&quot; content=&quot;600&quot; \/&gt;\n    &lt;meta name=&quot;renderer&quot; content=&quot;webkit&quot; \/&gt;\n    &lt;meta name=&quot;apple-mobile-web-app-capable&quot; content=&quot;yes&quot; \/&gt;\n    &lt;meta name=&quot;screen-orientation&quot; content=&quot;portrait&quot; \/&gt;\n    &lt;meta name=&quot;full-screen&quot; content=&quot;true&quot; \/&gt;\n    &lt;meta name=&quot;x5-fullscreen&quot; content=&quot;true&quot; \/&gt;\n    &lt;meta name=&quot;x5-orientation&quot; content=&quot;portrait&quot; \/&gt;\n    &lt;meta name=&quot;360-fullscreen&quot; content=&quot;true&quot; \/&gt;\n    &lt;meta httpEquiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge,chrome=1&quot; \/&gt;\n    &lt;meta httpEquiv=&quot;Cache-Control&quot; content=&quot;no-siteapp&quot; \/&gt;\n    &lt;link rel=&quot;icon&quot; href=&quot;https:\/\/blog.indeex.club\/wp-content\/uploads\/2020\/06\/cropped-author%E7%99%BD%E5%BA%95-1-32x32.png&quot; \/&gt;\n    &lt;title&gt;\n       ssr mobile with indeex\n    &lt;\/title&gt;\n&lt;\/Head&gt;<\/code><\/pre>\n<h2>\u914d\u7f6eantd-mobile<\/h2>\n<p>\u5b89\u88c5<em>antd-modile<\/em>\uff1a<\/p>\n<pre><code class=\"language-bash\">npm i -S antd-mobile<\/code><\/pre>\n<p>\u5b89\u88c5<em>next-transpile-modules<\/em>\u3001<em>next-images<\/em>\uff1a<\/p>\n<pre><code class=\"language-bash\">npm i -D next-transpile-modules next-images<\/code><\/pre>\n<p>\u4fee\u6539<em>next.config.js<\/em>\uff1a<\/p>\n<pre><code class=\"language-javascript\">\/** @type {import(&#039;next&#039;).NextConfig} *\/\n\nconst withImages = require(&#039;next-images&#039;)\n\nconst withTM = require(&#039;next-transpile-modules&#039;)([\n  &#039;antd-mobile&#039;,\n]);\n\nconst nextConfig = {\n  reactStrictMode: true,\n  distDir: &quot;build&quot;,\n}\n\nmodule.exports = withTM(withImages(nextConfig))<\/code><\/pre>\n<p>\u5728<em>index.js<\/em>\u4e2d\u4f7f\u7528<em>antd-mobile<\/em>\uff1a<\/p>\n<pre><code class=\"language-javascript\">\/\/...\n\nimport { Steps, Avatar, List } from &#039;antd-mobile&#039;;\n\n\/\/...\n\n\/\/...\n&lt;Avatar src=&quot;&quot; style={{ &#039;--size&#039;: &#039;54px&#039;, borderRadius: &#039;30px&#039; }} \/&gt;\n&lt;List header=&quot;\u7533\u8bf7\u4fe1\u606f&quot;&gt;\n&lt;List.Item extra=&quot;\u672a\u5f00\u542f&quot; clickable&gt;\n    \u5927\u5b57\u53f7\u6a21\u5f0f\n&lt;\/List.Item&gt;\n&lt;List.Item description=&quot;\u7ba1\u7406\u5df2\u6388\u6743\u7684\u4ea7\u54c1\u548c\u8bbe\u5907&quot; clickable&gt;\n    \u6388\u6743\u7ba1\u7406\n&lt;\/List.Item&gt;\n&lt;List.Item title=&quot;\u8fd9\u91cc\u662f\u6807\u9898&quot;&gt;\u8fd9\u91cc\u662f\u4e3b\u4fe1\u606f&lt;\/List.Item&gt;\n&lt;\/List&gt;\n\/\/...<\/code><\/pre>\n<p>\u6ce8\u610f\uff1a<\/p>\n<p>\u90e8\u5206\u8b66\u544a\u9700\u8981\u7b49\u5f85\u5b98\u65b9\u89e3\u51b3\uff0c\u6bd4\u5982\uff1a<\/p>\n<blockquote>\n<p>Warning: useLayoutEffect does nothing on the server\u7684\u9519\u8bef, because its effect cannot be encoded into the server renderer&#8217;s output format. This will lead to a mismatch between the initial, non-hydrated UI and the intended UI. To avoid this, useLayoutEffect should only be used in components that render exclusively on the client. See <a href=\"https:\/\/reactjs.org\/link\/uselayouteffect-ssr\">https:\/\/reactjs.org\/link\/uselayouteffect-ssr<\/a> for common fixes.<\/p>\n<\/blockquote>\n<h2>Router<\/h2>\n<p>\u65e0\u9700\u589e\u52a0\u989d\u5916\u7684\u6587\u4ef6\uff0c\u53ea\u9700\u5728<em>pages<\/em>\u6587\u4ef6\u5939\u4e2d\u65b0\u589e<em>about.js<\/em>\u5373\u53ef\uff1a<\/p>\n<pre><code class=\"language-bash\">-- pages\n    -- index.js\n    -- about.js<\/code><\/pre>\n<p>\u4f7f\u7528<em>useRouter<\/em>\uff0c\u5e76\u53ef\u4ee5\u643a\u5e26\u53c2\u6570\u8df3\u8f6c\uff1a\uff0c\u4fee\u6539<em>index.js<\/em>\uff1a<\/p>\n<pre><code class=\"language-javascript\">\/\/...\nconst router = useRouter()\n  const handleAvatar = () =&gt; {\n    router.push({pathname: &#039;about&#039;, query: {id: 666, name: &quot;indeex&quot;}})\n  }\n\/\/...\n\n\/\/...\n&lt;Button onClick={handleAvatar}&gt;\u8df3\u8f6c\u5230\u5173\u4e8e\u9875\u9762&lt;\/Button&gt;\n\/\/...<\/code><\/pre>\n<p><em>about.js<\/em>\uff1a<\/p>\n<pre><code class=\"language-javascript\">\/*\n * @Author: indeex\n * @Date: 2019-05-19 19:54:39\n * @Email: indeex@qq.com\n *\/\nimport { Button, List } from &#039;antd-mobile&#039;;\nimport { useRouter } from &#039;next\/router&#039;;\n\nfunction About(props) {\n    const router = useRouter()\n\n    const {id, name} = router.query\n\n    const handleBack = () =&gt; {\n        router.push({pathname: &#039;\/&#039;, query: {}})\n    }\n\n    return (\n        &lt;div&gt;\n            &lt;Button onClick={handleBack}&gt;\u8fd4\u56de&lt;\/Button&gt;\n            &lt;List header={id + &quot; : &quot; + name + &quot;\u7684\u4e00\u4e2a\u5217\u8868&quot;}&gt;\n                &lt;List.Item extra=&quot;\u672a\u5f00\u542f&quot; clickable&gt;\n                \u5927\u5b57\u53f7\u6a21\u5f0f\n                &lt;\/List.Item&gt;\n                &lt;List.Item description=&quot;\u7ba1\u7406\u5df2\u6388\u6743\u7684\u4ea7\u54c1\u548c\u8bbe\u5907&quot; clickable&gt;\n                \u6388\u6743\u7ba1\u7406\n                &lt;\/List.Item&gt;\n                &lt;List.Item title=&quot;\u8fd9\u91cc\u662f\u6807\u9898&quot;&gt;\u8fd9\u91cc\u662f\u4e3b\u4fe1\u606f&lt;\/List.Item&gt;\n            &lt;\/List&gt;\n        &lt;\/div&gt;\n    )\n}\n\nexport default About<\/code><\/pre>\n<h2>Axios<\/h2>\n<p>\u5b89\u88c5<em>axios<\/em>\uff1a<\/p>\n<pre><code class=\"language-bash\">npm i -S axios<\/code><\/pre>\n<p>\u5728\u6839\u76ee\u5f55\u6587\u4ef6\u4e0b\u65b0\u5efa<em>utils<\/em>\u6587\u4ef6\u5939\uff0c\u65b0\u5efa<em>axios.js<\/em>\u6587\u4ef6\uff1a<\/p>\n<pre><code class=\"language-javascript\">\/*\n * @Author: indeex\n * @Date: 2019-05-19 19:58:15\n * @Email: indeex@qq.com\n *\/\nimport axios from &#039;axios&#039;\n\nlet baseURL\nif (process.env.NODE_ENV === &#039;production&#039;) {\n    baseURL = &#039;\u751f\u4ea7\u73af\u5883\u5730\u5740&#039;\n} else {\n    baseURL = &#039;\u5f00\u53d1\u73af\u5883\u5730\u5740&#039;\n}\n\n\/\/ \u62e6\u622a\u5668\naxios.interceptors.response.use((response) =&gt; {\n    return response\n}, (error) =&gt; {\n    return Promise.reject(error)\n})\naxios.interceptors.request.use((config) =&gt; {\n    \/\/ config.headers[&#039;Accept&#039;] = &#039;application\/vnd.dpexpo.v1+json&#039;\n    config.baseURL = baseURL\n    config.timeout = 10000\n    return config;\n}, (error) =&gt; {\n    return Promise.reject(error)\n})\n\n\/\/ axios\u7684get\u8bf7\u6c42\nexport function getReq({\n    url,\n    params = {}\n}) {\n    return new Promise((resolve, reject) =&gt; {\n        axios.get(url, {\n            params,\n        }).then(res =&gt; {\n            resolve(res.data)\n        }).catch(err =&gt; {\n            console.log(err, &#039;1&#039;)\n            reject(err)\n        })\n    })\n}\n\n\/\/ axios\u7684post\u8bf7\u6c42\nexport function postReq({\n    url,\n    data\n}) {\n    return new Promise((resolve, reject) =&gt; {\n        axios({\n            url,\n            method: &#039;post&#039;,\n            data\n        }).then(res =&gt; {\n            resolve(res.data)\n        }).catch(err =&gt; {\n            reject(err)\n        })\n    })\n}\n\nexport default axios<\/code><\/pre>\n<p>\u6ce8\u610f\u4e0d\u8981\u5728<em>pages<\/em>\u6587\u4ef6\u5939\u4e0b\u3002<\/p>\n<p>\u5728<em>api<\/em>\u6587\u4ef6\u4e2d\u65b0\u5efa<em>about.js<\/em>\uff1a<\/p>\n<pre><code class=\"language-javascript\">import { getReq, postReq } from &quot;..\/utils\/axios&quot;\n\nconst url = &#039;https:\/\/www.fastmock.site\/mock\/2aeaa7d7a3b169abc7931f5e4cf75eb9\/live\/getProfiles&#039;\n\nexport const getArticle = (params) =&gt; {\n  return  getReq({url, params})\n}<\/code><\/pre>\n<p>\u4fee\u6539<em>pages<\/em>\u6587\u4ef6\u5939\u4e2d\u7684<em>about.js<\/em>\uff1a<\/p>\n<pre><code class=\"language-javascript\">\/\/...\nimport { getArticle } from &#039;.\/api\/aboutApi&#039;\n\/\/...\n\n\/\/...\n&lt;List header={id + &quot; : &quot; + name + &quot;\u7684\u4e00\u4e2a\u5217\u8868&quot;}&gt;\n    {\n        props.footPrintRespList.map(item =&gt; (\n            &lt;List.Item title=&quot;&quot; description={item.userId} key={item.userId}&gt;\n                &lt;Avatar src={item.avatar} style={{ &#039;--size&#039;: &#039;60px&#039;, borderRadius: &#039;30px&#039;, float: &quot;right&quot; }} \/&gt;\n                \u5566\u5566\u5566\u5566\u5566\u5566\n            &lt;\/List.Item&gt;\n        ))\n    }\n&lt;\/List&gt;\n\/\/...\n\n\/\/...\nexport const getServerSideProps = async () =&gt; {\n    let result = await getArticle({})\n    \/\/ let { data: { data } } = result.data\n    let data = result.data.data\n    return {\n        props: {\n            ...data\n        }\n    }\n}\n\/\/...<\/code><\/pre>\n<p>\u4e5f\u53ef\u4ee5\u4f7f\u7528<strong>getStaticProps<\/strong>\uff1a<\/p>\n<ol>\n<li>\n<p>\u6784\u5efa\u65f6\u9884\u6e32\u67d3SSG\uff1a\u5e94\u7528\u6784\u5efa\u65f6\u83b7\u53d6\u4e00\u6b21\u6570\u636e\uff0c\u4e4b\u540e\u4e0d\u53d8\u3002<\/p>\n<\/li>\n<li>\n<p>\u5728\u8fd4\u56de\u7684\u5bf9\u8c61\u4e2d\u589e\u52a0<em>revalidate<\/em>\u5b57\u6bb5\uff0c\u6bcf\u9694\u591a\u5c11\u79d2\u62c9\u53bb\u4e00\u6b21\u6570\u636e\uff0c\u5982\u679c\u6709\u65b0\u6570\u636e\u91cd\u65b0\u751f\u6210\u65b0\u7684\u9759\u6001\u9875\u9762\uff0c\u5982\u679c\u5931\u8d25\u4e0d\u66f4\u65b0\uff0c\u4f7f\u7528\u4e4b\u524d\u7f13\u5b58\u7684\u9875\u9762\uff1a<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"language-javascript\">\/\/...\nexport async function getStaticProps() {\n  const data = await fetch(&#039;https:\/\/xxxx&#039;)\n  return {\n    props: {\n      ...data,\n    },\n    revalidate: 1000,\n  }\n}\n\/\/...<\/code><\/pre>\n<p>\u4e00\u822c\u4e0e<strong>getStaticPaths<\/strong>\u6307\u5b9a\u8def\u7531\u6839\u636e\u6570\u636e\u9884\u6e32\u67d3\u9875\u9762\u4e00\u8d77\u4f7f\u7528\uff0c\u8fd9\u4e24\u79cd\u90fd\u662f\u76f4\u63a5\u751f\u6210\u9759\u6001\u9875\u9762<\/p>\n<p><strong>getServerSideProps<\/strong>\u662fssr\uff0c\u6bcf\u6b21\u8bf7\u6c42\u90fd\u4f1a\u91cd\u65b0\u751f\u6210\u65b0\u7684\u9759\u6001\u9875\u9762<\/p>\n<h2>\u53d1\u5e03<\/h2>\n<p>\u4fee\u6539<em>package.json<\/em>\uff1a<\/p>\n<pre><code class=\"language-bash\">\/\/...\n&quot;start&quot;: &quot;next build &amp;&amp; next start&quot;,\n\/\/...<\/code><\/pre>\n<p>\u6bcf\u6b21\u8fd0\u884c\u65f6\uff0c\u81ea\u52a8build\u4e00\u6b21<\/p>\n<h2>\u90e8\u7f72<\/h2>\n<p>\u4e00\u7248\u4f7f\u7528PM2\u5b88\u62a4\u8fdb\u7a0b\uff0c\u5728\u670d\u52a1\u5668\u7aef\u6216\u672c\u673a\u5b89\u88c5\uff0c\u67d0\u4e9b\u670d\u52a1\u5668\u5382\u5546\u4e5f\u4f1a\u6709\u4e00\u952e\u90e8\u7f72\u6216\u8f85\u52a9\u90e8\u7f72\u7684\u5de5\u5177\u6216\u5df2\u7ecf\u8bbe\u7f6e\u597d\u7684\u670d\u52a1\u5668\uff1a<\/p>\n<pre><code class=\"language-bash\">npm i -g pm2<\/code><\/pre>\n<p>\u4e5f\u53ef\u4f7f\u7528\u914d\u7f6e\u6587\u4ef6<em>ecosystem.config<\/em><\/p>\n<p>\u5c06build\u540e\u7684\u6587\u4ef6\u5939\u6216\u9879\u76ee\u6587\u4ef6\u5939\u4e0a\u4f20\u5230\u670d\u52a1\u5668<\/p>\n<p>\u8fdb\u5165build\u6587\u4ef6\u5939\u6216\u9879\u76ee\u6587\u4ef6\u5939\u7136\u540e\u4f7f\u7528\uff1a<\/p>\n<pre><code class=\"language-bash\">pm2 start npm --name &#039;indeex-demo&#039; -- run build<\/code><\/pre>\n<p>\u7136\u540e\u662f\u6839\u636e\u7aef\u53e3\uff0c\u914d\u7f6enginx\u5373\u53ef\uff0c\u7aef\u53e3\u53ef\u6839\u636e\u9700\u6c42\u4fee\u6539\uff0c\u4e5f\u53ef\u4ee5\u8fd0\u884c\u65f6\u6307\u5b9a\uff1a<\/p>\n<pre><code class=\"language-bash\">&quot;start&quot;: &quot;next build &amp;&amp; next start -p 8080&quot;,<\/code><\/pre>\n<h2>\u5bfc\u51fa\u9875\u9762<\/h2>\n<p>\u5982\u679c\u4e0d\u60f3\u4f7f\u7528node\u670d\u52a1\u90e8\u7f72\uff0c\u4e5f\u53ef\u4ee5\u5bfc\u51fa\u9875\u9762\uff0c\u76f4\u63a5\u653e\u5230\u670d\u52a1\u5668\u4e0a\u9762\uff1a<\/p>\n<pre><code class=\"language-bash\">&quot;export&quot;: &quot;next export&quot;,<\/code><\/pre>\n<p>\u5bfc\u51fa\u540e\u5c31\u662f\u666e\u901a\u5e26\u6709<em>.html<\/em>\u7684\u9875\u9762\uff0c\u5bfc\u51fa\u7684\u9875\u9762\u8d44\u6e90\u8def\u5f84\u4e3a\u670d\u52a1\u5668\u7684<em>\/<\/em>\uff0c\u5982\u679c\u9700\u8981\u653e\u5165\u670d\u52a1\u5668\u4e8c\u7ea7\u76ee\u5f55\uff0c\u9700\u8981\u4fee\u6539<em>next.config.js<\/em>\uff1a<\/p>\n<pre><code class=\"language-javascript\">\/\/...\n\nbasePath: &quot;\/nextjs-demo&quot;,\n\n\/\/...<\/code><\/pre>\n<p>\u7136\u540e\u91cd\u65b0build\uff0c\u7136\u540e\u91cd\u65b0export\u3002\u5982\u679c\u60f3\u8981\u533a\u5206\u5f00\u53d1\u548c\u751f\u4ea7\u73af\u5883\uff0c\u5728\u914d\u7f6e\u91cc\u81ea\u884c\u533a\u5206\uff0c\u5728\u5176\u4ed6\u8def\u5f84\u4e2d\u914d\u7f6e\u5373\u53ef\u3002<\/p>\n<h2>PC\u7aef<\/h2>\n<p>PC\u7aef\u53ea\u9700\u8981\u5c06<em>antd-mobile<\/em>\u6539\u4e3a<em>antd<\/em>\uff0c\u7136\u540e\u5728<em>postcss.config.js<\/em>\u4e2d\u589e\u52a0\u76f8\u5173\u6837\u5f0f\u7c7b\u5373\u53ef\uff0c\u4e5f\u53ef\u4ee5\u76f4\u63a5\u53bb\u6389px2rem\u7684\u914d\u7f6e\u3002<\/p>\n<p>\u670d\u52a1\u5668\u7aef\u6e32\u67d3\u6bd4\u8f83\u9002\u5408\u504f\u9759\u6001\u7c7b\u9875\u9762\u6216\u4e00\u4e9b\u7b80\u5355\u8bf7\u6c42\u7684\u9875\u9762\uff0c\u5982\u5b98\u7f51\u3001\u5ba3\u4f20\u9875\u3001\u535a\u5ba2\u3001\u8bba\u575b\u3001\u65b0\u95fb\u7b49\u3002<\/p>\n<p>\u6548\u679c\u9884\u89c8\u5730\u5740\uff1a<\/p>\n<p><a href=\"https:\/\/hungking.org\/nextjs-demo\/\">next.js ssr:https:\/\/hungking.org\/nextjs-demo\/<\/a><\/p>\n<p><img src=\"https:\/\/hungking.cc\/assets\/imgs\/indeex.cc\/nextjs-base.gif\" alt=\"next.js ssr\" \/><\/p>\n<p>code enjoy! \ud83e\udd96\ud83e\udd96\ud83e\udd96<\/p>\n<p>\u4f5c\u8005\uff1aindeex  <\/p>\n<p>\u94fe\u63a5\uff1a<a href=\"https:\/\/indeex.club\/\">https:\/\/indeex.club<\/a>  <\/p>\n<p>\u8457\u4f5c\u6743\u5f52\u4f5c\u8005\u6240\u6709\u3002\u5546\u4e1a\u8f6c\u8f7d\u8bf7\u8054\u7cfb\u4f5c\u8005\u83b7\u5f97\u6388\u6743\uff0c\u975e\u5546\u4e1a\u8f6c\u8f7d\u8bf7\u6ce8\u660e\u51fa\u5904\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u76ee\u524d\u4f7f\u7528next.js\u7684\u8d8a\u6765\u8d8a\u591a\uff0c\u8fd9\u91cc\u662f\u53ea\u662f\u4e00\u4e2a\u6a21\u7248\u8bb0\u5f55\u3002 \u5f00\u59cb First, run the de<a href=\"https:\/\/blog.indeex.club\/index.php\/2022\/06\/01\/%e4%bd%bf%e7%94%a8next-js%e5%81%9assr\/\" class=\"read-more\">Read More<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[17],"tags":[],"_links":{"self":[{"href":"https:\/\/blog.indeex.club\/index.php\/wp-json\/wp\/v2\/posts\/300"}],"collection":[{"href":"https:\/\/blog.indeex.club\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.indeex.club\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.indeex.club\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.indeex.club\/index.php\/wp-json\/wp\/v2\/comments?post=300"}],"version-history":[{"count":2,"href":"https:\/\/blog.indeex.club\/index.php\/wp-json\/wp\/v2\/posts\/300\/revisions"}],"predecessor-version":[{"id":302,"href":"https:\/\/blog.indeex.club\/index.php\/wp-json\/wp\/v2\/posts\/300\/revisions\/302"}],"wp:attachment":[{"href":"https:\/\/blog.indeex.club\/index.php\/wp-json\/wp\/v2\/media?parent=300"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.indeex.club\/index.php\/wp-json\/wp\/v2\/categories?post=300"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.indeex.club\/index.php\/wp-json\/wp\/v2\/tags?post=300"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}