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> </p>
<h2>1. 系统环境</h2>
<p> 操作系统:CentOS 7.9 (x64)<br> NodeJS: 16.20.0<br> NPM: 8.19.4<br> NVM: 0.39.2<br> NextJS: 13.4.12<br><br></p>
<h2><br>2. 样式 (Styling)</h2>
<p> Next.js 支持如下的应用程序样式设置方式:<br> <br> (1) 全局 CSS:对于那些有传统 CSS 经验的人来说,使用起来很简单,也很熟悉,但随着应用程序的发展,可能会导致更大的 CSS 捆绑包和管理样式的困难。<br> (2) CSS 模块:创建本地作用域的 CSS 类,以避免命名冲突并提高可维护性。<br> (3) JS 中的 CSS:直接在 JavaScript 组件中嵌入 CSS,实现动态和范围化的样式。<br> (4) Sass:一个流行的 CSS 预处理器,它通过变量、嵌套规则和 mixin 等功能扩展 CSS。<br> (5) Tailwind CSS:一个实用程序优先的 CSS 框架,允许通过组成实用程序类来快速定制设计。</p>
<h3> 1) 全局 CSS</h3>
<p> 在 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> 全局 CSS,顾名思义,就要将该文件里 CSS 能应用于 nextjs-demo 项目里的全部页面和组件。 由于这种样式表的全局性,为了避免冲突,只能在 src/pages/_app.js 中导入它们。<br><br> 修改 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 }) =><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><Component {...pageProps} />
<span style="color: rgba(0, 0, 0, 1)"> )
}</span></pre>
</div>
<h3><br> <strong>2) CSS 模块</strong></h3>
<p> Next.js 内置支持使用 *.module.CSS 扩展名的 CSS 模块。<br> <br> CSS 模块通过自动创建一个唯一的类名来对 CSS 进行本地作用域。这允许您在不同的文件中使用相同的类名,而不用担心冲突。这种行为使 CSS 模块成为包含组件级 CSS 的理想方式。<br><br> 示例,一个可重用按钮组件,创建 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> 创建 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><<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>><span style="color: rgba(0, 0, 0, 1)">
Destroy
</span></button>
<span style="color: rgba(0, 0, 0, 1)"> )
} </span></pre>
</div>
<h3><br> <strong>3) JS 中的 CSS</strong></h3>
<p> 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> <p style={{ color: 'red' }}>Test Page</p>
<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> 我们捆绑样式的 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><div><span style="color: rgba(0, 0, 0, 1)">
Hello world
</span><p>scoped!</p>
<style jsx><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></style>
<style global jsx><span style="color: rgba(0, 0, 0, 1)">{`
body {
background: black;
}
`}</span></style>
</div>
<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> <strong>4) Sass</strong></h3>
<p> Next.js 内置了对 Sass 的支持,同时使用 .scs 和 .sas 扩展。可以通过 CSS 模块 和 .module.scssor.module.sess 扩展名使用组件级 Sass。 <br><br> 需要先安装 sass,命令如下:<br><br> $ npm install --save-dev sass <br><br> Sass 支持两种不同的语法,每种语法都有自己的扩展名。.sscs 扩展要求使用 scss 语法,而 .sass 扩展则要求使用缩进语法(“sass”)。 如果不确定该选择哪一个,可以从 .scs 扩展开始,它是 CSS 的超集,不需要学习缩进语法(“Sass”)。<br><br> <strong>(1) 自定义 Sass 选项</strong><br><br> 如果要配置 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> <br> <strong>(2) Sass 变量</strong><br><br> Next.js 支持从 CSS 模块文件导出的 Sass 变量。例如,使用导出的 primaryColor Sass 变量。<br><br> src/styles/variables.module.scss 文件,内容如下: </p>
<div class="cnblogs_code">
<pre> $primary-color: #64ff00;
:export {
primaryColor: $primary-color;
} </pre>
</div>
<p> </p>
<p> 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><Layout color={variables.primaryColor}>
<Component {...pageProps} />
</Layout>
<span style="color: rgba(0, 0, 0, 1)"> )
} </span></pre>
</div>
<h3><br> 5) Tailwind CSS</h3>
<p> Tailwind CSS 是一个实用程序优先的 CSS 框架,与 Next.js 配合得非常好。<br><br> 需要先安装 Tailwind CSS,命令如下:<br><br> $ npm install -D tailwindcss postcss autoprefixer<br> $ npx tailwindcss init -p<br><br> <strong>(1) 配置 Tailwind</strong> <br><br> 在 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> 不需要修改 postss.config.js。<br><br> <strong>(2) 导入样式</strong><br><br> 将 Tailwind CSS 指令添加到应用程序中的全局样式表中,修改 src/styles/globals.css 文件,添加如下内容:<br><br> @tailwind base;<br> @tailwind components;<br> @tailwind utilities;<br><br> 在 src/pages/_app.js中,导入 globals.css 样式表,将样式应用于应用程序中的每个页面和组件。<br><br> <strong> (3) 使用类</strong><br><br> 在安装了 Tailwind CSS 并添加了全局样式后,可以在应用程序中使用 Tailwind 的实用程序类。示例:<br><br> export default () => {<br> return <h1 className="text-3xl font-bold underline">Hello, Next.js!</h1><br> }</p>
<p> </p>
<h2>3. 部署(Deploying)</h2>
<p><br> 部署的含义是构建一个优化的可用于生产环境的 Web 应用程序版本,把这个版本部署实际的生成环境。这里的生产环境有如下几种:<br><br> (1) 使用 Node.js 或 Docker 自托管 Next.js,并支持所有功能。<br> (2) 静态导出 HTML ,部署到第三方 Web 服务器,比如 Nigix、Apache 等,这种方式有些功能不能用。<br> (3) 将 Next.js 应用程序部署到 Vercel (https://vercel.com/new/clone)、AWS Copilot 等云服务商。</p>
<h3><br> 1) 构建 (Next build)</h3>
<p> 构建生产版本,运行如下命令:<br><br> $ npm run build <br> <br> 标准输出包括:<br><br> (1) 使用 getStaticProps 或自动静态优化的页面的 HTML 文件<br> (2) 全局样式或单独作用域样式的 CSS 文件<br> (3) 用于从 Next.js 服务器预呈现动态内容的 JavaScript<br> (4) 通过 React 在客户端进行交互的 JavaScript<br><br> 输出生成的文件在 .next 文件夹中:<br><br> .next/static/chunks/pages – 此文件夹中的每个 JavaScript 文件都与具有相同名称的路由相关。例如,.next/static/chunks/pages/about.js 将是在应用程序中查看 /about 路由时加载的 JavaScript 文件<br> .next/static/media – 从 next/image 静态导入的图像被散列并复制到此处<br> .next/static/css – 应用程序中所有页面的全局 css 文件<br> .next/server/pages – 从服务器预渲染的 HTML 和 JavaScript 入口点。.nft.json 文件是在启用输出文件跟踪时创建的,包含依赖于给定页面的所有文件路径。<br> .next/server/chunks – 在整个应用程序的多个位置使用的共享 JavaScript 块<br> .next/cache–next.js - 服务器的构建缓存和缓存图像、响应和页面的输出。使用缓存有助于减少构建时间并提高加载图像的性能<br><br> 启动生产版本,运行如下命令:<br><br> $ npm run start </p>
<h3><br> 2) 部署生产版本到 Docker 环境 </h3>
<p> <strong>(1) Docker 环境</strong><br><br> IP 地址(本地测试环境):192.168.0.10 <br> 操作系统:Linux CentOS 7.9 <br> Linux 用户: docker (非 root 用户,有 sudo 权限) <br><br> Docker 版本: 20.10.7<br> Docker Compose 版本: 2.6.1<br><br> 注:Docker Compose 相关介绍,请参考 “Docker基础知识 (4) - Docker Compose”<br><br> NodeJS 目录:/home/docker/nodejs<br><br> 将生产版本(运行过 npm run build 命令)的 nextjs-demo 目录整体复制到 /home/docker/nodejs 目录下,并修改 /home/docker/nodejs/nextjs-demo 目录及其子目录的读写权限,格式如下:<br><br> $ chmod -R 777 /home/docker/nodejs/nextjs-demo<br><br> <strong> (2) 创建 docker-compose.yml</strong><br><br> 在 /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> <strong>(3) 运行</strong><br><br> $ cd /home/docker/nodejs/nextjs-demo # 进入 docker-compose.yml 所在目录<br><br> # 在后台运行<br> $ docker-compose up -d <br><br> [+] Running 2/2<br> ⠿ Network nextjs-demo_default Created 0.0s<br> ⠿ Container node_service Started 0.2s<br><br> $ docker ps <br><br> CONTAINER ID IMAGE COMMAND ... PORTS NAMES<br> 507db5566b60 node:16.20 "npm start" 0.0.0.0:3000->3000/tcp, ... node_service <br><br> 使用浏览器访问 http://192.168.0.10:3000, 显示 nextjs-demo 项目的 index 页面。<br><br><br></p><br><br>
来源:https://www.cnblogs.com/tkuang/p/17641647.html
頁:
[1]