@salla.sa / twilight-components-react
Salla暮光Web组件的React包装器,完全支持SSR。
安装
npm install @salla.sa/twilight-components-react
# or
pnpm add @salla.sa/twilight-components-react
使用
客户端(CSR)
import { SallaButton, SallaModal, SallaAlert } from '@salla.sa/twilight-components-react';
function App() {
return (
<div>
<SallaButton fill="solid" color="primary">
Click Me
</SallaButton>
<SallaModal isOpen={false}>
Modal Content
</SallaModal>
</div>
);
}
摇树(优化导入)
生成的组件包括 'use client' 指令用于Next.js应用路由器兼容性。所有导入都已经针对摇树进行了优化:
// ✅ GOOD: Tree-shaking works automatically
import { SallaButton, SallaModal } from '@salla.sa/twilight-components-react';
// ❌ BAD: Imports everything (avoid this)
import * as Twilight from '@salla.sa/twilight-components-react';
服务器端呈现(SSR)
1. Next.js设置
选项A:使用 next/dynamic (推荐)
// components/SallaButton.tsx
import dynamic from 'next/dynamic';
export const SallaButton = dynamic(
() => import('@salla.sa/twilight-components-react').then(mod => mod.SallaButton),
{ ssr: false }
);
// Usage
import { SallaButton } from '@/components/SallaButton';
export default function Page() {
return <SallaButton>Add to Cart</SallaButton>;
}
选项B:使用 'use client' 指令(应用路由器)
// components/SallaProvider.tsx
'use client';
export { SallaButton, SallaModal, SallaAlert } from '@salla.sa/twilight-components-react';
// app/page.tsx (Server Component)
import { SallaButton } from '@/components/SallaProvider';
export default function Page() {
return <SallaButton>Server Rendered Button</SallaButton>;
}
选项C:与水合模板完全水合
// app/layout.tsx or pages/_document.tsx
import { hydrate } from '@salla.sa/twilight-components/hydrate';
// For App Router (layout.tsx)
export default async function RootLayout({ children }) {
// Hydrate on server
return (
<html lang="en">
<head>
<script
dangerouslySetInnerHTML={{
__html: `
import('@salla.sa/twilight-components/hydrate').then(m => m.hydrate());
`
}}
/>
</head>
<body>{children}</body>
</html>
);
}
2. 自定义SSR设置
// server.ts
import express from 'express';
import { hydrateToString } from '@salla.sa/twilight-components/hydrate';
const app = express();
app.get('*', async (req, res) => {
const html = `
<!DOCTYPE html>
<html>
<body>
<salla-button>Add to Cart</salla-button>
</body>
</html>
`;
// Hydrate on server
const hydratedHtml = await hydrateToString(html, '/');
res.send(hydratedHtml);
});
3. Vite SSR设置
// entry-server.ts
import { hydrateToString } from '@salla.sa/twilight-components/hydrate';
export async function render(url: string) {
const html = `
<div id="app">
<salla-button>Click Me</salla-button>
</div>
`;
return await hydrateToString(html, url);
}
完整的SSR示例与Next.js
第一步:制作补水产品
// providers/SallaProvider.tsx
'use client';
import { useEffect } from 'react';
export function SallaProvider({ children }: { children: React.ReactNode }) {
useEffect(() => {
// Import and hydrate on client
import('@salla.sa/twilight-components/hydrate').then(({ hydrate }) => {
hydrate();
});
}, []);
return <>{children}</>;
}
步骤2:在布局中使用
// app/layout.tsx
import { SallaProvider } from '@/providers/SallaProvider';
export default function RootLayout({
children,
}: {
children: React.ReactNode
}) {
return (
<html lang="en">
<body>
<SallaProvider>
{children}
</SallaProvider>
</body>
</html>
);
}
步骤3:使用组件
// app/page.tsx
import { SallaButton, SallaProductCard } from '@salla.sa/twilight-components-react';
export default function Home() {
return (
<main>
<SallaButton fill="solid" color="primary">
Add to Cart
</SallaButton>
<SallaProductCard
product-id="123"
show-quick-add
/>
</main>
);
}
避免水合不匹配
当使用SSR与定制元素,包裹组件,以避免水合误差:
// components/SafeSalla.tsx
'use client';
import { useEffect, useState } from 'react';
import { SallaButton } from '@salla.sa/twilight-components-react';
export function SafeSallaButton(props: any) {
const [mounted, setMounted] = useState(false);
useEffect(() => {
setMounted(true);
}, []);
if (!mounted) {
// Return placeholder during SSR
return <button {...props}>{props.children}</button>;
}
return <SallaButton {...props} />;
}
可用的组件
所有组件 @salla.sa/twilight-components 都可以作为React组件使用:
SallaButton-可自定义按钮SallaModal-模态对话框SallaDrawer-侧抽屉SallaAlert-警报通知SallaProductCard-产品卡片显示SallaCartSummary-购物车摘要SallaComments-评论部分SallaReviews-产品评论- 和更多的……
束的优化
推荐:摇树与个人进口
// ✅ Best - Tree-shake unused components
import { SallaButton } from '@salla.sa/twilight-components-react';
组件组(包)
为了更好地缓存,这些组件被捆绑在一起:
| 包 | 组件 |
|---|---|
| UI的核心 | 小按钮,小装载,小模式,小抽屉,小手风琴,小面包屑 |
| 形式 | sall_file -upload, sall_date - time-picker, sall_color -picker, sall_condition -fields, sall_tel_input, sall_quantity -input, sall_book_field |
| 评论 | 萨拉-评论,萨拉-评论表单,萨拉-评论项目,萨拉-评论,萨拉-评论页面,萨拉-评论摘要,萨拉-星级,萨拉-评论卡 |
| 产品 | Salla-add-product-button, salla-product-options, salla-product-availability, salla-quick-buy |
| 车 | salla-cart-summary, salla-cart-item-offers |
| 警报 | salla-alert, salla-bottom-alert |
打印稿的支持
包含完整的TypeScript支持:
import type { JSX } from '@salla.sa/twilight-components';
interface ButtonProps extends JSX.SallaButton {
onClick?: () => void;
}
相关的包
@salla.sa/twilight-components-本地web组件@salla.sa/twilight-components/hydrate- SSR水化设施