公司想为一个产品做多个网站用免费工具避坑指南
网站被黑挂马不知道怎么办,这是很多运营刚接手多站点项目时的噩梦。凌晨两点收到报警,页面突然弹出赌博广告,后台被清空,域名被劫持,这时候再找开发团队,响应慢得让人绝望。其实,只要选对架构,配合几个靠谱的免费工具,这种风险能降低90%以上。
很多新手以为,做一个产品建个官网就完了。但实际业务中,公司想为一个产品做多个网站的情况非常普遍。比如针对B端客户做一个官网,针对C端用户做一个落地页,针对海外客户做一个独立站,甚至针对不同渠道投放做A/B测试页面。这时候,如果每个网站都独立部署、独立域名、独立代码库,维护成本会爆炸。更可怕的是,一旦其中一个站点被攻破,黑客可以横向渗透,把所有站点全端掉。
今天不聊虚的,直接拆解这种“一产品多站点”场景下的设计规范与前端实现。重点讲怎么通过统一的设计系统,用最低的成本,安全地管理多个网站。
设计原则:统一性胜过个性化
新手最容易犯的错误,就是觉得不同网站要有不同风格。官网要大气,落地页要活泼,海外站要极简。结果导致开发要写三套CSS,设计师要画三套图,运营要改三套文案。一旦产品迭代,三个站点都要同步改,漏改一个就是事故。
核心原则是:骨架统一,皮肤可变。
什么叫骨架?导航结构、栅格系统、间距规范、字体层级、交互反馈。这些必须统一。什么叫皮肤?主色调、Logo位置、Banner图片、文案语气。这些可以不同。
以我们之前服务的一个SaaS产品为例,他们有官网、定价页、帮助文档、社区论坛四个站点。这四个站点看起来风格迥异,但底层用的是同一套Design Tokens。比如间距,全站统一使用8px的倍数。导航栏高度统一为64px。按钮圆角统一为4px。只是官网用了深蓝色作为主色,定价页用了绿色,帮助文档用了灰色。
这样做的好处是什么?
第一,开发效率极高。前端只需要维护一套基础组件库。比如一个Button组件,传入不同的variant参数,就能渲染出不同风格的按钮。不需要为每个网站单独写样式。
第二,用户体验一致。用户从官网跳到定价页,再跳到帮助文档,操作逻辑是熟悉的。不需要重新学习“这个网站按钮在哪里点”、“这个网站怎么返回上一级”。
第三,安全隔离更容易。因为代码结构一致,我们可以统一接入Web应用防火墙(WAF)规则。只要发现某个IP访问模式异常,可以直接在网关层拦截,不用逐个站点排查。
很多新手问,那品牌辨识度怎么办?其实,真正的品牌辨识度来自于一致的交互体验和视觉节奏,而不是花哨的颜色。苹果的产品线,从Mac到iPhone到Watch,界面风格高度统一,但没人觉得它们没个性。
这里要强调一点,统一不是死板。允许每个站点有“品牌色”这个变量,但其他所有变量必须锁定。在设计规范文档里,要把“可变项”和“不可变项”列清楚。不可变项包括:栅格列数(比如12列)、间距单位(8px)、字体家族(Inter + PingFang SC)、行高比例(1.5)。可变项包括:Primary Color、Secondary Color、Logo Image、Font Size Scale(微调)。
布局与间距规范:8pt网格系统的实战应用
说完了原则,落地到具体布局。多站点最头疼的问题就是“对齐难”。A网站的卡片和B网站的卡片,看起来差不多,但边距差2px,视觉上就不舒服。
解决方案只有一个:8pt Grid System。
这不是什么高大上的理论,而是行业标配。为什么是8pt?因为8是2的三次方,便于二进制计算,也便于视觉分割。在Figma或Sketch里,设置基准网格为8px,所有元素的位置、大小、间距,都必须是8的倍数。
具体怎么执行?
- 页面边距:桌面端统一为80px(10个单位),平板端40px,手机端16px。不要为了“看起来宽敞”就设为85px,那会破坏系统的一致性。
- 组件内部间距:卡片内边距统一为24px。列表项之间间距16px。标签与文字之间8px。
- 区块间距:不同Section之间的垂直间距,统一为96px(桌面端)或48px(移动端)。不要一会儿60px,一会儿100px。
这里有个细节,很多新手忽略响应式断点。既然要做多个网站,断点必须统一。建议采用移动端优先策略,定义三个断点:
- Mobile: 0 - 767px
- Tablet: 768px - 1023px
- Desktop: 1024px+
在CSS中,用Media Query控制布局变化。比如,在Desktop端,导航栏是水平排列;在Tablet端,可能折叠为汉堡菜单;在Mobile端,导航栏隐藏,底部出现Tab Bar。
关键在于,所有站点的断点行为必须一致。你不能在官网里,导航栏在800px折叠;但在落地页里,导航栏在700px折叠。这会让前端开发崩溃,也会让用户困惑。
还有一个容易被忽视的点:容器宽度。桌面端内容区最大宽度建议限制在1200px或1280px。超过这个宽度,文字行长太长,阅读体验极差。多站点必须统一这个Max-Width,并在CSS中通过max-width: 1200px; margin: 0 auto;实现居中。
很多公司想为一个产品做多个网站,是为了做A/B测试。这时候,布局的细微差异(比如按钮颜色、标题大小)是可以变的,但布局结构不能变。你不能在A版本里把CTA按钮放在右边,在B版本里放在左边。A/B测试测的是“内容”和“样式”,不是“结构”。结构变了,你就测不出真实效果了。
色彩与字体:建立Design Tokens体系
色彩和字体是多站点视觉差异的主要来源,但也是最容易乱的地方。
新手常用的做法是,每个网站单独定义CSS变量。比如官网用#1890ff,落地页用#52c41a。问题在于,当品牌色调整时,需要去每个网站的代码里全局替换。一旦漏掉一个,就出现色差。
正确做法是建立Design Tokens。Design Tokens是一组具有语义的名称,用来保存设计决策。比如,不要直接用#1890ff,而是定义一个Token叫--color-primary。
在CSS中,可以这样写:
:root {--color-primary: #1890ff;--color-secondary: #52c41a;--color-background: #ffffff;--font-family-base: 'Inter', 'PingFang SC', sans-serif;--font-size-base: 16px;--font-size-lg: 20px;--spacing-unit: 8px;
}
然后,每个站点只需要覆盖--color-primary这个变量,其他所有依赖Primary颜色的组件(按钮、链接、高亮文字)会自动更新。
对于字体,建议全站统一使用Inter(西文)+ PingFang SC(中文)的组合。Inter是目前Web端最通用的无衬线字体,屏幕显示效果极佳。如果追求更高级感,可以用Manrope或Sora,但要注意加载体积。
字体层级(Type Scale)也要统一。建议采用1.25的比例尺:
- Body: 16px
- H4: 20px
- H3: 25px
- H2: 31px
- H1: 39px
- H0: 49px
这个比例在数学上是和谐的,视觉上也是舒适的。不要随意发明“23px”、“27px”这种奇怪的字号。
还有一个重要指标:对比度。WCAG(Web内容无障碍指南)要求正文文本与背景的对比度至少达到4.5:1。标题文本至少达到3:1。很多新手喜欢用浅灰色文字配白色背景,看着高级,但用户看不清。可以用WebAIM这个免费工具检测对比度。输入你的前景色和背景色,它会告诉你是否达标。
对于多站点,建议制作一份色彩规范表。列出每个站点的主色、辅助色、成功色、警告色、错误色。确保所有颜色都符合无障碍标准。
组件设计:原子化设计思路
组件是多站点复用的核心。这里推荐**原子化设计(Atomic Design)**的思路。
把UI拆分成五个层级:
- 原子(Atoms):按钮、输入框、标签、图标。
- 分子(Molecules):搜索框(输入框+按钮)、表单字段(标签+输入框+错误提示)。
- 有机物(Organisms):导航栏、页脚、卡片列表。
- 模板(Templates):页面布局,不含具体内容。
- 页面(Pages):填充真实内容的最终页面。
多站点复用,重点在于原子和分子层。比如,一个“价格卡片”组件,它由“标题原子”、“价格原子”、“按钮分子”组成。这个组件在官网、定价页、落地页都可以用。只是传入的参数不同:官网传入“标准版”,定价页传入“专业版”,落地页传入“限时优惠版”。
组件的API设计要清晰。以React为例:
// PriceCard.jsx
const PriceCard = ({ planName, price, features, buttonLabel, variant }) => {return (<div className={`price-card price-card--${variant}`}><h3>{planName}</h3><div className="price">¥{price}</div><ul>{features.map((feature, index) => (<li key={index}>{feature}</li>))}</ul><Button variant={variant}>{buttonLabel}</Button></div>);
};
variant属性控制样式。variant="primary"时,卡片边框加粗,按钮高亮;variant="secondary"时,卡片普通样式。这样,开发只需要写一套组件逻辑,就能适应不同站点的视觉需求。
还有一个关键点:状态管理。组件必须有明确的视觉状态:默认(Default)、悬停(Hover)、激活(Active)、禁用(Disabled)、聚焦(Focus)。多站点必须统一这些状态的样式变化。比如,所有按钮Hover时,透明度变为0.9;Focus时,出现2px的蓝色外圈。不要在这个网站Hover时变色,在那个网站Hover时位移。
前端实现:代码示例与部署优化
说了这么多理论,来看代码。假设我们用Vue 3 + Vite来构建多站点项目。
首先,项目结构建议采用Monorepo模式。用一个代码仓库,管理多个站点。
root/
├── packages/
│ ├── ui/ # 公共组件库
│ │ ├── src/
│ │ │ ├── components/
│ │ │ ├── tokens/
│ │ │ └── index.js
│ │ └── package.json
│ ├── site-official/ # 官网
│ │ ├── src/
│ │ │ ├── App.vue
│ │ │ └── main.js
│ │ └── vite.config.js
│ ├── site-landing/ # 落地页
│ │ ├── src/
│ │ └── vite.config.js
│ └── ...
├── package.json
└── pnpm-workspace.yaml
在packages/ui中,定义Design Tokens和基础组件。其他站点通过import { Button } from '@company/ui'引入。
这里展示一个关键的CSS变量注入逻辑。在main.js中,根据环境变量,动态设置品牌色。
// site-landing/src/main.js
import { createApp } from 'vue'
import App from './App.vue'
import { setTheme } from '@company/ui'// 从环境变量读取品牌色,或者通过接口获取
const brandColor = import.meta.env.VITE_BRAND_COLOR || '#52c41a'setTheme({primary: brandColor,// 其他Token
})createApp(App).mount('#app')
这样,同一个组件库,在不同站点运行时,会自动应用不同的主题。
性能优化是多站点的另一大痛点。多个网站共用资源,但每个站点的体积要控制在合理范围。
- 代码分割:Vite默认支持。路由懒加载,确保首页只加载必要的JS。
- 图片优化:使用WebP格式。对于不同站点的Logo,不要重复上传。使用CDN统一管理静态资源。
- 字体子集:使用Font Squirrel或Fontjoy生成字体子集,只包含用到的字符。中文页面尤其要注意,完整的中文字体包可能超过2MB,必须裁剪。
安全方面,结合前面提到的“网站被黑挂马”问题。
多站点部署,建议采用Docker容器化。每个站点打包成独立的Docker镜像,部署在K8s集群或云原生服务器中。这样,即使一个站点被攻破,容器隔离能防止横向渗透。
在服务器层面,必须配置**CSP(Content Security Policy)**头。CSP能限制页面只能加载指定来源的资源,防止XSS攻击。
在Nginx配置中,加上:
add_header Content-Security-Policy "default-src 'self'; script-src 'self' https://cdn.example.com; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:;";
参考阿里云官方文档关于Web应用防火墙的说明,建议在网关层配置SQL注入和XSS过滤规则。对于多站点,可以将这些规则统一配置在Ingress层,而不是每个应用内部。
另外,SSL证书必须全站启用。对于多域名,可以使用Let's Encrypt的免费通配符证书,或者购买支持多域名的OV证书。确保所有子域名都覆盖到。
最后,监控。接入Sentry或阿里云ARMS,实时监控前端错误和性能指标。多站点最怕的就是“静默失败”,比如某个API在A站点正常,在B站点报错,但用户没反馈,开发也不知道。有了监控,问题会在发生的第一时间被发现。
公司想为一个产品做多个网站,本质上是一个“工程化”问题,而不是“设计”问题。设计只是表象,底层的架构、规范、工具链,才是决定成败的关键。用免费工具(如Figma做设计系统、Vite做构建、Docker做部署)完全足够,关键是执行要严格。
别指望“一次性”做完多站点。先建好Design System,再逐步迁移各个站点。每迁移一个站点,就验证一次规范的有效性。
还有什么建站疑问?评论区留言挨个回。