Next.js 系统性教学:中间件与国际化功能深入剖析
更多有关Next.js教程,请查阅:
【目录】Next.js 独立开发系列教程-CSDN博客
目录
一、Next.js 中间件 (Middleware) 功能解析
1.1 什么是中间件?
1.2 Next.js 中间件的工作机制
1.3 中间件的功能应用
身份验证与授权
请求重定向
修改请求和响应
1.4 使用场景
二、Next.js 国际化 (Internationalization) 功能解析
2.1 什么是国际化?
2.2 Next.js 中的国际化配置
2.3 动态页面内容的国际化
2.4 使用 useRouter 获取当前语言
2.5 国际化页面的优化
三、中间件与国际化的结合使用
四、总结
在构建现代 Web 应用时,开发者往往需要处理许多复杂的功能,如 中间件 和 国际化。这些功能不仅能增强应用的灵活性,还能改善用户体验。Next.js 提供了强大的中间件功能和国际化支持,帮助开发者轻松应对这些挑战。本文将通过详细的实例,讲解如何在 Next.js 中实现中间件和国际化,从而提升应用的功能性和可用性。
一、Next.js 中间件 (Middleware) 功能解析
1.1 什么是中间件?
在 Web 开发中,中间件是指在请求和响应之间执行的代码,通常用于:
- 身份验证
- 路由保护
- 请求重定向
- 数据处理
Next.js 中的中间件可以拦截和修改 HTTP 请求、响应,并在这些请求响应流经过前端和后端时进行操作。
1.2 Next.js 中间件的工作机制
Next.js 通过 middleware.js
或 middleware.ts
文件来定义中间件。在 app
目录中,放置一个名为 middleware.js
的文件就可以定义一个全局的中间件,作用于所有请求。中间件是基于运行时 API 定义的,它可以拦截请求、修改请求响应内容、重定向到其他页面等。
目录结构示例:
app/
├── middleware.js
├── dashboard/
│ ├── page.js
在 middleware.js
中,我们可以设置拦截逻辑。例如,检查用户是否登录,未登录时重定向到登录页:
import { NextResponse } from 'next/server';export function middleware(request) {// 检查请求头中的认证信息const token = request.cookies.get('auth-token');if (!token) {// 如果没有 token,重定向到登录页面return NextResponse.redirect('/login');}return NextResponse.next();
}
1.3 中间件的功能应用
身份验证与授权
最常见的中间件使用场景是 身份验证。例如,只有登录的用户才能访问仪表板页面。通过检查用户的 token 或认证信息,我们可以在用户未登录时强制跳转到登录页面。
export function middleware(request) {const token = request.cookies.get('auth-token');if (!token) {return NextResponse.redirect('/login');}return NextResponse.next();
}
请求重定向
中间件还可以用于基于用户的请求信息进行 URL 重定向。例如,在某些条件下,你可能希望将用户引导到其他页面:
export function middleware(request) {if (request.url.includes('old-page')) {return NextResponse.redirect('/new-page');}return NextResponse.next();
}
修改请求和响应
中间件不仅可以修改请求,还能通过 NextResponse
修改响应数据。例如,你可以在响应头中添加自定义的头信息,或者修改返回的内容。
export function middleware(request) {const response = NextResponse.next();response.headers.set('X-Custom-Header', 'CustomValue');return response;
}
1.4 使用场景
- 身份验证和授权:通过验证用户的登录状态来控制访问权限。
- 请求日志记录:记录每个请求的路径、用户代理等信息,用于审计和分析。
- 重定向:根据不同条件将用户重定向到指定页面。
二、Next.js 国际化 (Internationalization) 功能解析
2.1 什么是国际化?
国际化(Internationalization,简称 i18n)是指使应用能够支持多种语言和地区的功能。随着全球化进程的发展,支持多语言的网站和应用程序变得越来越重要。Next.js 提供了内置的国际化支持,允许开发者轻松地为应用添加多语言支持。
2.2 Next.js 中的国际化配置
在 Next.js 中,国际化的配置可以通过 next.config.js
文件进行定义。在配置中,你可以指定支持的语言列表、默认语言、以及如何处理不同语言的请求。
配置示例:
module.exports = {i18n: {locales: ['en', 'fr', 'de'],defaultLocale: 'en',},
};
上面的配置表示:
- 支持英语(
en
)、法语(fr
)、德语(de
)三种语言。 - 默认语言为英语。
2.3 动态页面内容的国际化
Next.js 提供了基于路由的自动语言切换功能,开发者只需要根据当前的语言设置动态渲染页面内容。为了实现这一点,可以通过 next-translate
插件,或者直接使用 useRouter
和 getStaticProps
/ getServerSideProps
来加载不同语言的数据。
使用 next-translate
插件:
首先,在项目中安装 next-translate
插件:
npm install next-translate
然后,配置翻译文件。你可以在 locales
文件夹中为每种语言创建 JSON 文件,如 en.json
、fr.json
和 de.json
。
示例:
locales/en.json
:
{"greeting": "Hello, welcome to our site!"
}
locales/fr.json
:
{"greeting": "Bonjour, bienvenue sur notre site!"
}
然后,在页面中引用翻译内容:
import useTranslation from 'next-translate/useTranslation';export default function HomePage() {const { t } = useTranslation();return <h1>{t('greeting')}</h1>;
}
2.4 使用 useRouter
获取当前语言
你也可以通过 useRouter
钩子来获取当前的语言,并根据语言加载相应的内容。例如:
import { useRouter } from 'next/router';export default function HomePage() {const { locale } = useRouter();const greeting = locale === 'fr' ? 'Bonjour' : 'Hello';return <h1>{greeting}, welcome to our site!</h1>;
}
2.5 国际化页面的优化
为了提高国际化页面的性能,Next.js 提供了 静态生成 (Static Generation) 和 服务器端渲染 (SSR) 的方式,可以根据不同的语言生成静态文件或动态请求页面内容。
使用 getStaticProps
实现静态生成:
export async function getStaticProps({ locale }) {const greeting = locale === 'fr' ? 'Bonjour' : 'Hello';return {props: { greeting },};
}
三、中间件与国际化的结合使用
Next.js 的中间件和国际化功能可以结合使用,以便在处理请求时基于用户的语言选择进行定制化的响应。例如,可以根据请求的语言来决定是否将用户重定向到对应语言的页面:
import { NextResponse } from 'next/server';export function middleware(request) {const { locale } = request.nextUrl;if (!locale || locale === 'en') {return NextResponse.redirect('/en/home');}return NextResponse.next();
}
通过结合这两种强大功能,你可以根据不同的语言和区域定制用户的请求响应,使应用具有更高的灵活性和用户友好性。
四、总结
- 中间件 允许你在请求和响应之间进行拦截,处理认证、重定向、修改请求内容等操作,极大地提高了应用的灵活性和安全性。
- 国际化 支持多语言和地区的需求,Next.js 提供了内置的 i18n 支持,可以让你轻松处理多语言站点的开发。
- 结合使用中间件与国际化功能,开发者可以实现更加个性化、国际化和高效的用户体验。
通过深入了解和应用这些 Next.js 功能,你将能够构建更强大、更具全球化视野的 Web 应用。
更多有关Next.js教程,请查阅:
【目录】Next.js 独立开发系列教程-CSDN博客
相关文章:
Next.js 系统性教学:中间件与国际化功能深入剖析
更多有关Next.js教程,请查阅: 【目录】Next.js 独立开发系列教程-CSDN博客 目录 一、Next.js 中间件 (Middleware) 功能解析 1.1 什么是中间件? 1.2 Next.js 中间件的工作机制 1.3 中间件的功能应用 身份验证与授权 请求重定向 修改请…...
openWebUI+ollamawindows+不用docker+webLite本地安装
openWebUI & ollama & windows & 不用docker & webLite 本地安装 总结一下安装教程 10核CPU16G内存 两个web框架都可以,先说简单的 ollama-webui-lite(https://github.com/ollama-webui/ollama-webui-lite) 轻量级,只使用nodejs 先装…...
动态规划——机器分配、01背包问题
一、机器分配 题目名称:机器分配 题目描述: 总公司拥有高效设备M台,准备分给下属的N个分公司。 各分公司若获得这些设备,可以为国家提供一定的盈利。 问:如何分配这M台设备才能使国家得到的盈利最大?求出最…...
leetcode——哈希表1
242.有效的字母异位词 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的 字母异位词 。 示例 1: 输入: s "anagram", t "nagaram" 输出: true示例 2: 输入: s "rat", t "car" 输出: false 提示: 1 < s.le…...
STM32+模拟或硬件IIC+SHT20驱动问题:接上拉电阻、BUSY死锁?
主要问题: 1,使用STM32F103C8T6,模拟IIC,SCL和SDA口配置为推挽输出上拉,主要是SDA脚,每次都要输出输入模式重新配置,虽然也能通信,但不稳定,出错率大; 2&…...
Android四大组件——Activity(二)
一、Activity之间传递消息 在(一)中,我们把数据作为独立的键值对进行传递,那么现在把多条数据打包成一个对象进行传递: 1.假设有一个User类的对象,我们先使用putExtra进行传递 activity_demo06.xml <…...
PHP实现华为OBS存储
一:华为OBS存储文档地址 官方文档:https://support.huaweicloud.com/obs/index.html github地址:https://github.com/huaweicloud/huaweicloud-sdk-php-obs 二:安装华为OBS拓展 composer require obs/esdk-obs-php 三&#x…...
SQL连续登录问题(详细案例分析)
如果要统计用户活跃度,那就涉及连续登录问题,接下来将举一个简单的例子来详细说明这个问题: 一、创建一些模拟数据 一些测试数据如下: deviceid1,2022-10-26,2022-10-26,2022-11-01 deviceid1,2022-10-26,2022-11-03,2022-11-0…...
OpenCV相机标定与3D重建(9)相机标定函数calibrateCameraRO()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::calibrateCameraRO 是 OpenCV 中用于相机标定的函数,它允许固定某些点来进行更精确的标定。 函数原型 double cv::calibrateCa…...
【一本通】农场派对
【一本通】农场派对 💐The Begin💐点点关注,收藏不迷路💐 N头牛要去参加一场在编号为x(1≤x≤n)的牛的农场举行的派对(1≤N≤1000),有M(1≤m≤100000)条有向道路,每条路长ti(1≤ti≤100);每头牛…...
uniapp中父组件传参到子组件页面渲染不生效问题处理实战记录
上篇文件介绍了,父组件数据更新正常但是页面渲染不生效的问题,详情可以看下:uniapp中父组件数组更新后与页面渲染数组不一致实战记录 本文在此基础上由于新增需求衍生出新的问题.本文只记录一下解决思路. 下面说下新增需求方便理解场景: 商品信息设置中添加抽奖概率设置…...
基础暴力算法
线性枚举 线性枚举(Linear Enumeration)是一种暴力枚举的方法,它逐一检查每个可能的解,适用于搜索和枚举问题。 其核心思路是:对问题的所有可能情况逐一进行遍历,并针对每种情况判断是否满足条件…...
【复变函数】三、复变函数的积分
目录 1. 复变函数积分1.1. 复积分1.2. 存在性与计算1.2.1 第二类曲线积分与格林公式1.2.2 第一类曲线积分与参数式 1.3. 性质1.4. 圆径积分 2. 柯西积分定理2.1. 柯西(Cauchy)基本定理与莫雷拉(Morrera)定理2.2. 复合闭路定理2.3.…...
ChatGPT Pro是什么
ChatGPT Pro 和 ChatGPT Plus 的区别主要体现在功能范围、适用场景和目标用户上。 ChatGPT Plus 功能 • 价格:20美元/月。 • 目标用户:针对个人用户设计。 • 主要特点: • 在高峰期响应速度更快。 • 使用高级模型(如 GPT-4…...
React - echarts 世界地图,中国地图绘制
中国地图 首先需要一个包含中国所有省份名称的 json,这个好多网站都能找到。 我传到资源里了,放百度网盘怕太长时间不登录给我删掉了。 中国地图中文版json 我把地图抽出来单独做成了组件,这样用的时候比较方便. 使用的时候: …...
knife4j-openapi3 4.5 最基本的使用 openAPI
最基本的使用,配置太多懒得研究 SpringBoot 整合 knfe4j ,使用 OpenAPI3 规范,这个兄弟写的挺好 环境: spring-boot-starter-parent:3.4.0 1. 依赖 <dependency><groupId>com.github.xiaoymin</gr…...
如何在 Ubuntu 22.04 上安装和使用 Apache Kafka
简介 Apache Kafka是一个高性能、低延迟的分布式流处理平台,广泛用于构建实时数据管道和流式应用。本文将指导你如何在Ubuntu 22.04系统上快速部署Apache Kafka,让你体验到Kafka在处理大规模实时数据流方面的强大能力。通过本教程,你将学会如…...
Linux:network:添加ip的时候自动添加一个本地路由
文章目录 问题问题 最近在看一个路由的问题,顺便看内核代码,发现在添加IP的时候,内核会自动添加一个local route。 net/ipv4/devinet.c inet_rtm_newaddr->__inet_insert_ifa /* Send message first, then call notifier.Notifier will trigger FIB update, so thatlis…...
Android 10、11、12存储适配相关
AndroidQ(10)分区存储完美适配 - 简书前言 最近时间在做AndroidQ的适配,截止到今天AndroidQ分区存储适配完成,期间出现很多坑,目前网上的帖子大部分都是概述变更内容,接下来的几篇帖子都是对分区存储实际...https://www.jianshu.c…...
如何将视频转化为音频?五个方法策略
在日常生活中,我们经常需要将视频中的音频提取出来,以便在特定的场合使用。无论是为了制作铃声、背景音乐,还是为了进行语音转文字处理,视频转音频的需求都非常普遍。如何将视频转化为音频?本文将详细介绍多种将视频转…...
ecovadis评估最新标准
EcoVadis评估的最新标准主要包括奖牌评估规则和新增的徽章规则,以下是对这两方面的详细阐述: 一、奖牌评估规则 评估范围:EcoVadis的评估总分为100分,评估内容涵盖环境、劳工与人权、商业道德、可持续采购等四大主题。 奖牌等级…...
Java版-图论-最小生成树-Kruskal算法
实现描述 为了造出一棵最小生成树,我们从最小边权的边开始,按边权从小到大依次加入,如果某次加边产生了环,就扔掉这条边,直到加入了 n-1 条边,即形成了一棵树。 实现代码 首选我们对所有的边,…...
【单片机开发】MCU三种启动方式(Boot选择)[主Flash/系统存储器(BootLoader)/嵌入式SRAM]
目录 参考资料: 利用 Boot 选择不同的启动方式: 单片机的存储结构(主 FLASH/系统存储器/嵌入式 SRAM): 1. Cortex-M 内核芯片——启动原理: 1.1. 启动流程: 1.2. 根据单片机的存储器映射和架构图:启动…...
实验15 验证LSTM模型的长程依赖
本次实验依托上个实验 一 模型构建 创建LSTM模型,里面包括初始化init函数、初始化权重函数_init_weights、初始化状态函数init_state、前向传播函数forward。 init函数:虽然每个时间的输入和隐层都是一样的,但是他们会有四组不同的权重&am…...
Charles功能说明
1.扫把(clear the current Session) (前头方向) 作用:清除所有抓取的包(正方形框) 2.中心圈-未启用显示(Star Recording)点击启动 -启动之后显示(Stop Recording)点击停止 作用:启动之后开始抓取包(刷新一次页面或跳转抓取内容) 3.锁-未启动显示(Star SSL Proxying)点击启动 -启…...
自动秒收录程序与自动秒收录网站源码论坛版本下载
自动秒收录程序与自动秒收录网站源码论坛版本下载 随着互联网的快速发展,网站优化已成为众多企业和个人博主提升在线影响力的关键手段。其中,SEO(搜索引擎优化)作为提升网站排名的核心策略,备受关注。而SEO优化的一个…...
HTML颜色-HTML脚本
HTML脚本 js使得HTML页面具有更强的动态和交互性 HTML<script>标签 标签用于定义客户端脚本,比如javascript 可包含脚本语句,也可以通过src属性指向外部的脚本文件 JavaScript最常用于图片操作,表单验证以及动态的内容更新 HTML<n…...
【WRF理论第十三期】详细介绍 Registry 的作用、结构和内容
目录 1. Introduction:介绍 Registry 的作用和功能。2. Registry Contents:详细描述 Registry 的结构和内容,包括各个部分的条目类型。2.1. DIMSPEC ENTRIES(维度规格条目)2.2. STATE ENTRIES(状态变量条目…...
使用Kimi开发自己的问答应用
概述 Kimi是大家常用的一个人工智能助手,本文使用Kimi开发文档,以node作为后端,开发与一个问答系统 实现效果 Kimi简介 Kimi是由Moonshot AI开发的人工智能助手,擅长中文和英文对话。目标是帮助用户解决问题、提供信息和执行任…...
Vue前端开发-路由其他配置
在路由文件中,除了跳转配置外,还可以进行路径重定向配置,如果没有找到对应的地址,还可以实现404的配置,同时,如果某个页面需要权限登录,还可以进行路由守卫配置,接下来,分…...
AI与遥感的融合:构建新一代智能监测作业平台
在测绘地理信息与遥感领域,人工智能(AI)技术的融合正推动着一场监测作业模式的革命。AI不仅提升了数据处理的效率,还极大地扩展了遥感技术的应用范围和深度。 遥感监测的智能化趋势 随着遥感数据量的激增,传统的人工…...
3D 视觉定位技术:汽车零部件制造的智能变革引擎
在汽车零部件制造领域,传统工艺正面临着前所未有的挑战。市场对于零部件精度与生产效率近乎苛刻的要求,促使企业寻求突破之道。而 3D 视觉定位技术,为汽车零部件制造开启了精准定位与智能化生产的新纪元。 3D 视觉定位系统的核心技术原理 3…...
git提交时出现merge branch main of xxx
git提交时出现merge branch main of xxx 原因: 1、同事commit了一个修改A,push到remote 2、我把这个修改直接pull了下来(pull是fetchmerge的操作,自动合并到本地workspace) 3、同事因为后续的commit有冲突,…...
重生之我在异世界学编程之C语言:深入结构体篇(上)
大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 本文目录 引言正文《1》 结构体的两种声明一、结构…...
到达率和服务率在python中实现
到达率和服务率在python中实现 概念理解 到达率(Arrival Rate):是指顾客(或任务、事件等)到达服务系统的平均速率,通常用单位时间内到达的数量来表示。例如,在一个客服中心,每小时平均有10个客户来电咨询,这里的每小时10个客户就是到达率。服务率(Service Rate):是…...
重视猫艾滋:宠物健康的隐秘挑战
猫艾滋,全称为猫获得性免疫缺陷综合征(Feline Acquired Immunodeficiency Syndrome),是由猫免疫缺陷病毒(FIV)感染引起的一种严重危害猫类健康的疾病。虽然其名称与人类艾滋病相似,但猫艾滋仅在…...
使用长轮询解决某些场景的实时消息推送需求
需求来源 最近做一个需求实现在移动端通过按钮,远程控制大屏幕上展示的资源进行实时切换,可以展示一个大屏页面,可以展示一段视频,也可以展示一张图片。 解决思路 大屏幕上打开一个游览器,访问指定动态资源展示页面…...
uniapp-内部项目使用文档
uniapp-内部项目使用文档 目录 uniapp-内部项目使用文档阶段1自行实现内容:阶段1问题记录: 阶段2自行实现内容: 阶段3 APP项目介绍及规范阶段4 公共组件方法UseList 列表页面HooksListItem 列表项uni-load-more 列表加载更多组件CardTitle 列…...
linux搭建NFS服务和autofs自动挂载NFS
文章目录 1、nfs服务1、nfs原理2、RPC和NFS通讯原理3、RPC和NFS流程4、NFS工作流程5、服务端搭建6、客户端搭建7、autofs自动挂载 1、nfs服务 1、nfs原理 是一个NAS的存储,通过网络来进行文件的共享,表现出来的形式就是一个文件夹 可以支持多个linux挂…...
springboot415社区网格化管理平台的构建-(论文+源码)_kaic
摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本社区网格化管理平台就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据…...
ubuntu下open-webui + ollama本地大模型部署
文章目录 nvidia gpu驱动安装 安装卸载 ollama 部署 添加docker秘钥docker配置添加国内镜像源ollama安装 从源拉取ollama镜像。启动一个ollama容器 通过ollama下载模型到本地检验本地模型 open-webui 部署 安装容器和镜像下载webui使用查看模型运行时内存、cpu、gpu占用 业余…...
自动化运维-配置Mysql、emqx、redis、nginx等通用性Linux日志分割工具 - logrotate
前言:logrotate 是一个在 Linux 系统中用于管理和轮转日志文件的工具。它的主要目的是帮助系统管理员自动执行日志文件的轮转、压缩、删除和邮件通知等任务,以防止日志文件占用过多的磁盘空间,同时保持日志文件的可管理性。 参考命令&#x…...
71、docker镜像制作上传/下载到阿里云
基本思想:简单学习一下如何制作镜像和上传下载到私有阿里云,然后构建一个gpu的训练/推理环境,以备后续使用 一、配置环境 ubuntu@ubuntu:~$ sudo apt-get install docker.ioubuntu@ubuntu:~$ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS P…...
力扣--LCR 178.训练计划VI
题目 教学过程中,教练示范一次,学员跟做三次。该过程被混乱剪辑后,记录于数组 actions,其中 actions[i] 表示做出该动作的人员编号。请返回教练的编号。 示例 1: 输入:actions [5, 7, 5, 5] 输出&#…...
独孤思维:又有一个副业项目降价了
不要过早量出底牌,不然会变得低贱且廉价。 昨天在一个群里,看到有个博主,没有成交订单。 她把和用户的聊天对话发出来,我们大致看了下。 发现人家是有意向付费的。 但是这个博主过于心急,说今天加入可以优惠&#…...
【笔记】分布式任务调度平台XXL-JOB
这篇笔记主要记录以下内容: (1)第一次启动xxl-job的过程 (2)模块、文件、数据库(表和字段)的作用 (3)极少的源码解读(XxlJobConfig) 有点像实…...
Java基础总结上(Ref:JavaGuide)
基础概念与常识 Java语言有哪些特点,优点? 简单易学,是一门面向对象的语言,有封装继承多态三大特性,而且有多重防护机制保证安全性,例如权限修饰符,限制程序直接访问操作系统资源。通过JIT编译…...
嘉誉府5区共有产权看房记
特地工作日来看下嘉誉府5区的网红共有产权的房子,主要是冲着均价2.1万/平才来看。说实话从塘尾地铁步行到嘉誉府5区还挺需要时间的哈。可能以后需要电驴代步到地铁?确实楼盘现在是现楼,今年买明年住。鸿荣源确实很666哈。 今天来不需要排队&a…...
PostgreSQL函数中使用now()或current_timestamp的异同
在PostgreSQL函数中使用now()或current_timestamp可以获取当前的日期和时间。 now()函数返回当前的日期和时间,包括时区信息。它可以用于记录操作的时间戳或在查询中进行时间比较。 current_timestamp函数也返回当前的日期和时间,但不包括时区信息。它…...
跟李笑来学美式俚语(Most Common American Idioms): Part 56
Most Common American Idioms: Part 56 前言 本文是学习李笑来的Most Common American Idioms这本书的学习笔记,自用。 Github仓库链接:https://github.com/xiaolai/most-common-american-idioms 使用方法: 直接下载下来(或者clone到本地…...