使用 Layers 扩展你的 Nuxt4 应用

news2025/7/13 22:56:35

面对一个臃肿的页面或项目,你会如何简化重构、扩展它?

当单个 Vue 文件中界面/业务足够多时,通常我们会把它拆分成多个 componentscomposables 来引入,以此来减少此文件复杂度和增加可维护性。

当一个项目的界面/业务逻辑足够多时,我们会在全局抽离一部分组件和逻辑,在不同的业务逻辑中复用。或者把和业务解耦的组件或工具函数甚至固定业务逻辑发布为 npm 包来使用,进一步减少项目中的代码复杂度。

当存在多个项目,而项目之间又存在相同业务时,我们可能会把具有完整功能的一部分逻辑抽离成独立的项目。同时多个项目的 UI组件库和通用逻辑层也发布为 npm 包,供所有项目下载使用以保持统一的视觉效果和减少重复代码的编写。这样当一个新的项目出现,需要利用其他已有的业务逻辑或者是完全复用其他项目的页面和功能时,我们可以使用 iframe 或沙箱来加载这个独立的项目。这样多团队可以维护自己的业务项目,同时又能避免开发重复的功能。

那么在 Nuxt 里的如何优雅的解决这些问题呢?

除了上述的任何框架的项目都能操作的方式,Nuxt 还有自己独特的扩展方式:Layer

Layer 可以解决什么问题

Layer 几乎就是一个完整的 Nuxt 项目。

开发了一个 Layer,意味着 Layer 中的组件、函数、接口、依赖包等都会继承了此 Layer 的项目应用。

它不是一个最新版本才有的功能,但官方的文档的介绍十分简单,可能是因为它还在不断的完善中,官方也不希望你用于生产环境中。

一个 Nuxt4 应用的最简目录结构是这样的:


├── README.md

├── **app**

│   ├── app.config.ts

│   ├── app.vue

│   └── **pages**

│       └── index.vue

├── nuxt.config.ts

├── package.json

├── pnpm-lock.yaml

├── **public**

│   ├── favicon.ico

│   └── robots.txt

├── **server**

│   └── tsconfig.json

└── tsconfig.json

而一个 Layer 模板的目录结构是这样的:

├── .editorconfig

├── .gitignore

├── .npmrc

├── .nuxtrc

├── .playground

│   ├── app.config.ts

│   └── nuxt.config.ts

├── README.md

├── app.config.ts

├── app.vue

├── components

│   └── HelloWorld.vue

├── eslint.config.js

├── nuxt.config.ts

├── package.json

├── pnpm-lock.yaml

└── tsconfig.json

可以看到,会用 Nuxt 就会写 Layer,无需引入其他负担即可扩展

开发一个 Nuxt4 应用时,我们会在 app 目录下开发各种 pagescomponentscomposablesutils,会在 app.config.ts 里设置一些全局配置项。

需要接口支持时,可以在 server 目录下借助 Nitro 的生态来完成后端服务。

但是当项目开始变得臃肿时,Layer 可以发挥什么作用呢。

场景1:我的网站有一个登录注册权限校验相关的逻辑,这肯定会涉及到一些页面、组件、结构,比如登录页、注册页、登录按钮、登录注册接口等等。

一开始我没打算把它们抽离出去,因为网站还很小,并且只有一个。但是我很清楚这一部分功能和组件是可以被复用的。只要我再创建一个 nuxt 应用,我可以肯定我会来这个项目里复制一遍代码而不是重新敲一遍。

由于既涉及到前端组件又涉及到后端接口,以及一部分公共函数。我难道要把 Vue 的组件发布成一个 npm 包,把公共函数发布一个 npm 包,再把这部分后端接口重新起一个服务吗?

在一个全栈框架里这样做显然是有点繁琐。

假设 2:有一个付费网站,但它有一部分是免费的,付费内容也是分 vip、svip,如果全都写在一个项目里的话当然可以实现,毕竟用户也不关心你代码是怎么写的,只要能提供稳定的服务就可以了。

如果两个、三个网站呢?

如果是卖给客户源码呢?

如果是把免费内容开源,付费内容闭源,或是后续再把 vip 的逻辑开源呢?

假设 3:有一个基于 Nuxt 的开源博客站,如何设计一套机制,可以让其他用户用上自己喜欢的主题呢,毕竟博客最重要的就是换皮。

针对不同场景的解决方案

如果场景 1,前期 Layer 可以直接在 Nuxt4 应用里使用,像是这样:

app
	auth
		pages
		conmponents
		composables
		utils
		server
		nuxt.config.ts
	components
	composables
	utils
	app.config.ts
nuxt.config.ts

Nuxt3 中,这个 auth 可以放在 ~/layers
Nuxt3.12.0 以后的版本都会自动注册Layers

app 目录下,可以新建一个 {layer_name} 目录,目录内的结构和 Nuxt3 是一致的。

nuxt.config.ts 中只需要 extend 即可。

extend: [ 'app/auth' ]

这样,我们把权限校验相关的组件、接口、utils 都挪到了一个 auth layer 下管理。如果业务没能继续发展,一个仓库非常好管理,同时按文件夹划分后,结构十分清晰。

这样可能感受还不是很强烈。

因为只是目录结构上的分层。这一层相关的依赖 nuxt/auth 还是安装在了主项目内,但 nuxt-auth 已经是在 app/auth/nuxt.config.ts 里了,要知道,如果你用了一些 nuxt modules 之后,nuxt.config.ts 很容易变成一大坨!因为他们都是在这一个文件内配置。

但 Layer 可以随时分离出去,因为它就是一个完整的 Nuxt 应用,所以迁移几乎没有额外成本

当决定把这一部分代码迁移出去时

可以直接使用官方的 layer 模板再新建一个项目 zc-auth-layer,这个模板有一个好处,内置了 .playground ,顾名思义,是一个用来模拟你的主项目的 Nuxt 应用

Layer 的实际内容(红框)都写在根目录 的123下,playground (绿框)里用来做调试和开发

起初我没有用这个模板,而是单纯的新建一个 Nuxt 应用,但很快就发现了问题。Pages 会直接把主项目的 Pages 直接给覆盖掉,而且(暂时)还没发现如何忽略某个目录的覆盖,但这是一个显而易见的问题,应该会很快完善或者被我发现。

而有了 playground 之后,可以放心的里面写页面或是发展成一个独立的项目,又不影响外层供给其他项目继承。

这就是一个普普通通的 Nuxt4 应用!

而其他项目如果想使用它的仓库,只需要配置:

extends: [ ['github:aatrooox/zc-auth-layer', { install: true }] ]

也可以它发布后的 npm 包

// 直接使用npm 包
extends: [ 'zc-auth-layer' ]
// 某个组织下的包
extends: [ '@zzaoclub/zc-auth-layer']

就像是在项目中使用其他 componentsserver api 一样!

甚至还拥有完整的自动导入和 TS 类型提示,这你能受得了吗?

依赖关系是这样的,A extend B , B extend C ,C 拥有最高的优先级,向下覆盖。

所以哪怕是 B Layer 中只包含了一部分你需要的接口、组件,你也可以很轻松的再 extend 一个 D Layer,用来重写你不需要的逻辑。

比如 B C 都是支付层,B 是支付宝支付,C 是微信支付。

在主项目中使用 /api/order/pay 接口。继承了 B 层时,调用此接口就是支付宝支付,继承 C 后就是微信支付。

亦或是 B 的接口是 /api/order/pay/zfb ,C 的接口是 /api/order/pay/wx,主项目中的接口就可以用来自由控制使用哪种支付方式时调起对应的接口。

对于自己的项目来说,这种分层方式,可以让你更加自由的控制代码开源程度以及自己多项目复用逻辑。

对于出售源码时,也只需要出售对应层的代码,组合起来即可。

对解决博客换主题的功能,更是不能再适合了,只要按开发的博客时使用的 Components,组件名一一对应就可以了

当然,如果实际应用到项目上,还有类似数据库、多环境等问题需要仔细斟酌

但 Layer 的分层结构已经显而易见的更简单、更直接,开发体验也更好了。

潜在的问题

对于简单的前端项目,或是不涉及复杂的数据库架构,Layer 的方式无疑是更优雅的。

既在文件结构上解耦了,同时继承(覆盖)时也很直接。

但如果涉及到多个接口服务,或是多个数据库服务,甚至前端业务也比较复杂。还要是仔细测试其兼容性。

毕竟虽然使用 Layer 在文件结构上分开的,但实际打包后是在同一个 Nuxt 服务里的,并不是类似微服务的那种形式。

话说回来,大部分使用者应该只是看中了 SSR 能力,可能不会使用 Nitro 构建大型的应用,尤其是对于公司来说,也不太信任 Node 的服务能力。

所以对于个人开发者来说,我觉得 Layer 是个锦上添花的利器。因为大部分业务不会太复杂,而且偏前端更多一些。自己封装好的各种功能的 Layer 信手拈来,开发效率大大提高,还不耽误二次开发。

于是我在给自己的博客尝试增加了一个权限层 auth layer 后,才写下了这篇文章。

期待后续 Layer 的大放异彩。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2323378.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Excel处理控件Aspose.Cells指南:如何在不使用 Microsoft Excel 的情况下解锁 Excel 工作表

Microsoft Excel 允许用户使用密码保护工作表,以防止未经授权的更改。但是,在某些情况下,您可能需要在不使用 Microsoft Excel 的情况下解锁 Excel 工作表。在本指南中,我们将探讨解锁 Excel 工作表的不同方法,例如使用…

进军场景智能体,云迹机器人又快了一步

(图片来源:Pixels) 2025年,AI和机器人行业都发生了巨大改变。 数科星球原创 作者丨苑晶 编辑丨大兔 2025年,酒店行业正掀起一股批量采购具备AI功能的软硬一体解决方案的热潮。 在DeepSeek、Manus等国产AI软件的推动…

PHP 应用SQL 注入符号拼接请求方法HTTP 头JSON编码类

#PHP-MYSQL- 数据请求类型 SQL 语句由于在黑盒中是无法预知写法的, SQL 注入能发成功是需要拼接原 SQL 语句, 大部分黑盒能做的就是分析后各种尝试去判断,所以有可能有注入但可能出现无法注入成 功的情况。究其原因大部分都是原 SQL …

【React】基础版React + Redux实现教程,自定义redux库,Redux Toolkit教程

本项目是一个在react中,使用 redux 管理状态的基础版实现教程,用简单的案例练习redux的使用,旨在帮助学习 redux 的状态管理机制,包括 store、action、reducer、dispatch 等核心概念。 项目地址:https://github.com/Yv…

23种设计模式-适配器(Adapter)设计模式

适配器设计模式 🚩什么是适配器设计模式?🚩适配器设计模式的特点🚩适配器设计模式的结构🚩适配器设计模式的优缺点🚩适配器设计模式的Java实现🚩代码总结🚩总结 🚩什么是…

debug 笔记:llama 3.2 部署bug 之cutlassF: no kernel found to launch!

1 问题描述 按照官方的写法 import torch from transformers import pipeline import os os.environ["HF_TOKEN"] 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 model_id "meta-llama/Llama-3.2-3B"pipe pipeline("text-generation", modelmode…

TCP的长连接和短连接,以及它们分别适用于什么场合

TCP长连接与短连接详解 一、核心概念对比 特性长连接(Persistent Connection)短连接(Short-lived Connection)连接生命周期一次建立后长期保持,多次数据交互复用同一连接每次数据交互均需新建连接,完成后…

【操作系统】(五)操作系统引导(Boot)

视频参考:王道计算机2.了解计算机的启动过程和主引导扇区,让你的计算机从这里起飞吧_哔哩哔哩_bilibili 操作系统引导(Boot)就是在开机的时候,如何让操作系统运行起来? 主存分成RAM小部分ROM,其中ROM里面存放的是BIOS&#xff08…

蓝桥与力扣刷题(蓝桥 山)

题目:这天小明正在学数数。 他突然发现有些止整数的形状像一挫 “山”, 比㓚 123565321、145541123565321、145541, 它 们左右对称 (回文) 且数位上的数字先单调不减, 后单调不增。 小朋数了衣久也没有数完, 他惒让你告诉他在区间 [2022,2022222022] 中有 多少个数…

场馆预约小程序的设计与实现

摘 要 时代在进步,人们对日常生活质量的要求不再受限于衣食住行。现代人不仅想要一个健康的身体,还想拥有一身宛如黄金比例的身材。但是人们平常除了上下班和上下学的时间,其余空余时间寥寥无几,所以我们需要用体育场馆预约来节省…

Pytorch学习笔记(十二)Learning PyTorch - NLP from Scratch

这篇博客瞄准的是 pytorch 官方教程中 Learning PyTorch 章节的 NLP from Scratch 部分。 官网链接:https://pytorch.org/tutorials/intermediate/nlp_from_scratch_index.html 完整网盘链接: https://pan.baidu.com/s/1L9PVZ-KRDGVER-AJnXOvlQ?pwdaa2m 提取码: …

Axure项目实战:智慧运输平台后台管理端-母版、登录(文本框高级交互)

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! 课程主题:智慧运输平台后台管理端 主要内容:母版、登录页制作 应用场景:母版、登录、注册、密码找回 案例展示: 案例视频…

时序数据库 InfluxDB(一)

时序数据库 InfluxDB(一) 数据库种类有很多,比如传统的关系型数据库 RDBMS( 如 MySQL ),NoSQL 数据库( 如 MongoDB ),Key-Value 类型( 如 redis &#xff09…

java开发环境本地全套

文章目录 1、jdk下载安装1.1、下载地址:1.2、安装1.3、验证 2、maven下载安装2.1、下载地址2.2、安装2.3、验证 3、git下载。3.1、下载地址 4、ideal下载5、dbeaver下载 1、jdk下载安装 1.1、下载地址: https://www.oracle.com/java/technologies/down…

华为配置篇-ISIS基础实验

ISIS 一、简述二、常用命令总结三、实验 一、简述 一、基本定义与历史背景 IS-IS(Intermediate System to Intermediate System,中间系统到中间系统)是一种链路状态路由协议,最初由ISO设计用于OSI(开放系统互联&#…

【深度学习】【目标检测】【OnnxRuntime】【C++】YOLOV3模型部署

【深度学习】【目标检测】【OnnxRuntime】【C】YOLOV3模型部署 提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 【深度学习】【目标检测】【OnnxRuntime】【C】YOLOV3模型部署前言Windows平台搭建依赖环境模型转换--pytorch转onnxONNXRuntime推…

【力扣hot100题】(008)找到字符串中所有字母异位词

我果然还是太菜了(点烟)。 一开始想法是构建map,记录每个字母出现的位置,后来想了好久滑动窗口该怎么移动。 后来看了答案才明白滑动窗口是固定的啊啊啊,每次向右滑就两指针同时右移就行。 好简单……为什么我做了这…

【计科】从操作系统到虚拟化技术(进程调度,内存映射,设备IO,文件、网络管理)

【计科】操作系统基础与虚拟化技术拓展的关系(进程调度,内存映射,设备IO,文件、网络管理) 文章目录 1、进程管理与调度机制(计算)2、内存管理与双重映射3、设备管理与IO机制4、文件管理5、网络与…

ECharts各类炫酷图表/3D柱形图

一、前言 最近鸡米花实现了各类的炫酷的图表,有3D柱形图、双边柱形图以及异形柱形图,好了,直接上图: 二、效果图 一个个来吧,下面就是代码啦,注意,一下图表展示的宽高均为800px*300px 三、异形横…

系统与网络安全------网络应用基础(6)

资料整理于网络资料、书本资料、AI,仅供个人学习参考。 Win10系统安装 安装Win10系统 安装准备 Windows10系统的安装光盘 虚拟机可采用ISO文件,windows_10_professional_x64_2024.iso Windows10系统的硬件要求 CPU处理器:1.0Ghz或更快 …