私有项目怎么写成公开技术文章
真实项目比练习项目更有文章价值,因为它遇到过兼容、历史数据、弱网和多人协作等真实问题。但直接复制源码,很容易顺带公开内部接口、业务规则或用户数据。
安全写作不是把所有内容都写得模糊,而是:保留问题和解决方法,重新整理代码和数据。
读完你能解决什么
- 判断哪些项目代码可以公开;
- 把真实代码缩成读者容易理解的示例;
- 区分“项目已经做到”和“文章推荐这样做”;
- 在发布前检查文本、图片和构建产物。
哪些内容不能直接发布
| 内容 | 常见位置 | 处理方式 |
|---|---|---|
| 密钥、Token、证书 | 配置、SDK、私钥文件 | 完全删除,不做打码展示 |
| 域名、IP、端口 | 环境配置、请求封装 | 改成 example.test |
| 客户和员工数据 | 日志、接口响应、截图 | 使用全新合成数据 |
| 内部表名和字段 | SQL、模型、迁移脚本 | 为文章重新设计简单模型 |
| 真实业务常量 | 状态码、金额、角色编码 | 改成通用状态和演示数值 |
| 本机路径 | 错误栈、终端、构建日志 | 改成相对路径 |
| 内部品牌和模块 | 类名、路由、图片 | 使用中性名称 |
删除公司名还不够。一个真实接口路径、一段错误文案或一张后台截图,也可能暴露系统用途。
把“取材”和“公开文章”分开
推荐准备两份内容:
text
私有源码
↓ 只读检查
内部底稿:记录事实和本地出处,不发布
↓ 提炼问题与方法
公开文章:使用重新整理的代码和合成数据内部底稿只需要写:哪个文件证明了什么。不要把整个函数、配置值或真实日志复制进去。
底稿必须位于站点发布目录之外,并通过本地忽略规则避免被提交。
先区分三种内容
已验证事实
源码可以直接证明,例如:
text
项目使用 Vue 2 和 Vue Router 3。
请求统一经过一个 Axios 实例。
小程序使用 app.json 声明分包。工程判断
根据多处实现得出的结论,例如:
text
全局入口注册内容过多,会增加启动依赖和维护成本。推荐做法
文章提出的改进,不一定已经在项目落地:
text
可以增加 outbox,记录提交后仍需执行的外部任务。文章要明确写“项目中已有”还是“建议增加”,不要把目标方案写成现状。
示例不能只改变量名
假设原项目里有一段很长的提交逻辑,其中包含真实角色、业务状态和接口参数。
不推荐这样处理:
text
复制原函数
→ 把 Customer 改成 User
→ 把真实 URL 改成 demo URL
→ 其他结构全部保留它仍可能暴露原来的控制流和特殊规则。
更安全的做法是只保留文章要解释的概念,从空文件重新写:
js
const running = Object.create(null)
export function runOnce(key, task) {
if (running[key]) return running[key]
const clear = () => { delete running[key] }
const promise = Promise.resolve().then(task).then(
value => {
clear()
return value
},
error => {
clear()
throw error
}
)
running[key] = promise
return promise
}这段代码只解释“同一任务复用进行中的 Promise”,没有真实业务模型和接口。双分支清理也能兼容未提供原生 Promise.prototype.finally 的旧 WebView。
怎样展示项目代码
可以展示下面几类片段:
- 框架入口和生命周期的典型结构;
- 通用请求、错误处理和提交锁;
- 不含业务规则的路由拆分方式;
- 纯函数,例如日期、金额或状态转换;
- 为文章重新编写的最小复现测试。
每段代码前明确说明:
以下代码根据真实项目中的模式重新整理,已删除业务名称、接口参数和内部数据。
代码越短越好。读者应该一眼看出它证明什么。
示例数据要完全新建
不要把真实手机号改成星号,也不要从生产日志中挑一条“看起来不敏感”的记录。
使用全新的合成数据:
json
{
"actorId": "user_demo_17",
"operationId": "op_demo_42",
"status": "pending",
"amountMinor": 12990
}金额、时间、数量和状态都不应复刻真实分布。
地址和配置怎么写
URL 使用保留用途域名:
text
https://api.example.test/v1/resources路径使用相对目录:
text
src/modules/example/
server/Application/Example/环境变量只展示名称和无效占位符:
dotenv
APP_ENV=development
API_BASE_URL=https://api.example.test
SESSION_SECRET=<provided-by-deployment-platform>不要为了“示例能直接运行”放一个固定测试密钥。它很容易被复制到真实项目。
图和截图也可能泄密
截图经常包含:
- 浏览器地址栏;
- 登录账号和通知;
- 真实菜单、品牌和客户信息;
- 终端用户名与绝对路径;
- 二维码、条码和图片元数据。
最安全的方法是使用合成数据重新画一张小图:
text
页面 → 请求适配层 → 业务服务 → 数据库
└──────▶ 外部服务如果必须截图,使用专门的演示环境,并检查裁剪后的原文件,而不是只看网页中的缩略图。
发布前做两种扫描
敏感特征扫描
在本地搜索真实项目名、域名、IP、绝对路径和密钥特征:
bash
rg -n -i \
'private-project|internal\.example|PRIVATE KEY|API_SECRET' \
docs/真实敏感词清单保存在本地,不要为了扫描又把它提交到公开仓库。
与源码做长片段比对
把文章中的长代码行或连续多行与私有源码做本地精确比对。如果有命中,确认它是否真的是可以公开的通用代码。
扫描报告只输出文章行号和来源文件,不要再次打印敏感原文。
还要检查构建产物
Markdown 没有问题,不代表生成的网站没有问题。构建后继续检查:
- 搜索索引是否包含内部底稿;
- Source Map 是否带本机路径;
- 打包后的环境变量是否含真实地址;
- 图片附件是否带元数据;
- 页面和导航是否存在死链。
text
扫描源文件
→ 本地构建
→ 检查构建日志
→ 扫描 dist
→ 打开关键页面
→ 查看 Git 待提交文件一篇文章的简单生产流程
- 先写一个通用问题,例如“弱网下怎样防止重复提交”;
- 只读检查直接相关的入口、工具和测试;
- 在内部底稿记录事实和来源;
- 提炼一个可以跨项目使用的不变量;
- 从空文件重新写最小代码;
- 使用合成数据和中性名称;
- 第一轮检查技术正确性;
- 第二轮只检查信息安全;
- 构建并扫描最终产物;
- 只提交公开文章和必要导航。
发布检查清单
- [ ] 文章在讲通用问题,而不是介绍私有目录;
- [ ] 项目事实和推荐方案已经区分;
- [ ] 代码片段足够短,并已删除业务参数;
- [ ] 示例数据完全由作者生成;
- [ ] 没有真实域名、IP、账号和绝对路径;
- [ ] 图片、二维码和附件已经检查;
- [ ] 内部底稿不在发布目录和 Git 暂存区;
- [ ] 源文件与构建产物敏感扫描通过;
- [ ] 站点构建和导航检查通过。
最后记住
公开技术文章真正应该分享的是:问题、约束、失败原因、解决方法和验证方式。
真实代码为文章提供证据,但不必把整个真实实现搬到网上。示例越聚焦,文章越容易理解,也越安全。