如何用 Refine CLI 的 swizzle 命令把默认组件导出到项目中二次定制?
如何用 Refine CLI 的 swizzle 命令把默认组件导出到项目中二次定制【免费下载链接】refineA React Framework for building internal tools, admin panels, dashboards B2B apps with unmatched flexibility.项目地址: https://gitcode.com/GitHub_Trending/re/refine如果你在用 Refine 搭建后台管理项目会发现 UI 包如refinedev/antd提供的Layout、Sider、AuthPage、各类按钮等组件大多可以直接使用但一旦默认实现满足不了你的业务比如想改侧边栏结构、换掉默认错误页总不能去改node_modules里的源码。Refine CLI 的swizzle命令解决的就是这个问题它把 Refine 包里指定组件的源码弹射eject到你项目的src目录下之后你可以像修改自己的代码一样修改它。本文覆盖两个前提场景项目是用create refine-app创建的CLI 默认内置可直接执行项目是已有的 Refine 项目需要先补装 CLI。准备工作确保项目里能执行 refine 命令用create refine-app创建的 Refine 项目已经自动安装了 CLI直接运行命令即可。如果是在现有项目中加装 CLI按 开发指南 的说明步骤如下npm i refinedev/cli然后在项目package.json的scripts中加入refine命令{ scripts: { refine: refine } }装完后可以跑npm run refine查看可用命令其中包含swizzle Export a component or a function from refine packages to customize it in your project执行 swizzle两步选择导出源码在项目根目录运行npm run refine swizzle命令进入交互式流程共两步选择。第一步选择要 swizzle 的包。CLI 只会列出当前项目node_modules中已安装、且带有 swizzle 配置的 Refine 包按分组如Data Provider、UI Framework展示? Which package do you want to swizzle? (Use arrow keys or type to search) Data Provider ◯ refinedev/simple-rest UI Framework ◉ refinedev/antd第二步选择要导出的组件。组件按分组列出例如? Which component do you want to swizzle? ◯ TagField ◯ TextField ◯ UrlField Other ◯ Breadcrumb ❯◉ Layout Pages ◯ ErrorPage ◯ AuthPage以上两步以官方文档中的refinedev/antdLayout为例。各 UI 包具体提供哪些可 swizzle 的组件由包内的 swizzle 配置决定可以查看对应包的配置了解清单例如 antd 包的 swizzle 配置 中列出了ShowButton、CreateButton、Layout等条目每个条目定义了源文件src和导出目标路径dest。结果验证确认文件已生成并查看提示信息swizzle 完成后终端会打印状态、新建的文件列表和一条提示。以Layout为例文档中的示例输出是Successfully swizzled Layout Files created: - src/components/layout/sider.tsx - src/components/layout/header.tsx - src/components/layout/title.tsx - src/components/layout/index.tsx Warning: If you want to change the the default layout; You should wrap your pages with layout/index.tsx inside Refine component.注意以上为官方文档展示的示例结果你实际导出的文件列表取决于所选组件。验证要点第一行是Successfully swizzled 组件名。如果部分文件失败会显示Swizzle completed with errors for 组件名全部失败则显示Swizzle failed for 组件名失败文件前会带[FILE_ALREADY_EXISTS]、[SOURCE NOT FOUND]等状态标记见 CLI 输出实现。到项目目录确认文件确实生成了。默认框架react/vite、next.js下路径在src/下如果项目使用remix对应路径会是app/components/layout这类位置——CLI 会根据检测到的框架决定目标目录前缀。生成的文件经过导入重排和 Prettier 格式化可直接参与项目编译而不是原始拷贝。把 swizzle 后的组件接入自己的代码swizzle 只是把文件导出到你的项目包的默认导出不会自动切换需要手动替换引用。以Layout为例文档给出的接法是在App.tsx中导入 swizzle 出来的组件并在Refine内部用它包裹页面import { Layout } from components/layout; const App () { return ( Refine /* ... */ Layout {/* ... */} Layout /Refine ); };之后对这些文件做的任何修改改侧边栏、加 Header 元素等都会直接生效在项目里不再依赖包内实现。限制与常见问题以下是文档中明确给出的 swizzle 约束执行前需要了解单向操作一旦 swizzle 了某个组件后续保持它更新、修复其中出现问题的责任在你自己CLI 不会同步上游变更。不覆盖已有文件如果目标目录下已存在同名文件swizzle 会跳过该文件并标记[FILE_ALREADY_EXISTS]不会覆盖你已修改过的代码。可随时切回默认实现只需把 import 改回包里的原始导出即可swizzle 出的文件保留与否不影响回退。CLI 找不到可 swizzle 的包运行后若输出No Refine packages found with swizzle configuration.说明项目里没有安装带 swizzle 配置的 Refine 包选中某个包但输出No swizzle items found for ...时说明该包没有配置可导出的条目。依赖包自动补装部分组件配置了requiredPackagesswizzle 时 CLI 会自动安装这些依赖留意安装输出。另外一个判断点如果你只是想给Sider加一个自定义元素而不需要整块重写布局文档 给出的替代路径是用renderprop无需 swizzle 整个组件import { Sider } from refinedev/antd; const CustomSider () { return ( Sider render{({ items, logout, collapsed }) { return ( divMy Custom Element/div {items} {logout} / ); }} / ); };轻量定制用render这类 props整块重写才走swizzle这是文档中区分两种做法的依据见 FAQ 中的 Sider 定制说明。参考文档CLI 命令参考swizzle 用法与交互示例开发指南Using swizzle 与单向操作注意事项自定义布局教程antd 包 swizzle 配置示例swizzle 命令实现【免费下载链接】refineA React Framework for building internal tools, admin panels, dashboards B2B apps with unmatched flexibility.项目地址: https://gitcode.com/GitHub_Trending/re/refine创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考