xiaohanyu 最近的时间轴更新
xiaohanyu

xiaohanyu

V2EX 第 33155 号会员,加入于 2013-01-27 22:01:04 +08:00
今日活跃度排名 27195
PPResume 新年更新:新增两款简历模板
  •  2   
    分享创造  •  xiaohanyu  •  62 天前  •  最后回复来自 xiaohanyu
    8
    SaaS 产品集成 Stripe 支付的一些坑
    Stripe  •  xiaohanyu  •  140 天前  •  最后回复来自 xiaohanyu
    19
    Safari 的 bug 真是茫茫多
  •  1   
    Safari  •  xiaohanyu  •  259 天前  •  最后回复来自 xiaohanyu
    12
    xiaohanyu 最近回复了
    技术上的事情不说了,有基础经验的程序员想学基本上都能学得会。

    说几个营销和财税法方面的难点吧。

    营销:
    1. 提交导航站,除了 producthunt 打榜,别的导航站流量基本都比较差,自己分不到多少流量,而 producthunt 打榜本身又需要很多技巧 + 流程 + 人脉
    2. 社交网络,个人的话,如果是个素人,起号会很慢;如果是官方机构号,恐怕维护成本也不小吧
    3. reddit:大部分高流量的版块都有 no self promotion 的规则,直接发推广的话大概率封版或者封号
    4. blog/SEO ,太慢,而且得写好多篇才慢慢有些效果,ahrefs 的一个参考数据,大部分在 Google 上排名前几的网页,需要 2-3 年才可以,https://ahrefs.com/blog/how-long-does-it-take-to-rank/
    5. 国内的各种“私域”:微信公众号/小红书这种禁止外链的就不多说了吧
    6. 邮件营销:冷邮件一来大概率会被 spam ,二来现在数据合规性的要求越来越高,没有 user consent 直接批量发推广邮件应该是不合规的,GDPR 这种;而经营邮件列表来获得 user consent 本身就是一个 full time job
    7. v2ex:你看看现在多少做垃圾站的已经把 V2EX 当成外链农场了?你能发,别人也能发,这种外链质量和引流都不高的
    8. KOL:大部分都要钱吧,ruanyifeng 老师的 weekly 应该是少有的免费收录的,但是流量也会衰减,过了一两个月后基本上也就没啥流量了

    支付:
    1. 如果不是 app 产品( iOS 的渠道太好,抽成 30% 也是有道理的),以个人身份来收款在各种方面都会受到比较严格的限制/“歧视”还有风险
    2. 大陆居民搞海外支付有很多财、税、法方面的事情要了解
    3. Stripe 基本上需要海外公司的实体,维护成本不低(估计可能要 5-10k 人民币),而且 stripe 接通本身还有一些坑: https://v2ex.com/t/1073328#reply19
    4. Paddle 我了解默认不支持没有支付流水的新产品接通,LemonSqueezy 目前应该还是不支付国内的用户付款
    5. Sales Tax 还有别的一些 Tax 也是很麻烦的事情,当然如果你走到了这一步,说明你的产品已经有些收入了,congrats

    都是泪哈哈,慎重入行。
    个人感受:如果你自己没有流量渠道,marketing 的难度比想象中要大很多。

    另外就是法务 + 支付方面的事情也需要耗费很多精力和时间。
    22 年 12 月开始做,23 年 9 月份上线初版产品,24 年 10 月份上线 pricing plan ,这几个月刚刚有一点点收入,还是很难的。

    产品: https://ppresume.com
    48 天前
    回复了 oldcai 创建的主题 Stripe Stripe 怎样收税比较简单?
    除了切换成 MoR 这种,没什么特别好的办法。

    网上有人说这种小 SaaS 除了在自己所在的国家 jurisdication 交交 sales tax ,别的可以不用管,有风险,但是不用 care 太多。
    48 天前
    回复了 Cola98 创建的主题 程序员 nextjs 正确使用方式
    @superhot

    我的项目架构 ( https://ppresume.com) 大概是这样的:

    - ppresume
    - packages/common
    - packages/api
    - packages/client

    ```sh
    $ ls -l packages package.json pnpm-workspace.yaml pnpm-lock.yaml
    -rw-r--r-- 1 hanyu staff 1485 Jan 14 21:09 package.json
    -rw-r--r-- 1 hanyu staff 744184 Dec 30 10:49 pnpm-lock.yaml
    -rw-r--r-- 1 hanyu staff 27 Jan 22 2024 pnpm-workspace.yaml

    packages:
    total 0
    drwxr-xr-x 16 hanyu staff 512 Jan 14 21:09 api
    drwxr-xr-x 24 hanyu staff 768 Jan 14 21:09 client
    drwxr-xr-x 12 hanyu staff 384 Jan 14 21:09 common
    ```

    - api: 后端 API
    - client: 前端 next.js 实现
    - common: 前后端共享的 data model/schema validation/utils 等等,不依赖 node.js 系统 API ,所以可以同时跑在两端上。

    回复你的问题:

    1. tsconfig 我没有特别配置过,common package 的 tsconfig:

    ```json
    {
    "compilerOptions": {
    "esModuleInterop": true,
    "experimentalDecorators": true,
    "emitDecoratorMetadata": true,
    "moduleResolution": "node",
    "resolveJsonModule": true,

    "declaration": true,
    "declarationMap": true,
    "sourceMap": true,
    "types": ["node", "jest"],

    "importHelpers": true,
    "composite": true,
    "target": "es5",

    "rootDir": "src",
    "outDir": "dist",

    "baseUrl": "."
    },

    "include": ["**/*.ts", "**/*.json"]
    }
    ```

    2. 把 common package 当成一个单独的 npm/pnpm 包引入 api/client ,不需要用嵌套路径。npm/pnpm/yarn 都有相应的 workspace 特性,我最开始用的是 yarn ,后来转到了 pnpm ,参考: https://pnpm.io/workspaces

    我的 pnpm-workspace 配置:

    ```
    packages:
    - 'packages/*'
    ```

    顶层 `package.json` 配置:

    ```
    {
    "name": "ppresume",
    "private": true,
    "version": "0.7.0",
    "dependencies": {
    "concurrently": "^8.2.1",
    "husky": "^8.0.2",
    "lint-staged": "^13.1.0",
    "prettier": "^2.8.1"
    },
    "devDependencies": {
    "@commitlint/cli": "^19.3.0",
    "@commitlint/config-conventional": "^19.2.2",
    "@trivago/prettier-plugin-sort-imports": "^4.0.0",
    "commit-and-tag-version": "^12.4.0"
    },
    "lint-staged": {
    "**/*": "prettier --write --ignore-unknown"
    },
    "resolutions": {
    "jackspeak": "2.1.1"
    },
    "scripts": {
    "api": "pnpm --filter api",
    "common": "pnpm --filter common",
    "coverage": "pnpm common build && concurrently --kill-others-on-fail \"pnpm common coverage\" \"pnpm client coverage\" \"pnpm api coverage\"",
    "client": "pnpm --filter client",
    "build": "pnpm common build && concurrently --kill-others-on-fail \"pnpm client build\" \"pnpm api build\"",
    "dev": "pnpm common build && concurrently --kill-others-on-fail \"pnpm client dev\" \"pnpm api dev\"",
    "start": "pnpm common build && concurrently --kill-others-on-fail \"pnpm client start\" \"pnpm api start\"",
    "test": "pnpm common build && concurrently --kill-others-on-fail \"pnpm common test\" \"pnpm client test\" \"pnpm api test\"",
    "release": "commit-and-tag-version --bumpFiles package.json packages/*/package.json",
    "commitlint": "commitlint --edit"
    },
    "commit-and-tag-version": {
    "writerOpts": {
    "commitsSort": false
    }
    }
    }
    ```

    `common/package.json` 的配置:

    ```
    {
    "name": "common",
    "version": "0.7.0",
    "description": "common code shared by ppresume project",
    "author": "Xiao Hanyu",
    "private": true,
    "devDependencies": {
    "@types/jest": "^29.5.5",
    "@types/lodash": "^4.14.202",
    "@types/node": "^20.5.7",
    "jest": "^29.7.0",
    "ts-jest": "^29.1.1",
    "typescript": "^5.2.2"
    },
    "main": "dist/index",
    "types": "dist/index",
    "scripts": {
    "build": "tsc --build --force",
    "coverage": "jest --coverage",
    "test": "jest"
    },
    "dependencies": {
    "escape-latex": "^1.2.0",
    "tslib": "^2.6.2"
    }
    }
    ```

    调用 `pnpm common build` 来完成 `common` package 的 build ,然后在 api/client 里直接 `import xxx from 'common'` 就可以了

    3. mono-repo 有 mono-repo 的好处的,最大的好处是出了 regression 问题可以用 `git bisect` 找 bug ,commit log 的维护重点还是靠个人/团队守规则。

    我个人项目的概况: https://x.com/hanyuxiao1988/status/1878625079829172510

    以上
    62 天前
    回复了 xiaohanyu 创建的主题 分享创造 PPResume 新年更新:新增两款简历模板
    @sikex 收到收到,太感谢了,bug 报告很详细。
    62 天前
    回复了 xiaohanyu 创建的主题 分享创造 PPResume 新年更新:新增两款简历模板
    @anUglyDog 嗯,有时候颜值就是正义么,哈哈
    63 天前
    回复了 xiaohanyu 创建的主题 分享创造 PPResume 新年更新:新增两款简历模板
    @scienhub 嗯,仁兄是懂行的哈
    63 天前
    回复了 xiaohanyu 创建的主题 分享创造 PPResume 新年更新:新增两款简历模板
    @scienhub 排版引擎是 LaTeX 呢,具体来说是 XeLaTeX 引擎,前两个月写了篇关于排版引擎技术选型的文章: https://blog.ppresume.com/posts/zh-CN/on-typesetting-engines ,供参考哈。

    中文排版也是完全支持的,而且支持简体中文、繁体中文(香港)和繁体中文(台湾)三种,具体可以看:

    - blog: https://blog.ppresume.com/posts/multi-languagues-support
    - doc: https://docs.ppresume.com/content/multi-languages
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3172 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 12:50 · PVG 20:50 · LAX 05:50 · JFK 08:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.