1/** 2 * ç«ç¹ SEO / å½é å 3 * App ç产åï¼Vercelï¼æå / Core / joinï¼â Cursor æ¬å°ä¸»å ¥å£ä»æ¯æå 4 * å½å 夿¡åï¼å è´¹æµæç¬è®° + å¼éå¤ç¨é¡µ join.htmlï¼Vercel è¿ä¸ä¸æ¶é¡¶ä¸ï¼ 5 * Generate sitemapï¼npm run sitemap 6 */ 7export const SITE_ORIGIN = 'https://balance-engine.vercel.app'; 8 9/** 10 * å½å æµæç¬è®°ï¼å è´¹åå®¢ï¼æ ¹å°å · 夿¡åå + COS/OSS 11 * æå¼è¯¥å = ç¬è®°é¦é¡µï¼ä¸æ¯æåã 12 * çæéåï¼npm run marketing:cn-mirror â ä¸ä¼ dist/cn-stories/ 13 */ 14export const CN_STORIES_MIRROR_ORIGIN = 'https://balanceengine.cn'; 15 16/** 17 * 工信é¨å¤æ¡å·ï¼é¡µèå±ç¤ºï¼ãæ¿å°å·åå¡«è¿éï¼åè· npm run marketing:cn-mirror 18 * ä¾: 粤ICPå¤xxxxxxxxå· 19 */ 20export const CN_BEIAN_ICP = 'èICPå¤2026053074å·-1'; 21 22/** 23 * å ¬å®é¨èç½å¤æ¡å·ï¼é¡µèå±ç¤ºï¼ãæ¿å°å·åå¡«è¿éï¼åè· npm run marketing:cn-mirror 24 * ä¾: èå ¬ç½å®å¤3205xxxxxxxxå· 25 * å ¨å½å¹³å°: https://beian.mps.gov.cn/ 26 */ 27export const CN_BEIAN_GONGAN = 'èå ¬ç½å®å¤32058302006853å·'; 28 29/** 30 * Notion æ¨¡æ¿ Duplicate 龿¥ï¼notion.so / marketplaceï¼ 31 * 填好念æç¬è®° #notion æ¾ç¤ºãæå¼ Notion 模æ¿ãï¼ 32 * çç©ºåæ¾ç¤ºãå³å°ãï¼å¹¶é¾å°ç«å 说æ docs/notion-rhythm-template.md 33 * 模æ¿å æé®åºæå /stories/ 䏿åï¼è§è¯¥è¯´æ Lite èï¼ 34 * 35 * å ¬å¼å ¥å£å¼å ³ï¼NOTION_COMPANION_PUBLIC === true æ¶æå¨ stories å±ç¤ºã 36 * ç°é»è®¤ falseï¼æå信任主æåºï¼ï¼è¦ç¨æ¶æ¹ true å¹¶å¡« Duplicate URLã 37 */ 38export const NOTION_TEMPLATE_DUPLICATE_URL = ''; 39 40/** ç«å 模æ¿è¯´æè·¯å¾ */ 41export const NOTION_TEMPLATE_GUIDE_PATH = 'docs/notion-rhythm-template.md'; 42 43/** 44 * æµæç¬è®°é¡µæ¯å¦å±ç¤º Notion çµææ¬æ ç®ï¼ä¾§æ / åºå / 页èï¼ 45 * false = éèï¼çé¿æ¬ãå¤å¶å° Notionãä¸åå½±åï¼ 46 */ 47export const NOTION_COMPANION_PUBLIC = false; 48 49/** 50 * Substack å ¬ä¼é¡µ URLï¼æµ·å¤æ¬åº¦é®ä»¶è®¢é ï¼ 51 * ä¾: https://balanceengine.substack.com 52 * çç©ºï¼æµæç¬è®°é¡µèæ¾ç¤ºãå³å°ãï¼å¡«å¥½ååºç°è®¢é CTA + ç¤¾äº¤å¾æ 53 * å¼éæ¥éª¤: docs/SUBSTACK_SETUP.md 54 */ 55export const SUBSTACK_PUBLIC_URL = 'https://balanceenginejade.substack.com'; 56 57/** @typedef {'zh-CN'|'en'} SiteLocale */ 58 59/** @type {SiteLocale} */ 60export const DEFAULT_LOCALE = 'zh-CN'; 61 62/** @type {SiteLocale[]} */ 63export const LOCALES = ['zh-CN', 'en']; 64 65/** 66 * @param {string} path 以 / å¼å¤´ï¼å¦ /index.html 67 * @param {SiteLocale} [locale] 68 */ 69export function absoluteUrl(path, locale = DEFAULT_LOCALE) { 70 const base = path.startsWith('/') ? path : `/${path}`; 71 if (locale === DEFAULT_LOCALE) { 72 return `${SITE_ORIGIN}${base}`; 73 } 74 const enPath = base.startsWith('/en/') ? base : `/en${base}`; 75 return `${SITE_ORIGIN}${enPath}`; 76} 77 78/** 79 * @param {string} zhPath 80 * @returns {{ zh: string, en: string, xDefault: string }} 81 */ 82export function hreflangPair(zhPath) { 83 return { 84 zh: absoluteUrl(zhPath, 'zh-CN'), 85 en: absoluteUrl(zhPath, 'en'), 86 xDefault: absoluteUrl(zhPath, 'zh-CN'), 87 }; 88}
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.