续:开源项目学习之 Next.js 企业级启动模版

大家好,我是一百个Chocolate。


上一期内容我们介绍了 next-enterprise 这个开源项目,里面还是有我们可以 pick 一下的内容,选择性的集成到自己的项目中,提升开发体验。


这次我们来看一下这个项目当中的 Issues 部分,如下:



我发现这里面还是有一些深度讨论的,大家和作者交流为什么要选择这个而不使用那个等等,我们一起来看一看。


先来到第一个问题:为什么不使用 Husky?


作者回复比较简单,就觉得相对与 git hooks 慢一点,不过我看国内社区许多配置开发环境都会用这个,这也看个人习惯,总归还是有人用的。


我也看了 antfu 的 VueUse 项目里,是没有配置 Husky 的,而是使用的 simple-git-hooks:



接着,来看下一个问题,是一位开发者建议能使用 Monorepo,也就是大仓,毕竟大仓启动模版要更复杂一点,从零开始配的话还是会花费比较多时间的,而 Monorepo 目前使用也挺多的,上面提到的 VueUse 以及 Vue3 等等,社区里面其实使用挺多的,企业级内部不管是国内还是国外都挺常见的。


作者也提到了会有计划使用 Turborepo 来配置,不过觉得不是所有的项目都需要大仓,而且大仓复杂度相对高一点,也就需要有架构师这样的角色在这个项目里面。

下面选取了作者的回复内容:


如果我们决定向它添加一个后端服务器,Monorepo 会很有意义,然后我们可以为共享类型 / 接口等创建一个包。但对于大多数项目,我认为,只有一个应用程序的 monorepo 会更累人,而不是有帮助。
在技术方面,我更喜欢采取更简单的路线,但我真的很乐意接受有关这方面的建议,因为我花了很多时间思考是否包括这一点。

不过后续又有一个老哥也支持了 Monorepo 的观点,觉得会更好的拆分代码,并且一个产品随着增长往往都会变得更加复杂,所以为什么不从一开始就考虑好呢?而不是做着做着发现这样不够优雅、那样不好复用。

不过我个人觉得其实真正放在企业里来看,不管开始考虑的多么完美,技术债总能在未来的某一天发生。不过技术也只是工具,还是得结合具体业务来看,就像作者所说,做一个全栈应用还是挺有意义的。


我们接着往下看看,有人问到了 App Dir 以及 Tailwind CSS 生态方面的问题。


也就是为什么不使用新版的 App Router,关于 ui 的选择,为什么没有选择像 Chakra 这样的 UI 库?因为 tailwindcss 给人感觉写起来太过拥挤了。


这确实是一个好的问题,我也会这样想,其实除了 Chakra UI 库,还有一个目前也比较火热:shadcn。


主页长这样:



配合 Next.js 开发体验也不错的,完全可定制化,我也打算在今后个人项目中去使用。虽然社区里有非常多优秀的组件库,你导入一下就可以使用,但是咱们设计师都有自己的风格,往往还是需要去做一层封装,


我们结合作者的观点来看看,首先是对于新版的 app 目录,他觉得也是比较推荐的,虽然项目中使用的是 pages router,但是示例代码非常简单,因此你完全可以很丝滑地去使用 App Router。


当时我看到就想确实没毛病,这个交由开发者自己来做选择,只是我没有提供示例而已,并不代表我不喜欢 App Router。


而对于 ui 库选择问题,作者很早就使用了 Chakra UI 库,不过打包体积问题以及性能没那么好于是选择了放弃。


而在该仓库中选择了 Radix UI,主页是这样的:



正如官网标题介绍:为什么要浪费时间去重塑 UI 组件呢?


我们在上文提及的 shadcn/ui,官网页面是有迭代更新的,GitHub README 这里还是之前的界面:



可以看到,shadcn 也基于了 Radix UI。


上文也提到了需要配置化的问题,平常我们安装组件库,他们通过 npm install 安装之后源码会在 node_modules 里面,而 shadcn 是可以直接将源代码添加到我们开发目录 components 下,那么我们完全就可以基于源码来修改,而不是套一层。


当然,实力足够强的开发根本不需要组件库,参考一下 shadcn 方式自己基于 tailwindcss 就能打造属于自己风格的 UI 了。


最后,来看看 tailwindcss 写法太过拥挤的问题,先给大家看下例子,这是我以前用 Next.js 写的一个 button 组件,来看看:



这还是我使用了 clsx 以及结合了业界都非常推荐使用的 tailwind merge 的呈现,如果只写在一行的话那确实太难看了,从头拉到尾。


不过现在比较常见的写法是可以配合 cva.style 来做到业务逻辑和样式进行分离,上文提到 shadcn 可以将源码放到 components 下嘛,也就是提供了手动方式,来看看他们的 button 示例代码:


import * as React from "react"
import { Slot } from "@radix-ui/react-slot"
import { cva, type VariantProps } from "class-variance-authority"

import { cn } from "@/lib/utils"

const buttonVariants = cva(
"inline-flex items-center justify-center rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",
{
variants: {
variant: {
default: "bg-primary text-primary-foreground hover:bg-primary/90",
destructive:
"bg-destructive text-destructive-foreground hover:bg-destructive/90",
outline:
"border border-input bg-background hover:bg-accent hover:text-accent-foreground",
secondary:
"bg-secondary text-secondary-foreground hover:bg-secondary/80",
ghost: "hover:bg-accent hover:text-accent-foreground",
link: "text-primary underline-offset-4 hover:underline",
},
size: {
default: "h-10 px-4 py-2",
sm: "h-9 rounded-md px-3",
lg: "h-11 rounded-md px-8",
icon: "h-10 w-10",
},
},
defaultVariants: {
variant: "default",
size: "default",
},
}
)

export interface ButtonProps
extends React.ButtonHTMLAttributes<HTMLButtonElement>,
VariantProps<typeof buttonVariants> {
asChild?: boolean
}

const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(
({ className, variant, size, asChild = false, ...props }, ref) => {
const Comp = asChild ? Slot : "button"
return (
<Comp
className={cn(buttonVariants({ variant, size, className }))}
ref={ref}
{...props}
/>
)
}
)
Button.displayName = "Button"

export { Button, buttonVariants }


可以看到定义了一个 buttonVariants 变量,而在我们 Button 组件中,我们可以简便地赋值给 className 了,如下:


// 省略...
<Comp
className={cn(buttonVariants({ variant, size, className }))}
ref={ref}
{...props}
/>

那么这就看个人使用习惯了,如果是要做 ui 组件库之类的,那么采用 cva.style 是一个不错的选择,但日常写写页面,我觉得 clsx 以及 tailwincss merge 也够用了。


以上就是本次分享的全部内容了,算是上一期的后续了,最近一直在看 RSC 相关的内容,后续会分享关于此块的系列内容,感谢您的阅读,have a good day!


#前端# #Next.js#

0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
下载 APP