1.web前端开发学习_掘金前端课程(小册)推荐
2.Angular 组件库 NG-NEST 源码解析:Button 组件
3.基于nestjs实现的源码若依全栈管理系统,全面更新啦!分析
4.美国智能家居品牌有哪些
5.从 Egg.js 到 NestJS,源码爱码客后端选型之路
6.nestjsåeggjsåªä¸ªå¥½ï¼
web前端开发学习_掘金前端课程(小册)推荐
大家好,分析以下是源码推荐的前端掘金课程(小册)列表,适合前端初学者及工作几年的分析源码怎么开开发者,内容详细且由一线大厂员工编写。源码1. React 进阶实践指南
本课程深入讲解 React 基础与高级用法,分析结合实践示例,源码帮助您克服技术瓶颈,分析实现进阶。源码内容将随 React 版本更新而持续更新,分析包括 React 系列。源码
作者:在一线互联网大厂工作七年,分析有六年 React 开发经验,源码通读 React 源码,撰写多篇《React 进阶》系列文章。
点击进入学习
2. 前端面试之道
构建全面的前端知识体系,深入探究技术原理,掌握大厂面试中常考知识点。一年磨一剑,精心打造。
作者:yck,四年前端工程师,经历了从小厂到大厂的面试过程,专注于前端基础设施及架构领域,目前在新加坡某公司任职 Senior Software Engineer。
点击进入学习
3. 剖析 Vue.js 内部运行机制
以简单易懂的方式带领读者探索 Vue.js 的世界,通过小 Demo 抽象原理,形成简易版 Vue.js 实现,帮助理解核心概念。
作者:某外企前端 Leader,前阿里巴巴、滴滴出行和创业团队的前端工程师。
点击进入学习
4. 前端性能优化原理与实践
深入理解前端性能优化的原理,将晦涩的知识转化为实践技能,建立个人优化技能库。
作者:一线电商集团前端工程师,拥有丰富的研发、面试和性能优化经验。
点击进入学习
5. JavaScript 设计模式核心原理与应用实践
以易于理解的方式介绍编程“套路”,引导读者深入理解设计模式原理,并在实际场景中应用。
作者:修言,曾为《前端性能优化原理与实践》小册作者,现为一线电商集团前端工程师。
点击进入学习
6. 小程序云开发入门到实践
零基础学习小程序开发和腾讯云云开发知识,实践完成完整小程序项目,适合初学者。
作者:李东bbsky,腾讯云云开发布道师,致力于普及互联网技术技能。
点击进入学习
7. Taro 多端开发实现原理与项目实战
详细解析 Taro 多端开发框架,通过电商核心项目的实战,帮助开发者快速上手多端项目。
由凹凸实验室的多名开发工程师联合编写,他们来自 Taro 核心开发者、多款小程序的开发者。
点击进入学习
8. 前端算法与数据结构面试:底层逻辑解读与大厂真题训练
面向实战的前端算法面试教学,通过接地气的解释和大量图解,构建算法能力体系。
点击进入学习
9. Web 前端面试指南与高频考题解析
适合应届毕业生和计划跳槽的前端开发者,提供面试技巧和高频考题解析。
点击进入学习
. React Hooks 与 Immutable 数据流实战
以实战为导向,深入探索 React 开发中的设计模式与性能优化策略,打造完整前端工作流。
点击进入学习
. babel 插件通关秘籍
深入学习 babel 编译原理,掌握编写任何 babel 插件的技能,包括基础、进阶、实战和简易 babel 实现。
作者:某一线大厂前端工程师,公众号[神光的编程秘籍]维护者,对编译原理有深入研究。
点击进入学习
. 大厂 H5 开发实战手册
由京东凹凸实验室的资深前端工程师编写,提供 H5 开发和 UI 开发的elementui 源码实战技巧,适合应聘大厂 H5 开发或 UI 开发职位的开发者。
点击进入学习
. TypeScript 全面进阶指南
深入探讨 TypeScript 的应用,提高代码的健壮性、可读性,提升开发效率和体验。
作者:阿里巴巴前端开发工程师,热衷于分享和推广 TypeScript 相关知识。
点击进入学习
. 玩转 CSS 的艺术之美
深入 CSS 技巧,提供大量骚操作示例,提升审美标准和艺术创作能力。
作者:资深前端工程师,网易互动娱乐事业群成员,负责前端工程化和架构设计。
点击进入学习
. 深入浅出 Vite
系统学习 Vite 构建工具,提升前端工程化能力,全面掌握构建生态和底层原理。
作者:前端工程化领域专家,曾将 Vite 应用于抖音直播等大型业务,同时也是 Vite Contributor。
点击进入学习
. TypeScript 类型体操通关秘籍
掌握 TypeScript 类型体操的六大技巧,成为类型编程高手,涵盖类型系统和实战案例。
作者:前阿里架构组前端工程师,对前端编译原理有深入研究。
点击进入学习
. React 实战:设计模式和最佳实践
深入了解 React 应用设计模式和最佳实践,包括 Suspense 和 Hooks 的应用。
点击进入学习
. 前端调试通关秘籍
掌握 VSCode Debugger、Chrome DevTools 和 Charles 等调试工具,提升调试能力。
点击进入学习
. Webpack5 核心原理与应用实践
从工程搭建、构建性能优化到 Loader 和 Plugin 开发,深入剖析 Webpack 执行原理。
作者:字节跳动前端工程师,重度帝王蟹爱好者,对前端工程化有深入研究。
点击进入学习
. WebGL 入门与实践
介绍 WebGL 和 CSS 3D 开发技巧,演示 3D 数学库在 Web 开发中的作用。
点击进入学习
. Vue3 企业级项目实战
围绕 Vue3、Element Plus 和 Spring Boot 开展的完整企业级项目开发实战。
点击进入学习
. 基于 Vite 的组件库工程化实战
探索 Vite 在组件库工程化中的应用,提升项目开发效率。
点击进入学习
. 从前端到全栈
通过 Node.js 从前端角度体验全栈开发,涵盖工具脚本、HTTP 服务、工程化和跨平台开发。
点击进入学习
. NestJS 项目实战
学习使用 NestJS 构建高效、可扩展的 NodeJS 服务端应用。
点击进入学习
. Vue 商城项目开发实战
完成一个完整 Vue 商城项目的开发,包含技术讲解和实战。
点击进入学习
. 基于Node的DevOps实战
通过实践项目深入 DevOps 工程,包括开发、测试、构建和部署。
点击进入学习
. 区块链开发入门:从0到1构建基于以太坊智能合约的ICO DApp
为前端开发者提供区块链开发基础,通过 DApp 实战掌握区块链技术。
点击进入学习
. Uniapp从入门到进阶
全面讲解跨平台应用开发,包含 Uniapp 常用知识点、基础 API、前端交互、组件封装、后端 Nodejs 开发、前后端联调和优化部署。
点击进入学习
. 现代 Web 布局
基于 Web 开发需求,探索现代布局技术,适应不同设备和场景。
点击进入学习
. 深入剖析 Node.js 底层原理
从源码角度解读 Node.js 设计,实现简易 JS 运行时,提升 Node.js 技能。
点击进入学习
Angular 组件库 NG-NEST 源码解析:Button 组件
NG-NEST 介绍
讲解项目源码结构时,我们提过单个组件的文件架构,现在深入解析下 Button 组件内部实现。
功能分析
先看 Button 组件能提供的核心功能。
主题颜色
设置主题颜色时,我们仅需定义 type 参数。
参数定义
type 参数设在 button.property.ts 文件内,用于定义输入参数并指定为 XButtonType 的联合类型,初始值为 "initial"。uci 源码
具体定义与使用情况
在 button.component.ts 文件中,setClassMap() 函数中指定了根据 type 生成的样式属性,并通过 ngClass 映射样式。
SCSS 样式定义
参数与样式的关联在 button.component.scss 文件中实现,通过 @include 输出 @mixin 的混入样式。
@mixin 定义在 style/mixin.scss 内,如 button-type 定义了基于不同参数的不同按钮样式。
样式复用
利用 @mixin 实现不同主题颜色样式的便捷复用,提高代码的可维护性和一致性。
总结
Button 组件主题颜色功能实现清晰明了:利用 type 参数定义样式名,SCSS 文件中具体定义样式。通过 button.property.ts 和 button.component.ts 文件的协同工作,组件属性清晰明了,便于后续的维护与优化。
组件属性分离策略提升代码可维护性,且能够自动生成官方 API 文档中的属性说明文档。组件主要围绕样式设计,对主题样式有深入了解的开发者应进一步探索其余功能的详细实现。
基于nestjs实现的若依全栈管理系统,全面更新啦!
大家好,我是徐小夕,很高兴告诉大家,我们的若依全栈管理系统Nest-Admin已经全面更新了!这个基于Nestjs的开源项目,旨在简化全栈中后台管理系统的搭建,现已支持Vue3版本,让大家可以在新版本的框架下无缝集成。此外,我们还加入了数据导出功能,方便数据管理和归档,提升了数据处理的便捷性。 代码生成功能也是一项重要更新,现在可以根据表接口动态生成源码,为开发者提供了丰富的代码模板,方便进行二次开发。角色权限和接口权限的实现也进行了优化,通过注解即可实现,极大地提高了开发效率。 我们还修复了issure中提出的一些bug,确保了项目的稳定性和用户体验。你可以通过链接github或码云获取最新版本,并在演示地址上亲自体验。我们非常感谢社区的伙伴们,你们的反馈和贡献让Nest-Admin变得更好。 后续我们会持续进行迭代更新,欢迎你试用并给予支持,点赞和star是我们前进的动力。让我们共同探索和优化若依全栈管理系统,提升开发效率和用户体验。美国智能家居品牌有哪些
智能家居,相信大家并不陌生,是一个刚刚兴起的热门行业,在中国能家居还没有普及,很多家庭都还没有安装任何智能家居,但是随着科技的发展,智能家居开始慢慢进入人们的视野,有很多智能家居国际品牌开始为人们所知并了解。那么,美国智能家居品牌有哪些呢?下面跟小编一起来看看吧!
美国智能家居品牌有哪些
1、CRESTRON快思聪
成立于年美国,知名智能家居品牌,全球出色的自动化与控制技术制造商,以打造一体化技术为主,专业从事自动化和控制解决方案的大型跨国企业。
快思聪专注于打造一体化技术。为住宅和楼宇打造的自动化和控制解决方案,能够帮助用户实现一键式环境控制。这一解决方案集成了影音、照明、遮阳、IT、安防、建筑管理系统(BMS)和HVAC等系统,unityAR源码可以为用户提供更高的舒适度、便利性和安全性。设计宗旨是将所有产品整合为一个完整的系统,协同作业,用户可以在同一平台上实现对所有产品的监测、管理和控制。
历经多年发展,快思聪产品现已被公认为业界值得信赖的产品。坚持不断、改进质量控制体系,保障快思聪产品始终处于技术前沿,能够为客户提供始终如一的体验。此外,快思聪坚持在美国本土完成产品的设计、加工和制造,以加快产品的研发速度,保障质量与分配标准的贯彻与执行。
2、Control4
Control4成立于年,总部位于美国犹他州盐湖城,是知名的个性化的自动化和控制解决方案供应商,专业从事智能家居产品的研发、生产、销售
Control4是知名的个性化的自动化和控制解决方案供应商,帮助您实现自动控制家中或商务场所的几乎所有设备。创立于年,公司致力于为您提供优雅且更经济的方式,实现单房间或全宅的照明、音乐、影视、安防和能源的智能控制。今天,经Control4?认证过的集成商与众多家庭和企业用户合作,向他们呈现了智能和互连家居的革命性效益:提供了一个便利、安心和高效的环境,让用户倍感安全和舒适。
Control4相信,当一切协同工作时,生活将会更美好。Control4解决方案与超过家第三方消费电子设备实现了互操作,而且这个数字还在快速增长。通过与世界领先的消费电子产品、家用电器、能源设备、照明和家庭安防品牌合作,Control4实现了业内领先的互操作性,确保了一个不断扩展的,在家中或商务场所的设备都可以协同工作的生态圈。
有着多家北美集成商,及分布在个国家的经销商、代理商销售渠道优势,Control4成为全世界家居业主,酒店及MDU运营者,餐厅,运动吧及商务办公室的控制平台选择。公司总部位于盐湖城,在英国约克郡、中国上海、印度班加罗尔和加利福尼亚圣何塞设有办事处。Control4已在纳斯达克公开上市,股票代码为CTRL。
3、Honeywell霍尼韦尔
霍尼韦尔始创于年,年进入中国,专注于将物理世界和数字世界深度融合,提供航空、楼宇和工业控制技术、特性材料、物联网等解决方案的高科技企业
霍尼韦尔是一家《财富》全球强的高科技企业,为全球提供行业定制的航空产品和服务、楼宇和工业控制技术、以及特性材料,致力于将飞机、汽车、楼宇、fbreaderj源码工厂、供应链和工人等万物互联,使世界实现更为智能、安全和可持续的长远发展。霍尼韦尔全球总部位于美国北卡罗来纳州夏洛特市。
霍尼韦尔始创于年,在华历史可以追溯到年在上海开设的第一个经销机构。霍尼韦尔秉持深耕中国谋求长期发展的理念,贯彻“东方服务东方”和“东方服务世界”的战略,以本土创新推动增长。目前,霍尼韦尔所有业务集团均已落户中国,上海是霍尼韦尔亚太区总部。
4、SAVANT赛万特
Savant系统公司总部位于美国,推出了完全基于Apple?平台的自动化控制系统,集设计、研发、制造于一体的知名智能家居控制解决方案供应商,涵盖灯光控制、窗帘控制、安防监控等领域
北京赛万特电子科技有限公司(SavantChina)是年月,美国SAVANT设立的大中国区总部,负责SAVANT高级智能化系统在大中国区的市场拓展,本地化服务与技术支持。公司在北京上海均有办公室,在香港澳门台湾均有本地化服务团队。
Savant系统公司总部位于美国马萨诸塞州,海恩尼斯,在纽约、旧金山、洛杉矶、佛罗里达劳德代尔堡、盐湖城都有办公室,在欧洲(英、法),中东(迪拜),南美(巴西)等地都有分公司和代表处。
Savant是家居和商业自动化市场的创新者,集设计、研发、制造于一身,全新定义了控制技术的集成解决方案。推出了完全基于Apple?平台的自动化控制系统,提供一站式系统服务。高度集成Apple?技术,充分利用iPad?及iOS设备的大众熟知度和系统直观性,满足了高端用户对体验的极致要求,Savant自成立以来,在智能化、音视频及灯光控制方面申请了多达余项专利,产品更是在CEDIA屡获殊荣。
Savant实现了乔布斯豪华游艇Venus号、股神巴菲特豪宅、迈阿密海滩酒店及Club的智能化,在全球获得了诸多赞誉,被认为是全球豪华家居和商业自动化平台的创新者。
5、Nest
由苹果“iPod之父”法德尔创立于年,美国知名智能恒温器及烟雾探测器厂商,现为谷歌旗下子公司
Nest公司成立于年,因推出具有漂亮外观设计和自我学习功能的Nest智能温控装置而受到市场广泛关注。它的联合创始人TonyFadell被称为苹果iPod之父。到目前为止,NestLabs推出过两款产品,分别是智能温控器和智能烟感器。TonyFadell与另一个联合创始人MattRogers(也出自苹果)将会同时加入谷歌工作。
谷歌在加州当地时间年1月日下午1点左右宣布,以亿美元现金收购智能家居设备制造商Nest(NestLabsInc),Nest联合创始人托尼-法德尔(TonyFadell)和马特-罗杰斯(MattRogers)将同时加入谷歌。
年2月7日,Nest重新纳入谷歌旗下。Nest现任首席执行官马尔万·法瓦兹(MarwanFawaz)将向谷歌硬件部门负责人里克·奥斯特洛(RickOsterloh)汇报工作。
6、思美特SMARTISYS
SMARTISYS思美特科技年诞生于美国硅谷,是全球着名的智能家居和智能控制系统设备制造商。在美国和中国光谷设有高科技研发中心,在深圳设有全球制造中心。
思美特拥有十八年的综合控制系统和智能家居产品开发和集成经验,产品业务遍布全球;思美特中国技术支持中心分布全国六大区域,是大中华区智能控制行业专业、集成能力强的工程技术服务团队。十多年来在中国境内安装超过十万套智能控制系统产品,产品在国内很多关键行业的稳定运行超过十年;成功连接三千多家不同种类的家用电器和电子产品。
随着物联网、人工智能、5G和云计算的迅速发展,智能控制和智能家居已经成为个人-家庭-公司拥抱时代科技进步的基础平台和赋能管道;我们适时提出了“管家-管楼-管未来”的口号;通过提供集全宅智能家居、无线智能家居、免编程控制系统、综合控制系统平台、酒店客控系统、房地产大平层智能家居、智慧社区和智能城市的“金字塔”产品线,开创性地开发出了“智能控制+”的智能控制系统平台,能够为物联网行业应用、专业电子产品迅速构建超连接、智控制和富交互的一站式解决方案提供商。
7、LUTRON路创
年成立于美国,照明控制行业的领军企业,提供各种节能调光器和照明控制解决方案的选择,产品的应用涵括住宅/酒店/办公楼/零售店/公共设施等领域
路创坚持以技术为核心和以人为本。作为一家私营公司,路创始终坚持以创始人简单却深奥的五项原则为指导,并且有着长足发展和灵活创新的悠久历史。路创的历史要追溯到二十世纪五十年代JoelSpira在纽约市建立临时实验室时。
当时Spira这位年轻的物理学家对于光的控制非常着迷,于是利用和妻子Ruth同住的公寓中多余的那间卧室,着手发明能够控制家中灯光亮度的固态装置。这种想法在当时是非常激进的。因为那时照明控制是一件复杂且昂贵的事情,需要大量变阻器,能耗非常大,产生的热量非常多。所以,照明控制主要是用于调整剧院舞台的灯光。调光器的安装难度太大,所以大多数人从未想过在家中安装调光器。这种状况在年发生了根本变化,当时Spira在他的实验室里发明了能够替代标准住宅用墙盒中的电灯开关的固态调光器。
Spira的关键技术创新是用闸流管替代变阻器。闸流管是几年前发明的一种晶体管。这样的替代非常有效,因为变阻器和闸流管是按完全不同的方式工作的。闸流管通过吸收进入变阻器中的电能来调光,这意味着闸流管中的电能转换成了热量而不是转换成了电灯中的光。相比之下,闸流管则是通过中断流向电灯的电力来调光。通过利用闸流管将调光器的尺寸缩小到了适合标准墙盒的程度。Spira的调光器产生的热量和能耗也远低于变阻器。
年Joel和RuthSpira组建了LutronElectronics公司,他们深知照明控制可从多种途径为社会做贡献。调光器既美观又实用,人们可以用调光器对灯光进行控制,这在当时是前所未有的。
调光器也很实用。它们可以节能,调光器使用得越多,节能就越多。随着能源成本日益高涨,Spira夫妇相信这项新发明节能的特点对于照明控制具有长远的吸引力。
8、艾拉物联
年,艾拉物联成立于美国硅谷;年,全球物联网云平台的开山鼻祖的Ayla被中国润良泰基金和日海通讯收购,当时,刚刚被国有资本控股的Ayla,本想趁势在中国市场大展拳脚,Ayla一直引以为豪的安全体系此时却成为了拓展中国市场的绊脚石,原因竟是Ayla云采用的是全球高等级的SOC3安全认证,导致其在数据传输上效率相对较低。
降低还是不降低Ayla云的安全等级?经过长久的思考,润良泰基金和日海通讯最终结论是投入几亿资金让团队继续潜心研发,这一举动直接导致了Ayla在全球市场沉寂了3年。
3年的时间会让一家企业辉煌,也会让一家企业沉寂。但令人欣慰的是在3年的潜心研究,换来了Ayla云运作效率的大幅度提升,Ayla开始摩拳擦掌,准备做商业化落地。
年底,原咕咚科技联合创始人刘渝龙加入Ayla,Ayla的发展历程迈向新的篇章。他前瞻性地判定Ayla接下来要做的就是依托于移动物联网,走平台化运营和全产业链覆盖生态路线。同时,他还游说润良泰基金买断了美国Ayla云的源代码,这使得Ayla原有的所有技术成果和知识产权,完完全全掌握在了中国产业基金手里。
团队和资金都有了,接下来便是上战场,5月日,一场盛大的千人发布会,向中国市场宣告了Ayla的存在。至此,Ayla开启全新征程,不仅为中国AIoT产业的前行和发展贡献智慧和力量,更成为引领中国从制造强国向智造强国迈进的中坚力量。
9、伊维EAVIER
伊维(EAVIERINC.)年创立于美国旧金山市,是全球出色的物联网科技企业,专注于智能照明、环境交互、电子技术及应用领域,在旧金山硅谷总部拥有独立创新实验室,业务遍及全美及全球多个国家和地区。
公司将目光聚焦于巨大的全球性挑战上,专注于解决物联网智控、环境能效及协同化等一些列问题,在建筑智能、环境自适应、楼宇区域化管理和智控软件系统等领域拥有成熟的解决方案,应对当今世界高速变化的智能化需求,并同时降低资源消耗。
自年进入中国市场并投资设立运营分部以来,伊维在中国的业务得到了迅速发展。今天,伊维在中国的业务涉及:智能家居、智能楼宇、智能养老等多个领域。
在中国,伊维开展了针对本土的研发创新和产品制造,以便伊维能够满足本土需求。公司将持续在这一活力与增长的市场中发展,为中国客户提供令人满意的产品、系统和服务。
伊维EAVIER的本土化战略促成与宜居尚雅的深度合作,作为深入中国市场的关键布局,双方共同建立企业级品牌、技术联盟,开展下一阶段伊维EAVIER品牌及产品的中国区市场运营工作。
辽宁宜居尚雅科技有限公司坐落于中国·沈阳,具备多年物联网智能行业产品研发制造经验,拥有近百项自主研发专利,具有精英研发核心团队、严格产品质量控制体系、产业化自有设备生产基地和完备的客户服务网络。产品通过机构及临床专业测试,通过CCC/FCC/ROHS认证,面向全球客户提供完备的行业解决方案,用实力和热忱打造深受客户信赖的品牌和产品。
智能家居品牌如何选择
1、看品牌实力
选择一家靠谱的智能家居品牌厂商,可以最大程度保证日后的使用体验。智能家居不是快消品,考虑到换修成本和精力,一旦装上,可能未来十几年都不会轻易换。而一个好的品牌,首先在产品质量上是有保障的,这就能减少很多后期使用中的问题,让我们用得更安心
另外,有实力的品牌在系统稳定性和产品功能、售后服务等方面也会做得更好。所以大家要尽可能选择信誉好、在智能领域投入时间更长、能提供全屋智能控制系统的专业品牌。
2、看系统稳定性
就像前面说到的,智能家居的更换成本和用户对它的使用体验要求都更高,所以系统的稳定性就显得尤为重要。稳定性差、动不动就出问题,那还不如不装。就像我们平时用手机或电脑打游戏,如果动不动就掉线、卡顿,那能用得舒心吗?
有些智能家居品牌因为WiFi信号覆盖范围有限,应用到别墅等大空间场所时,就容易出现设备掉线、不执行指令等系统不稳定的情况。而真正稳定的全屋智能控制系统,会采用Zigbee、Ethernet、WiFi等多网合一的方式,在没有外网时也能在局域网内使用和控制设备,而且可以通过级联的方式组建更大规模的zigbee网络,真正覆盖到全屋。
3、看系统集成性
真正的全屋智能,一定是各个子系统既能独立运行,也能组合联动,实现各种定制化生活场景。这就要求智能家居系统高度集成化,即它是一个集中的操作平台,可以将各个子系统如安防、影音、灯光、窗帘等集成在这一个系统中,让各个子系统互通互联。在操作上既可以实现集中统一控制,也可以分别控制。但是现在市面上很多智能家居依然只是单个的子系统,并不能实现集成化,所以我们在选购之前一定要询问清楚,以免影响日后使用体验。
另外,还有些产品看起来智能,其实只是增加了简单的遥控功能,并不能根据自己的需求进行DIY编辑,算不上真智能,我们在选购时要避开。
5、看售前售后服务
目前国内的智能家居市场并不规范,不同的厂商服务水平也参差不齐,只是买一个智能单品还好,但一套完整的全屋智能家居系统涉及的产品较多,安装布局也相对更复杂,更适合选择定制的方式。所以,品牌的服务水平就显得更加重要。
一般好的智能家居品牌,从了解用户需求、定制全屋智能解决方案,到售后产品质量保障与维护,都能提供更令人满意的服务。
从 Egg.js 到 NestJS,爱码客后端选型之路
爱码客3.0 开发,回顾一年历程,我从 Egg.js 转向 NestJS,选型之路,经历探索与挑战。
最初,Egg.js 以其约定大于配置的特性,简化了开发流程。然而,对于团队组织结构与代码分类的需求,Egg.js 的目录规范限制了灵活性。我深入研究 Egg.js 文档与源码,发现自定义 loader 实现个性化目录结构,需基于 Egg.js 创建新框架,过程复杂。
面临 Egg.js 对 TypeScript 支持的局限,我寻找替代方案,最终决定转向 NestJS。NestJS 原生支持 TypeScript,提供 OOP、FP 和 FRP 等功能,底层采用 Express 或 Fastify 等强大 HTTP Server。其设计理念与 Spring 类似,基于 IoC 原则,使用依赖注入,解耦模块,提高代码可测试性。
NestJS 的依赖注入机制,无需指定位置查找依赖,简化了目录结构组织。使用 @Injectable 修饰的 Service,可在注册后直接注入,无需关心具体位置,增强了模块间的解耦与灵活性。
选择 NestJS 后,代码结构清晰,开发效率提高。NestJS 的优势在于 TypeScript 支持、微服务架构和依赖自动扫描,适合集团内开发场景。在大规模项目中,NestJS 的设计理念和开发约束能提供显著的帮助。
回顾过去,从 Egg.js 到 NestJS 的选择,经历了多次尝试与调整。历史的推动力使我们最终选择了 NestJS。虽然中途 Egg.js 继续发展,成为集团内标准框架,但选择 NestJS 的决策已定。时间流转,技术迭代,爱码客项目顺利推进,选型之路,虽有曲折,但终达目的地。
经历的探索与挑战,不仅是一个技术选型的故事,更是个人成长与团队协作的见证。文章旨在分享这段历程,供参考与借鉴。希望对其他开发者有所启发,欢迎有激情的你加入 ES Studio,共同探索技术的奥秘。
nestjsåeggjsåªä¸ªå¥½ï¼
nestjs为ä»ä¹ä¸ç«
å 为æä½ä¸ç®ä¾¿
Nest.jsæ¯ç¨äºæ建é«æä¸å¯ä¼¸ç¼©çæå¡ç«¯åºç¨ç¨åºçæ¸è¿å¼Node.jsæ¡æ¶ãæ¯æTypescriptãé¢åAOPç¼ç¨ãæ¯ætypeormãNode.jsççspringãæ建微æå¡åºç¨ã
Nest.jsæ¯ç¨äºæ建é«æä¸å¯ä¼¸ç¼©çæå¡ç«¯åºç¨ç¨åºçæ¸è¿å¼Node.jsæ¡æ¶ãæ¯æTypescriptãé¢åAOPç¼ç¨ãæ¯ætypeormãNode.jsççspringãæ建微æå¡åºç¨ã
å¹´å端æç«çææ¯æ¯ä»ä¹ï¼
æ认为çå¹´å端å¼åè æåºè¯¥ææ¡çä¸äºæ¯è¾ç«ççææ¯ä¸ç¥è¯ç¹ã
1ï¼å端æ¡æ¶åè¯è¨å±é¢
9æ份Vue3.0åå¸ï¼å£°ç§°å¯¹TypeScriptæçæ´å¥½çå¼åä½éªï¼éè¿ä»ä¸åæ¡æ¶çº§å«TSæ¯æä¸ï¼æ们å¯ä»¥çåºç¤¾åºçæ´ä¸ªé£åä»å¹´ç大家é½å»å¦ä¹ åºç¨TSï¼åæäºå¤§å®¶å¦ä½æTSç¨çæ´å¥½è¿ä¸ªæ¹åä¸æ¥äºã
æ以æ认为ä»å¹´TypeScriptçç«çç¨åº¦è¿æ¯åºè¯¥æåå¾é åçï¼æä»å¹´ä¹ä½¿ç¨TypeScriptéæäºDarukçæå¡æ¡æ¶æ¨åºäº2.0çæ¬ï¼è®©TSå¼åè æ¥ææ´å¥½çTSå¼åä½éªã
æ¥ä¸æ¥å°±æ¯ä¸¤å¤§éç£ æ¡æ¶çæ´æ°åç¨å¯¹æ¯ï¼Vue3åé¢è¯´äºä¸å¥ãèReactä¹å¨åæä¹åå¸äºReactçreleaseçæ¬ãè¿ä¸¤å¤§ä¸»æµæ¡æ¶çé¢ç¹æ´æ°ï¼ä¹è¯´æäºç¤¾åºåä½è é½å¨ä¸åæ¼åã
å¨Vue3ä¸é¤äºæ´å¥½çæ¯æTSå¤ï¼è¿æ´æ°äºCompositionAPIãèReact主è¦æ¯éä¸ç²¾åå¨å级ä½éªä¸ï¼è½ç¶æ²¡ææ°çFeatureä½æ¯æåäºå解å³äºå¾å¤ä¹åçæ¬æ½å¨çé®é¢ã
è¦è¯´åªä¸ªæç«è¿æ¯è¦ç个人å®é ç使ç¨åºæ¯åå好ï¼ä½æ¯å¹´æ¥çè¿æ²¡æå«çæ¡æ¶å¯ä»¥ä¸ä¹ä¸æã
2ï¼å¤§å端ç¸å ³ææ¯æ
ä»å¹´åºäºChromiumç微软edgeæµè§å¨ä¹å·²ç»æ¨åºãgoogleå¨web端çåå±äº§çäºå¯¹å¼åè æ·±å»çå½±åãChrome+ä¹å·²ç»åå¸å¤ä¸ªçæ¬ï¼æä¾äºä¸ç³»åçæ°ç¹æ§ï¼æ¯å¦CoreWebVitalsæ åï¼DesktopPWAçé½å¼å¾æ们å»å ³æ³¨ã
æ们说å®äºæµè§å¨ç¸å ³çé£ç¹ææ¯ä¹åï¼åèè大å端ç¸å ³çä¸äºææ¯å®è·µï¼æ¯å¦Flutterã
å¾å¤å端å¨ä»å¹´å·²ç»ä»webå¼å转å为Flutterå¼åï¼å¦ä¹ å使ç¨Dartææ¯æ¥æ建UIï¼è¿æ¯å¾å¤å¤§åçå端工ç¨å¸æ£å¨ç»åçäºæ ï¼å æ¬æçé¨é¨ä¹å¨å°è¯è¿ä¸ªäºæ ï¼ï¼è¿ä¸ªè¶å¿åºè¯¥å¨æªæ¥å å¹´è¿ä¼æç»ã
客æ·ç«¯electronå¨ä»å¹´ä¹æçé¿è¶³çè¿å±ï¼ä¸å¹´å å¤æ¬¡æ´æ°çæ¬ä¸è·¯å°äº.1.5ãéçç«æ å½±åï¼å½å å¨çº¿æè²çåä¸æ³¢å ´èµ·ãå¾å¤æ¡é¢è½¯ä»¶ï¼ç½è¯¾è½¯ä»¶é½å¨éç¨è¿ä¸ªææ¯æ¥è¿è¡å¼åï¼å¸åºä¸çå²ä½ä¹å¼å§åå¤ï¼electronææ¯å¯ä»¥è¯´å¨ä»å¹´ä¹æç«çè¶å¿ã
ç¶åæ们åççBFFå±ï¼nestjsä¾ç¶åæºï¼è¶æ¥è¶å¤ç人å¼å§è·³è¿å¦ä¹ expressåkoaå¼å§å¦ä¹ æ´ä¸°å¯çwebæ¡æ¶äºï¼æ¯å¦eggæè æçdarukï¼å¼åè å·²ç»å¨æ ¢æ ¢å½¢æå ±è¯ï¼å¨webframeworkçè·¯ä¸å¼å§è¶èµ°è¶è¿ï¼è£¸ånodejswebæå¡çæ¶ä»£å·²ç»å¼å§æ ¢æ ¢è¤ªå»ã
ä¸å¾ä¸æçè¿æserverlesså¨å端çæ®åï¼å¨å¹´å°è¾¾äºä¸ä¸ªæ°çé«æ½®ãé¿éäºï¼è ¾è®¯äºï¼å¤´æ¡äºççå½å çäºèç½ååä¹é½å¼å§å¤§ç©serverlessæ¦å¿µãä»å¯¹å æå¡å¼å§è½¬å对å¤æå¡ï¼æ®åçå¿å¤´å¾çï¼ä¹æè½å°çè¶å¿ååºæ¯ãä»å¹´çD2åæ ·ä¹æserverlessçä¸åºï¼å¯è§åéè§ç¨åº¦éæ¯å¯»å¸¸ã
3ï¼å·¥ç¨åææåä¸ªäººç´ è´¨æå
å离æ们è¿ä¸äºçæ¨å¨ç产åçææ¯ï¼æ¯å¦æ®ææç¥å¨ç¨CI/CDåpipeline管çä¸çº¿æµç¨çå ¬å¸è¶æ¥è¶å¤ï¼è¿ç§å»å¹´è¿å¯ä»¥åºå»å¹ä¸å¹çä¸è¥¿ï¼ä»å¹´ä¹éæ¥åæäºä¸çæ é åºç¡è½åï¼å¦æä¸ä¼çåå¦å¯è¦æç´§å¦ä¹ äºã
å¹´å大家é½ç¯çå槽é¢è¯å·mediumé¢ç®æ²¡ç¨ï¼èå¹´å大家å¼å§é»è®¤é¢è¯æäºå ¬å¸é½è³å°è¦å·å°mediumç¨åº¦çé¢ç®ãè¿å¯¹å¾å¤å端æ¥è¯´æ¯ä¸ä¸ªå¿æºåç´ è´¨çæåä¸è½¬åï¼å¤§å®¶å¨æ¥è§¦æ°ææ¯çåæ¶ï¼ä¹æ ¢æ ¢åç°ï¼å端æ´ä¸ªèä¸ç¯å¢çååï¼è¶æ¥è¶å¤çå ¬å¸å¯¹äººçæ´ä½ç»¼åç´ è´¨è¦æ±åé«äºã
eggjs为ä»ä¹å£ç¢ä¸å¥½è´¨éé®é¢ãeggjs为ä»ä¹å£ç¢ä¸å¥½çåå æ¯è´¨éé®é¢ï¼å 为eggjsè´¨éå·®ï¼å®ä»·é«ãå£ç¢ï¼æä¼äººå£å¤´çé¢æ¬ï¼æ³æä¼äººç议论ï¼ç¾¤ä¼çå£å¤´ä¼ 说ï¼ç¸å½äºä¸ç§å¤§ä¼å´è¾¹ç»å¸¸æèµ·çäºæ æç»ç»ã
NGå ¨å®¶æ¡¶å ¨æ 项ç®å®è·µæ»ç»Angularå¨å½å 使ç¨ç人并ä¸åå½å¤é£ä¹å¤ï¼åºæ¬é½æ¯å¤ä¼å¨ç¨ï¼ä½å ¶æ¡æ¶çææ³å´ä»å¯ä»¥ä¸ºæ们æåé´ï¼å¨æäºé®é¢æ²¡ææè·¯çæ¶åå¯ä»¥åèngç¸å ³çå¤çï¼ngå¤çæ¹å¼åæç»´ç¡®å®æ¯è¾è¶ åï¼ä½ä¹å æ¤èæ²é«å寡ãæ¬ææ¨å¨éè¿ngå ¨å®¶æ¡¶é¡¹ç®ï¼å端Angular+å端NestJS7ï¼çå®è·µæ¥æ»ç»å¯¹äºngæ¶æä¸ä¸äºäº®ç¹çå ³æ³¨ä¸æèï¼AngularåNestå¨åå端æ¡æ¶çå¤çä¸ååºä¸èï¼å¯¹æ¯èµ·æ¥æ´æåé´æä¹ã
[ç®å½ç»æ]
[ç®å½æè¿°]
æ´ä¸ªå端项ç®æ¯åºäºangularèææ¶çæçï¼å ¶åºæ¬ç®å½ç»ææ¯å¨srcçappä¸è¿è¡ç¸å ³ç»ä»¶å页é¢ç模åå¼åï¼main.tsåindex.htmlæ¯æ´ä¸ªå页åºç¨çä¸»å ¥å£ï¼æ ¹ç®å½ä¸angular.jsonç¨äºé ç½®ç¸å ³çæå ç¼è¯çç¯å¢é ç½®åæ°
[å®è·µå享]
[ç®å½ç»æ]
[ç®å½æè¿°]
å端项ç®æ¯åºäºnestjsæ¡æ¶ç大ååå°é¡¹ç®é ç½®ï¼api模å主è¦æ¯å¯¹å¤è¾åºçæ¥å£ï¼authãfiltersãguardãinterceptorsãmiddlewaresãpipesçæ¯å¯¹äºéè¦ç模åè¿è¡ç»ä¸çæ¶éå¤çï¼main.tsæ¯ä¸»å ¥å£æ件ï¼ç¨äºå¯å¨åç¸å ³é ç½®çï¼app.module.tsæ¯ç¨æ¥æ¶éææ模åçå¯¼å ¥ï¼ngåºäºæ¨¡åçæ¹å¼å¯ä»¥èµ·å°é常好çé离ææ
[å®è·µå享]
é¦å ï¼å¯¹äºæ²¡æç¨è¿ngçåå¦ç§æ®ä¸ä¸ï¼angularå ¶å®å为两个大çæ¬ï¼ä¸ä¸ªæ¯angular1.xçï¼ä¹å°±æ¯ng1ï¼ä¹å°±æ¯ç°å¨è¿æçangularjsï¼å¦ä¸ä¸ªçæ¬æ¯ng2以åççæ¬ï¼ng2ä¹å被谷ææ¶è´åï¼å®å ¨éåäºæ¡æ¶ï¼å¯ä¸å1.xç¸éç估计ä¹å°±å©é£å 个ææ³è¿å¨äºï¼æ¨¡ååãä¾èµæ³¨å ¥ãååç»å®ãMVCï¼å¯¹äº1.xæå ´è¶£çåå¦å¯ä»¥å»çVueç1.xççæ¬ï¼åºæ¬ç®æ¯ç®åççng1.xï¼Vue2ä¹åå°±ååæ¥çngåéæ¬é³äºï¼vue2主è¦æ¯ä»¥åå¸è®¢é æ¥æ¿ä»£ä¾èµæ³¨å ¥çæè·¯ï¼æ¯è¿äº...(ps:æ³çng1çæ¬çå¯ä»¥çè¿ä¸ªå°åï¼å± ç¶è¿ææ´æ°...angularjså®æ¹ä»åº)ï¼è¿éåæç主è¦æ¯Ngï¼ng8ä¹åé¤äºå¼å ¥Ivy(Ivyæ¶æå®æ¹ä»ç»)è¿ä¸ªç¼è¯æ¸²æå¨ä¹å¤ï¼å ¶å®æ¹å¨ä¸å¤§ï¼ä¸»è¦å°±æ¯å¨ä¼å以ååºé¤åæ°å»ºä¸äºapiççãNgçæºç å¾åºå¤§ï¼goggleèªç äºä¸ä¸ªbazelèªå¨åæå»ºå·¥å ·ï¼ngèªç¶ä¹æ¯é è¿ä¸ªæ建çï¼å¯¹bazelæå ´è¶£çåå¦ï¼å¯ä»¥çè¿ä¸ªGoogle软件æå»ºå·¥å ·Bazelåçå使ç¨æ¹æ³ä»ç»ï¼æè¿éå°±ä¸å±å¼ææçæºç ï¼æ´ä½çæ ¸å¿å¤§æ¡æ¶å¦ä¸ï¼
nestjsæ¯nodejsçwebåºç¨çä¸ä¸ªå¤§çéæï¼å®æåæ¯åºäºexpresså°è£ çä¸ä¸ªå端æ¡æ¶ï¼åæ¥å°æå¡ç«¯åç§ç念é½ä½¿ç¨jså®ç°äºä¸ä¸ï¼è½ç¶ä¸è½åæççæå¡ç«¯è¯è¨æ¡æ¶å¦javaçè¿è¡åª²ç¾ï¼ä½æ¯æå¡ç«¯æéè¦çä¸è¥¿åºæ¬é½å ·å¤äºï¼å¯¹äºæéæ±æ³è¦ä½¿ç¨jsæ¥å¼åå端çåå¦æ¯ä¸ªä¸éçéæ©ï¼ä¸ªäººè®¤ä¸ºç®åçbffï¼æ¯å¦æ³èªå·±æ¨¡æçå¼å个åå°æ¥æ¶è¯·æ±ï¼éæ©nodeç´æ¥åæè 使ç¨expressãkoaå°±å¯ä»¥ï¼å¯¹äºæä¸å®çä¸é´å±ç»å端å¤çï¼å¯ä»¥éç¨é¿éçeggï¼å¯¹äºå¦ä½åºäºeggæ建ä¸é´å±ï¼å¯ä»¥ççè¿ç¯æç« å¦ä½ä¸ºå¢éå®å¶èªå·±çNode.jsæ¡æ¶ï¼ï¼åºäºEggJSï¼ï¼å¯¹äºå¤§åçæå¡ç«¯ï¼å°¤å ¶æ¯å端æ¯ä»¥ng为主æ çï¼å¯ä»¥ä¼å èè使ç¨nestjsï¼å ¶æ¬¡å¯¹äºioè¾å¤è计ç®è¾å°çï¼jsæ¬èº«çç¹è´¨ï¼ï¼æè æå¡ç«¯éè¦ä¸c++é åçï¼å¤§åæå¡ç«¯åºç¨ä¹å¯ä»¥ä½¿ç¨nestãnesté»è®¤æ¯ä¸éç¨å¾®æå¡çå½¢å¼çï¼nestå°ä¸åçå¹³å°å°å¨äºä¸åçplatformä¸ï¼è¿éåªåææ®éç以express为platformçå½¢å¼ï¼å¯¹äºå欢微æå¡çåå¦ï¼å¯ä»¥å¯¹æ¯åjavaçspringcloudçåºå«ï¼è¿éå°±ä¸å表述äºï¼å ¶æ´ä½çæ ¸å¿ç»æ大è´å¦ä¸ï¼
è¿é主è¦å¨å¯¹ä¾èµæ³¨å ¥çå®ç°åä¸ä¸ªç®åçç解å享ï¼å ¶æè·¯æ¯ä¸èç¸æ¿çï¼å¯¹äºç解å端ç念çä¾èµæ³¨å ¥æå¾å¥½çç解ï¼è¿ä¹æ£æ¯å端å端åçä¸ä¸ªä½ç°ï¼ä¹æ¯ææ©çMVCæ¡æ¶ååæ¥çMVVMæ¡æ¶è¿åº¦çä¸ä¸ªåå²è¿ç¨ï¼ä¾èµæ³¨å ¥æ¹å¼å¯¹äºææ©çå端æ¡æ¶è¿æ¯æ纪念æä¹çï¼ä½æ¯å¯¹äºngå ¨å®¶æ¡¶æ¥è¯´ï¼è¿ç®æ¯å ¶åºæ¬å²å¦çä¸ä¸ªåºæ¬é¢
bAngular/b
å æ¥çä¸ä¸ngæ¯å¦ä½å®ç°injectorçï¼è¿ééç¹å¨äºä½¿ç¨äºæ½è±¡ç±»æ¥éè½½ä¸åå½æ°ç使ç¨ï¼å¯¹äºprovider循ç¯ä¾èµçå¤çï¼å©ç¨äºä¸ä¸ªMapæ°æ®ç»ææ¥åºåä¸åçProvider
bNest/b
åæ¥çä¸ä¸ï¼nestçå®ç°ï¼ä¸åäºngçå®ç°ï¼nestæ¯å©ç¨åæ°å继æ¿ç¶ç±»åæ°æ¥ç¡®å®æ´ä¸ªç循ç¯ä¾èµå ³ç³»çï¼å ¶æ²¡æ使ç¨éè½½æ¥å®ç°ï¼ä½é½å¯¹å¾ªç¯ä¾èµåäºå¤çï¼å ¶åºæ¬æè·¯æ¯ä¸è´çã
æ»ç»ï¼ä»nestång对injectorçå®ç°å¯ä»¥çåºï¼è½ç¶é½æ¯æ³¨å°å¨çå®ç°ï¼ä½æ¯ç±äºåç°æ¹å¼çä¸åï¼å èå¨å®ç°æ¹å¼ä¸ä¹ä¼ææä¸åï¼å¯¹äºtsèè¨ï¼éç¨interfaceè¿æ¯æ½è±¡ç±»ï¼ç¡®å®å¯ä»¥åé´javaç模å¼æè·¯ï¼å¯¹äºä¹ æ¯jsçæ们æ¥è¯´ï¼å¯¹äºæ´ä¸ªæ°æ®ç±»åçæ©å±ï¼å¦ï¼æ½è±¡ç±»ãæ¥å£ï¼çæ¯éè¦åå端åé´çãæ´ä½æ¥è¯´ï¼å¯¹äºä¾èµæ³¨å ¥çå®ç°æå ³é®çå°±æ¯å¨äºå¤çproviderçæ´ä¸ªä¾èµé®é¢ï¼è¿ä¸¤è é½æ¯éç¨tokençæ¹å¼æ¥åºåå¯¹å¾ å°åºæ¯å±äºåªä¸ä¸ªproviderï¼ç¶å对äºç¹æ®çç¸å ³ä¾èµå¾ªç¯çé®é¢å对åºçå¤ç
ngæ´ä¸ªçæä½ç³»å¨å½å åºç¨ç并ä¸å¹¿ï¼ä½å¹¶ä¸å¦¨ç¢å ¶ä½ä¸ºå端ç念çæ©å±å è¡è çè¿æ ·ä¸ä¸ªè§è²ï¼ä¸ªäººè®¤ä¸ºå ¶å¨é离æ§ä»¥åç³»ç»æ§æ¹é¢é½æ¯è¦ä¼äºvueåreactçï¼å è对äºç®åæ¯è¾æµè¡çå¾®å端æ¡æ¶(ps:对äºngçå¾®å端åºç¨ï¼å¯ä»¥åèè¿ç¯æç« ã第æã使ç¨Angularæé å¾®å端æ¶æçToBä¼ä¸çº§åºç¨)ï¼ä¸ªäººè§å¾å¨æ²ç®±é离çç³»ç»èåæ¹é¢ç¡®å®å¯ä»¥åé´ä¸ä¸ngçæäºæè·¯ï¼æ许æ£æ¯ç±äºè¿ä¸ªåå ï¼å®ææ¯ä¸å¤§æ¡æ¶ä¸æå ä¸tsçï¼ä¹æå¯è½æ´ä¸ªngçå¼åè æ´åæ¯ä¼ ç»ç软件工ç¨å¸ï¼å¯¹äºæ´ä¸ªå¼åè¦åå°å®ä¹æ°æ®ãå®ä¹æ¨¡åãç³»ç»è®¾è®¡ççï¼å¯¹äºå¤§å项ç®èè¨ï¼è¿æ ·ç¡®å®ä¼åå°å¾å¤å bugèéè¦éå¤ä¿®æ¹çæ¶é´ï¼ä½æ¯å¯¹äºå°å项ç®ï¼ä¸ªäººè®¤ä¸ºè¿æ¯vueæ´åéãè½ç¶å¯¹äºå½å ï¼ngåºæ¬å·²ç»å±äºææ¥é»è±äºï¼ä½æ¯å®çä¸äºç念å设计æ路确å®è¿æ¯å¼å¾åé´çï¼å¨è¿ä¸ªå å·çæ¶ä»£ï¼å大åºç¨é½å¨åçé«çº§åã大åååå±ï¼è¯´ä¸å®åªå¤©ngåå¨å½å éåå· å³°äºå¢ï¼è½ç¶å¾é¾~~åååï¼åä½å æ²¹ï¼
å大éé¸è®¾è®¡å¹è®ï¼nodeç¼ç¨å¼åææ¯çåå±è¶å¿ï¼nodeææ¯æ为webå端é¢åç主æµå¼åå·¥å ·å¯ä»¥è¯´æ¬èº«å°±æ¯ä¸ä¸ªç¾ä¸½ç误ä¼ï¼å½åè¿ä¸ªææ¯è¢«å¼ååºæ¥ä½¿ç¨çæ¶å主è¦æ¯ä¸ºäºè§£å³å端çé®é¢æåºç°çã
ä»å¤©ï¼æµåjava课ç¨å¹è®æºæå°±ä¸èµ·æ¥äºè§£ä¸ä¸nodeææ¯çåå±åç¨åæªæ¥çåå±è¶å¿ã
a)Node8è¿å ¥LTSæ¶ä»£Node.js大çååæ¯è¿å ¥Node8æ¶ä»£ï¼å®æ¯ä¸ä¸ªç¨³å®çé¿ææ¯æçæ¬(LTS)ï¼é¤äºæ§è½æåå¤ï¼è¿æ以ä¸å 个è¦ç¹ã
Async/Awaitæ¯æã
å ¶å®å¨Node.jsv7.6å°±å¯ä»¥éè¿flagæ¯æäºï¼å¨node8éç´æ¥è½å°ã
éè¿Asyncå½æ°å¯ä»¥æ´å¥½çè¿è¡å¼æ¥æµç¨æ§å¶ï¼è¿ç¦»CallbackHellã
å¨Asyncå½æ°éï¼ä½ å¯ä»¥éè¿awaitè°ç¨Promiseï¼ä»¥åéè¿coå 裹çgeneratorï¼å¯ä»¥è¯´ï¼ååæ¯å®ç¾çAsyncå½æ°ï¼ååä¹å®ç¾å ¼å®¹åç§éç代ç ï¼ç§°ä¸ºå¼æ¥ç»æ解å³æ¹æ¡ä¸ä¸ºè¿ã
ES6模åæ¯æã
éè¿vue/reactãwebpackãbabelåtypescriptçç«çåå±ï¼es6模åå¾å°äºå¹¿æ³æ®åååºç¨ï¼å¨Node.jsv8.5å¯ä»¥éè¿--experimental-modulesæ¥å¼å¯è¿ä¸ªä½éªçç¹æ§ã
å½ç¶ï¼ä½ æ³å¨Node.jsæ´æ©çæ¬é使ç¨ES6模åï¼å¯ä»¥éç¨@std/esm模åã
HTTP2æ¯æã
å¨Node.jsv8.8å°±å¼å§é»è®¤å¯ç¨äºï¼http2对æå¡å¨ç«¯æ¨éï¼å¤ééå¤ç¨çç¹æ§ï¼è½å¤æ´å¥½å°ä¸ºæµè§å¨ä¾¿å©ï¼æ¯æ§è½ä¼åçå©å¨ã
b)ä¼ä¸çº§Webå¼ååºç¡æ¡æ¶é¤äºåºç¨å¹¿æ³ç主æµWebæ¡æ¶Koaå¤ï¼Fastifyä¹æ¯ä¸ç´å²æï¼ä½è MatteoCollinaæ¯Node.jsæ ¸å¿å¼åï¼Streamæé¨ï¼æ§è½ä¼åä¸å®¶ã
FastifyåºäºSchemaä¼åï¼å¯¹æ§è½æåæå ¶ææ¾ã
ç¼å认为è¿æ¯ä¼ä¸çº§Webå¼åï¼ä»å¨è¿éç»æ们ä»ç»äº3个ç¥åæ¡æ¶ã
b1)Egg.jsé¿éå¼æºçä¼ä¸çº§Node.jsæ¡æ¶Eggåå¸2.0ï¼åºäºKoa2.xï¼å¼æ¥è§£å³æ¹æ¡ç´æ¥åºäºAsyncFunctionã
æ¡æ¶å±ä¼åä¸å«Node8带æ¥çæåå¤ï¼å¸¦æ¥%å·¦å³çæ§è½æåã
Eggéç¨çæ¯ãå¾®å æ ¸+æ件+ä¸å±æ¡æ¶ã模å¼ï¼å¯¹äºå®å¶ï¼çæï¼å¿«éå¼åæææ¾æåï¼å¦å¤å¼å¾å ³æ³¨çæ¯ç¨³å®æ§åå®å ¨ä¸ï¼ä¹æ¯æ为åºè²çã
b2)NestNestæ¯åºäºTypeScriptåExpressçä¼ä¸çº§Webæ¡æ¶ã
å¾å¤äººå¼ç©ç¬è¯´ï¼Nestæ¯åJavaå¼åæ¹å¼çï¼ç¡®å®ï¼Nestéç¨TypeScriptä½ä¸ºåºå±è¯è¨ï¼TypeScriptæ¯ES6è¶ éï¼å¯¹ç±»åæ¯æï¼é¢å对象ï¼Decorator(类似äºJavaé注解Annotation)çæ¯æã
å¨åæ³ä¸ï¼ä¿æJavaå¼åè çä¹ æ¯ï¼è½å¤å¸å¼æ´å¤äººå¿«éä¸æã
TypeScriptæ¯æå ä¹æ¯ç®åææNodeWebæ¡æ¶é½è¦åç头ç大äºï¼å¨å¹´Nestç®ä¸ªç¥å项ç®ï¼å¼å¾ä¸æã
b3)ThinkJSThinkJSæ¯ä¸æ¬¾æ¥æ±æªæ¥çNode.jsWebæ¡æ¶ï¼è´åäºéæ项ç®ä½³å®è·µï¼è§è项ç®è®©ä¼ä¸çº§å¢éå¼ååå¾æ´å ç®åï¼æ´å é«æã
ç§æ¿ç®æ´æç¨ç设计ååï¼å¨ä¿æåºè²çæ§è½åè³ç®ç代ç åæ¶ï¼æ³¨éå¼åä½éªåæç¨æ§ï¼ä¸ºWEBåºç¨å¼åæä¾å¼ºæåçæ¯æã
ThinkJSæ¯å½äº§èçWebæ¡æ¶ï¼å¨å¹´æåå¸v3çæ¬ï¼åºäºKoaå æ ¸ï¼å¨æ§è½åå¼åä½éªä¸ææ´å¥½çæåã
æ´ä½æ¥çï¼Node.jså¨ä¼ä¸Webå¼åé¢åæ¥æ¸æçï¼æ 论微æå¡ï¼è¿æ¯Apiä¸é´å±é½å¾å°äºé常好çè½å°ã
å¹´ï¼å¯ä¸éæ¾çæ¯Node.jså¨servlessä¸è¡¨ç°çä¸å¤ªå¥½ï¼ç¸å ³æ¡æ¶å®è·µåå°ã
c)ä¸å¯ä¸è§çApiä¸é´å±å端è¶æ¥è¶å¤æï¼å端æå¡åï¼ä»æ¥çå端è¦é¢ä¸´æ´å¤çææã
ä¸ä¸ªå ¸åçåºæ¯å°±æ¯å¨æå¡åæ¶æéï¼å端é¢ä¸´ç头ççé®é¢æ¯å¼æAPIï¼åå端èè°çæ¶åï¼å¤ä¸ªå端äºç¸æ¨è¯¿ï¼è¦ä¹ææ ¢ä¸çº¿è¿åº¦ï¼è¦ä¹è®©å端æ§è½åå¾æå ¶æ ¢ã
è¿åº¦æ ¢æ¾å端ï¼æ§è½å·®ä¹æ¾å端ï¼ä½è¿ä¸ªé çç该å端æ¥èä¹?Node.jsçApiä¸é´å±åºç¨å¾å¥½å°è§£å³äºè¿ä¸ªé®é¢ã
å端ä¸æ³æ¹çæ¶åï¼å®å¨ä¸è¡å°±å端èªå·±åï¼æ´çµæ´»ï¼æ´è½åºåã
éä¼ æ¥å£ï¼å¯¹äºå ç½æè éå®å ¨æ¥å£ï¼å¯ä»¥éç¨ä¸é´å±éä¼ ã
èåæ¥å£ï¼å¯¹å¼æAPIå¤çé常æ¹ä¾¿ï¼å¦æè½å¤æ¢³çmodelï¼åºåæ´å®¹æã
Mockæ¥å£ï¼éè¿Mockæ¥å£ï¼æä¾å端å¼åæçï¼å¯¹æµç¨ä¼åæææå ¶ææ¾ï¼æ¯å¦å»åªå¿å¼åçyapiå°±æ¯ä¸é¨è§£å³è¿ä¸ªé®é¢çã
é¤æ¤ä¹å¤ï¼å端å¦ææ³åä¸äºææ¯é©±å¨çäºå¿ï¼SSR(æå¡å¨ç«¯æ¸²æ)åPWA(æ¸è¿å¼Webåºç¨)ä¹æ¯é常ä¸éçéæ©ã
d)æ°é¢å(深度å¦ä¹ ãåºåé¾ç)
基于Koa2打造属于自己的MVC框架
在轻量级的web框架如Express和Koa中,虽然部署快速,但随着项目复杂度增加,手动配置和目录结构的灵活性导致项目质量参差不齐。为解决这些问题,社区出现了如Egg.js和Nest.js这样的上层框架。我所在的公司基于Koa并结合业务需求,构建了一套MVC开发框架,专注于BFF层,简化Koa配置,集成通用组件如身份验证和代理转发,采用约定的目录结构来组织路由和全局方法。
我通过深入研究和实践,实现了自己的MVC框架my-node-mvc。框架的核心在于通过传入routes和middlewares参数,指导框架处理路由和启用中间件。例如,访问`http://localhost:`时,会经过自定义中间件,然后匹配`routes.js`中的路径,调用`controllers/home.js`中的`index`方法,最终渲染`views/home.html`。此外,它能自动注入Controller和Services,简化了服务和路由的管理。
my-node-mvc框架的实现分为几个步骤,从基础的Koa继承和路由配置开始,逐步添加内置中间件、全局方法和服务注入。通过这个过程,我们了解到如何在Koa的基础上构建一个可扩展的MVC结构。如果你对Koa源码有一定了解,可以参考之前的教程来跟进。
总结来说,本文分享了如何基于Koa2构建基础MVC框架,为开发者提供一个开发和定制的基础,后续可以在此基础上扩展和优化,如创建模板和脚手架工具,以提升开发效率和项目一致性。通过整合通用业务中间件,my-node-mvc框架能显著降低开发和运维成本。
åç§å¤§ä¾ ï¼ make a cozy little nest å¦ä½ç¿»è¯ï¼è°¢è°¢äº
æä¸ä¸ªæ åæ¥è¡¡éäºæ ï¼å¾å°ä»£ç ï¼é ç½®æ件ãè¿å¯è½ä¸æ¯ä¸ä¸ªå¥½çéæ©ï¼å³ä½¿æ¨¡å¼ä¸ºå¤åç§çxmlé ç½®æ件å¯ç ä¸æ ç¾æå±æ§å称<password> ã
使用 JWT 实现注册与登录
本文将指导您在 Nest 项目中实现JWT(JSON Web Tokens)的注册与登录功能。首先,让我们了解注册流程:创建一个名为"user"的模块,定义用户实体(User.entity.ts)包括必要的字段,如uuid、用户名和密码,其他字段暂设为可空。在"user.controller.ts"中,定义/register路由接收用户输入,使用CreateUserDto作为参数。
用户注册逻辑在"user.service.ts"中实现,检查用户是否存在,如果已存在返回自定义错误码,否则将用户信息添加到数据库。通过Apifox模拟注册请求,确认数据成功存储。然而,实际项目中,密码需要加密,使用"crypto"库进行处理,并在数据库插入前对密码进行加密。
登录方面,用户输入用户名和密码,后端验证并生成JWT token。通过安装@nestjs/jwt,配置JWT密钥,并创建"auth"模块,定义/login接口,调用UserService查询用户信息。在"auth.service.ts"中,进行用户验证和JWT生成。
为了验证JWT,我们创建了一个全局守卫AuthGuard。通过"nest g gu auth"生成一个全局守卫,用于拦截并检查请求头中的token。部分接口需要特殊处理,如注册和登录,可以使用元数据装饰器@Public进行标记,允许无token访问。
最后,虽然本文仅给出了基础实现,完整的NestJS登录注册功能会在Vue3+NestJS全栈开发后台权限管理系统的后续更新中详细讲解。源码地址供您参考。