从此

产品上线检查清单、Web网站/App应用/Server服务器

综合/最新

持续优化Web网站

配置

通用:
  Container Registry - DOCKER_CR_PASSWORD、ALIYUN_CR_PASSWORD
  App Service - MAIN_DB_PASSWORD

  -e "OUR_ENVIRONMENT=production" -e "TZ=Asia/Shanghai"

Java:
  -e "JAVA_TOOL_OPTIONS=-XX:MaxRAMPercentage=75"

上传下载:
  -e "UPLOAD_URL_PREFIX=upload.host.name" -e "DOWNLOAD_URL_PREFIX=download.host.name"

Web

网站上线检查清单:
  域名 A/AAAA/HTTPS 解析检测,IPv4和IPv6均应双栈正常访问,或不要勾上网络适配器IPv4的IPv6单网络协议栈情况。
  服务器ping延迟控制在200ms,国内则40ms;丢包率应低于3%。
  中国大陆备案过的域名,云平台会稽查扫描带www的域名,故直接不解析或放个静态首页,挂个备案号应付下。
  引用的 JavaScript 脚本,部分 CDN 或域名被墙,应改为:单文件无引用的直接本地拷贝,有引用的则用墙内源。
  图片或静态文件资源应放至二级域名,避免顶级域名总是携带Cookie的负担。
  动图首选APNG格式,次选WebP和AVIF。
  ICO图标尺寸定为 256x256 像素,浏览器支持favicon.ico图标重定向。
  上传大小限制 - Nginx默认1MiB,需显式设置较大值,至少测试下低于1MiB和超出1MiB这两种情况。
  检查 CORS 跨域情况,比如前端API网关(Nginx等)或 GCS 的 bucket.toBuilder().setCors(ImmutableList.of(cors)).build().update();
  检查 WebSocket和SSE长连接超时配置。

  必须转义HTML标签value="含双引号"等属性。
  a链接颜色要跟普通内容有所区分,提高用户点击的几率。
  a链接添加rel="noreferrer"来禁止传递document.referrer,也可避免(target="_blank")新开页控制原页面: window.opener.location.href ="恶意域名.com"
  标签的文件后缀限制会被绕过,故应通过JS事件onchange或后端再次检查下:<input type="file" id="file" accept=".wav,.flac,.webm,.ogg,.mp3" onchange="checkAndPreview(this)" />

  浏览器
    Chrome 设置页网址为 chrome://settings 手机模式和真机观察下,或长内容不换行看会不会破坏布局。
      实验性功能 - 可通过 chrome://flags 进入。
    Safari 设置页无进入网址,可在“设置”->App->Safari浏览器 中找到。
      功能开关 - 检查新特性支持情况,可在“高级”-> 功能开关 找到。

页面元素载入完成后触发(早于onload事件):
<script> document.addEventListener("DOMContentLoaded", (evt) => { console.log(evt); }); </script>
不存在 onDOMContentLoaded 属性,但有 ononline 等;可省略 event 入参: (/* evt */) => { };
DOMContentLoaded 触发后,保证函数只执行第一次(默认多处多次执行):
// Web Workers 中无法访问,故只会在主线程中进行原子性判断。 if (document.readyState === "loading") { // 此时文档加载尚未完成 document.addEventListener("DOMContentLoaded", once); } else { once(); } // 已错过注册时机,故直接执行。 // 函数会在JS解析时自动提升至作用域顶部,即允许先调用再定义。 function once(evt) { console.log(evt.currentTarget); }
循环执行:
var cbNumber; var cbTimeout = 1000; var cb = () => { // 不可见时循环执行空任务。 if (document.visibilityState === 'visible') { console.log("interval callback - " + new Date()); } }; cbNumber = setInterval(cb, cbTimeout); // 参3为callback入参。 window.addEventListener('beforeunload', () => { if (cbNumber) { clearInterval(cbNumber); } // 关闭页面清除循环任务;无法遍历。 });
富媒体结构化数据: 注 - Google Search 已废弃搜索页嵌入站内搜索框:由 potentialAction 子项 SearchAction 定义。
<script type="application/ld+json"> { "@context": "https://schema.org", "@type": "WebSite", "url": "https://nav.congci.com/", "name": "从此搜索", "alternateName": ["Congci", "congci.com", "从此网"] } </script>

App



Server

字符集只需修改 character_set_server 为 utf8mb4 即可,collation_server 值会自动变为 utf8mb4_unicode_ci。

其他