佛遵 發表於 2023-8-18 21:20:00

NodeJS系列(12)- Next.js 框架 (五) | 样式 (Styling) 、部署(Deploying)

<p>在 “NodeJS系列(8)- Next.js 框架 (一) | 安装配置、路由(Routing)、页面布局(Layout)” 里,我们简单介绍了 Next.js 的安装配置,创建了 nextjs-demo 项目,讲解和演示了 Next.js 项目的运行、路由(Routing)、页面布局(Layout)等内容。<br><br>在 “NodeJS系列(9)- Next.js 框架 (二) | 国际化 (i18n)、中间件 (Middleware)” 里,我们在 nextjs-demo 项目基础上,讲解和演示了 Next.js 项目的国际化 (i18n)、中间件 (Middleware) 等内容。<br><br>在 “NodeJS系列(10)- Next.js 框架 (三) | 渲染(Rendering)” 里,我们在 nextjs-demo 项目基础上,讲解和演示了渲染(Rendering)。<br><br>在 “NodeJS系列(11)- Next.js 框架 (四) | 数据获取(Data Fetching) ” 里,我们在 nextjs-demo 项目基础上,讲解和演示了数据获取(Data Fetching)。<br><br>本文继续在 nextjs-demo 项目(Pages Router)基础上,讲解和演示样式 (Styling) 、部署(Deploying)等内容。<br><br>NextJS: https://nextjs.org/<br>NextJS GitHub: https://github.com/vercel/next.js</p>
<p>&nbsp;</p>
<h2>1. 系统环境</h2>
<p>&nbsp;&nbsp;&nbsp; 操作系统:CentOS 7.9 (x64)<br>&nbsp;&nbsp;&nbsp; NodeJS: 16.20.0<br>&nbsp;&nbsp;&nbsp; NPM: 8.19.4<br>&nbsp;&nbsp;&nbsp; NVM: 0.39.2<br>&nbsp;&nbsp;&nbsp; NextJS: 13.4.12<br><br></p>
<h2><br>2. 样式 (Styling)</h2>
<p>&nbsp;&nbsp;&nbsp; Next.js 支持如下的应用程序样式设置方式:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (1) 全局 CSS:对于那些有传统 CSS 经验的人来说,使用起来很简单,也很熟悉,但随着应用程序的发展,可能会导致更大的 CSS 捆绑包和管理样式的困难。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (2) CSS 模块:创建本地作用域的 CSS 类,以避免命名冲突并提高可维护性。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (3) JS 中的 CSS:直接在 JavaScript 组件中嵌入 CSS,实现动态和范围化的样式。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (4) Sass:一个流行的 CSS 预处理器,它通过变量、嵌套规则和 mixin 等功能扩展 CSS。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (5) Tailwind CSS:一个实用程序优先的 CSS 框架,允许通过组成实用程序类来快速定制设计。</p>
<h3>&nbsp;&nbsp;&nbsp; 1) 全局 CSS</h3>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在 nextjs-demo 项目里有一个 src/styles/globals.css 文件,这是由 create-next-app nextjs-demo 命令自动创建的,它就是 nextjs-demo 项目的一个全局 CSS 文件。内容如下:</p>
<div class="cnblogs_code">
<pre>            ...

            html,
            body {
                max-width: 100vw;
                overflow-x: hidden;
            }

            ...</pre>
</div>
<p><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 全局 CSS,顾名思义,就要将该文件里 CSS 能应用于 nextjs-demo 项目里的全部页面和组件。 由于这种样式表的全局性,为了避免冲突,只能在 src/pages/_app.js 中导入它们。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 修改 src/pages/_app.js 文件,内容如下:</p>
<div class="cnblogs_code">
<pre>            import '../styles/globals.css'<span style="color: rgba(0, 0, 0, 1)">

            export </span><span style="color: rgba(0, 0, 255, 1)">default</span> ({ Component, pageProps }) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
                </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> (
                  </span>&lt;Component {...pageProps} /&gt;
<span style="color: rgba(0, 0, 0, 1)">                )
            }</span></pre>
</div>
<h3><br>&nbsp;&nbsp;&nbsp; <strong>2) CSS 模块</strong></h3>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Next.js 内置支持使用 *.module.CSS 扩展名的 CSS 模块。<br>&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CSS 模块通过自动创建一个唯一的类名来对 CSS 进行本地作用域。这允许您在不同的文件中使用相同的类名,而不用担心冲突。这种行为使 CSS 模块成为包含组件级 CSS 的理想方式。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 示例,一个可重用按钮组件,创建 components/Button.module.css 文件,内容如下:</p>
<div class="cnblogs_code">
<pre>            /*
            You do not need to worry about .error {} colliding with any other `.css` or
            `.module.css` files!
            */
            .error {
                color: white;
                background-color: red;
            }</pre>
</div>
<p><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 创建 components/Button.js 文件,内容如下:</p>
<div class="cnblogs_code">
<pre>            import styles from './Button.module.css'<span style="color: rgba(0, 0, 0, 1)">

            export </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> Button() {
                </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> (
                  </span>&lt;<span style="color: rgba(0, 0, 0, 1)">button
                        type</span>="button"
                        <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Note how the "error" class is accessed as a property on the imported</span>
                        <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> `styles` object.</span>
                        className=<span style="color: rgba(0, 0, 0, 1)">{styles.error}
                  </span>&gt;<span style="color: rgba(0, 0, 0, 1)">
                        Destroy
                  </span>&lt;/button&gt;
<span style="color: rgba(0, 0, 0, 1)">                )
            }       </span></pre>
</div>
<h3><br>&nbsp;&nbsp;&nbsp; <strong>3) JS 中的 CSS</strong></h3>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JS 解决方案中可以使用任何现有的 CSS 。最简单的是内联样式:</p>
<div class="cnblogs_code">
<pre>            <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> Test() {
                </span><span style="color: rgba(0, 0, 255, 1)">return</span> &lt;p style={{ color: 'red' }}&gt;Test Page&lt;/p&gt;
<span style="color: rgba(0, 0, 0, 1)">            }

            export </span><span style="color: rgba(0, 0, 255, 1)">default</span> Test</pre>
</div>
<p><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我们捆绑样式的 jsx,以提供对独立作用域 CSS 的支持。其目的是支持类似于 Web 组件的“shadow CSS”,不幸的是,Web 组件不支持服务器渲染,仅支持JS。</p>
<div class="cnblogs_code">
<pre>            <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> HelloWorld() {
                </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> (
                  </span>&lt;div&gt;<span style="color: rgba(0, 0, 0, 1)">
                        Hello world
                        </span>&lt;p&gt;scoped!&lt;/p&gt;
                        &lt;style jsx&gt;<span style="color: rgba(0, 0, 0, 1)">{`
                            p {
                              color: blue;
                            }
                            div {
                              background: red;
                            }
                            @media (max</span>-<span style="color: rgba(0, 0, 0, 1)">width: 600px) {
                              div {
                                    background: blue;
                              }
                            }
                        `} </span>&lt;/style&gt;
                        &lt;style global jsx&gt;<span style="color: rgba(0, 0, 0, 1)">{`
                            body {
                              background: black;
                            }
                        `}</span>&lt;/style&gt;
                  &lt;/div&gt;
<span style="color: rgba(0, 0, 0, 1)">                )
            }
            
            export </span><span style="color: rgba(0, 0, 255, 1)">default</span> HelloWorld</pre>
</div>
<h3><br>&nbsp;&nbsp;&nbsp; <strong>4) Sass</strong></h3>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Next.js 内置了对 Sass 的支持,同时使用 .scs 和 .sas 扩展。可以通过 CSS 模块 和 .module.scssor.module.sess 扩展名使用组件级 Sass。 <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 需要先安装 sass,命令如下:<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $ npm install --save-dev sass&nbsp;&nbsp;&nbsp; &nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Sass 支持两种不同的语法,每种语法都有自己的扩展名。.sscs 扩展要求使用 scss 语法,而 .sass 扩展则要求使用缩进语法(“sass”)。 如果不确定该选择哪一个,可以从 .scs 扩展开始,它是 CSS 的超集,不需要学习缩进语法(“Sass”)。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>(1) 自定义 Sass 选项</strong><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果要配置 Sass 编译器,请使用 next.config.js 中的 sassOptions。格式如下:</p>
<div class="cnblogs_code">
<pre>                import path from 'path'<span style="color: rgba(0, 0, 0, 1)">
               
                module.exports </span>=<span style="color: rgba(0, 0, 0, 1)"> {
                  sassOptions: {
                        includePaths: ,
                  },
                }</span></pre>
</div>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>(2) Sass 变量</strong><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Next.js 支持从 CSS 模块文件导出的 Sass 变量。例如,使用导出的 primaryColor Sass 变量。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; src/styles/variables.module.scss 文件,内容如下: </p>
<div class="cnblogs_code">
<pre>                $primary-color: #64ff00;
               
                :export {
                  primaryColor: $primary-color;
                }            </pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; src/pages/_app.js 文件,内容如下:</p>
<div class="cnblogs_code">
<pre>                import variables from '../styles/variables.module.scss'<span style="color: rgba(0, 0, 0, 1)">
               
                export </span><span style="color: rgba(0, 0, 255, 1)">default</span> <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> MyApp({ Component, pageProps }) {
                  </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> (
                        </span>&lt;Layout color={variables.primaryColor}&gt;
                        &lt;Component {...pageProps} /&gt;
                        &lt;/Layout&gt;
<span style="color: rgba(0, 0, 0, 1)">                  )
                }         </span></pre>
</div>
<h3><br>&nbsp;&nbsp;&nbsp; 5) Tailwind CSS</h3>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Tailwind CSS 是一个实用程序优先的 CSS 框架,与 Next.js 配合得非常好。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 需要先安装 Tailwind CSS,命令如下:<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $ npm install -D tailwindcss postcss autoprefixer<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $ npx tailwindcss init -p<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>(1) 配置 Tailwind</strong> <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在 tailwind.config.js 中,为将使用 Tailwind CSS 类名的文件添加路径:</p>
<div class="cnblogs_code">
<pre>                <span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">* @type {import('tailwindcss').Config} </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
                module.exports </span>=<span style="color: rgba(0, 0, 0, 1)"> {
                  content: [
                        </span>'./app/**/*.{js,ts,jsx,tsx,mdx}', <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Note the addition of the `app` directory.</span>
                        './pages/**/*.{js,ts,jsx,tsx,mdx}'<span style="color: rgba(0, 0, 0, 1)">,
                        </span>'./components/**/*.{js,ts,jsx,tsx,mdx}'<span style="color: rgba(0, 0, 0, 1)">,
                  
                        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Or if using `src` directory:</span>
                        './src/**/*.{js,ts,jsx,tsx,mdx}'<span style="color: rgba(0, 0, 0, 1)">,
                  ],
                  theme: {
                        extend: {},
                  },
                  plugins: [],
                }</span></pre>
</div>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不需要修改 postss.config.js。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>(2) 导入样式</strong><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将 Tailwind CSS 指令添加到应用程序中的全局样式表中,修改 src/styles/globals.css 文件,添加如下内容:<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @tailwind base;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @tailwind components;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @tailwind utilities;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在 src/pages/_app.js中,导入 globals.css 样式表,将样式应用于应用程序中的每个页面和组件。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong> (3) 使用类</strong><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在安装了 Tailwind CSS 并添加了全局样式后,可以在应用程序中使用 Tailwind 的实用程序类。示例:<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; export default () =&gt; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return &lt;h1 className="text-3xl font-bold underline"&gt;Hello, Next.js!&lt;/h1&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<h2>3. 部署(Deploying)</h2>
<p><br>&nbsp;&nbsp;&nbsp; 部署的含义是构建一个优化的可用于生产环境的 Web 应用程序版本,把这个版本部署实际的生成环境。这里的生产环境有如下几种:<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (1) 使用 Node.js 或 Docker 自托管 Next.js,并支持所有功能。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (2) 静态导出 HTML ,部署到第三方 Web 服务器,比如 Nigix、Apache 等,这种方式有些功能不能用。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (3) 将 Next.js 应用程序部署到 Vercel (https://vercel.com/new/clone)、AWS Copilot 等云服务商。</p>
<h3><br>&nbsp;&nbsp;&nbsp; 1) 构建 (Next build)</h3>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 构建生产版本,运行如下命令:<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $ npm run build&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 标准输出包括:<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (1) 使用 getStaticProps 或自动静态优化的页面的 HTML 文件<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (2) 全局样式或单独作用域样式的 CSS 文件<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (3) 用于从 Next.js 服务器预呈现动态内容的 JavaScript<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (4) 通过 React 在客户端进行交互的 JavaScript<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 输出生成的文件在 .next 文件夹中:<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .next/static/chunks/pages – 此文件夹中的每个 JavaScript 文件都与具有相同名称的路由相关。例如,.next/static/chunks/pages/about.js 将是在应用程序中查看 /about 路由时加载的 JavaScript 文件<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .next/static/media – 从 next/image 静态导入的图像被散列并复制到此处<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .next/static/css – 应用程序中所有页面的全局 css 文件<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .next/server/pages – 从服务器预渲染的 HTML 和 JavaScript 入口点。.nft.json 文件是在启用输出文件跟踪时创建的,包含依赖于给定页面的所有文件路径。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .next/server/chunks – 在整个应用程序的多个位置使用的共享 JavaScript 块<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .next/cache–next.js - 服务器的构建缓存和缓存图像、响应和页面的输出。使用缓存有助于减少构建时间并提高加载图像的性能<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 启动生产版本,运行如下命令:<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $ npm run start </p>
<h3><br>&nbsp;&nbsp;&nbsp; 2) 部署生产版本到 Docker 环境 </h3>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>(1) Docker 环境</strong><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IP 地址(本地测试环境):192.168.0.10 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 操作系统:Linux CentOS 7.9&nbsp;&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Linux 用户: docker (非 root 用户,有 sudo 权限) <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Docker 版本: 20.10.7<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Docker Compose 版本: 2.6.1<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注:Docker Compose 相关介绍,请参考 “Docker基础知识 (4) - Docker Compose”<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NodeJS 目录:/home/docker/nodejs<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将生产版本(运行过 npm run build 命令)的 nextjs-demo 目录整体复制到 /home/docker/nodejs 目录下,并修改 /home/docker/nodejs/nextjs-demo 目录及其子目录的读写权限,格式如下:<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $ chmod -R 777 /home/docker/nodejs/nextjs-demo<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong> (2) 创建 docker-compose.yml</strong><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在 /home/docker/nodejs/nextjs-demo 目录下,创建 docker-compose.yml 文件,内容如下: </p>
<div class="cnblogs_code">
<pre>                version: "3.7"

                services:
                  service_nodejs:
                        image: nodejs:16.20
                        restart: always
                        container_name: nodejs_service
                        ports:
                            - 3000:3000
                        networks:
                            - service-network
                        volumes:
                            - /home/docker/nodejs:/home/docker/nodejs:rw
                        working_dir: /home/docker/nodejs/nextjs-demo
                        entrypoint: ["npm", "start"]</pre>
</div>
<p><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>(3) 运行</strong><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $ cd /home/docker/nodejs/nextjs-demo&nbsp;&nbsp; # 进入 docker-compose.yml 所在目录<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 在后台运行<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $ docker-compose up -d&nbsp; &nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [+] Running 2/2<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ⠿ Network nextjs-demo_default&nbsp; Created&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0s<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ⠿ Container node_service&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Started&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.2s<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $ docker ps <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CONTAINER ID&nbsp;&nbsp; IMAGE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMMAND&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...&nbsp; PORTS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NAMES<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 507db5566b60&nbsp;&nbsp; node:16.20&nbsp;&nbsp; "npm start"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0.0.0:3000-&gt;3000/tcp, ...&nbsp;&nbsp; node_service&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用浏览器访问 http://192.168.0.10:3000, 显示 nextjs-demo 项目的 index 页面。<br><br><br></p><br><br>
来源:https://www.cnblogs.com/tkuang/p/17641647.html
頁: [1]
查看完整版本: NodeJS系列(12)- Next.js 框架 (五) | 样式 (Styling) 、部署(Deploying)