@deot/docs-launch 1.0.1 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -2
- package/dist/index.cjs +1 -1
- package/dist/index.js +38 -19
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -18,15 +18,19 @@
|
|
|
18
18
|
<script type="module" src="https://cdn.jsdelivr.net/npm/@deot/docs-launch/+esm"></script>
|
|
19
19
|
```
|
|
20
20
|
|
|
21
|
-
省略或清空 `cdns` 时使用默认候选。探针请求同一份固定小文件 `@deot/docs-theme@1.1.4/package.json?raw`,最先完整读取成功响应的节点胜出,每个请求超时 5
|
|
21
|
+
省略或清空 `cdns` 时使用默认候选。探针请求同一份固定小文件 `@deot/docs-theme@1.1.4/package.json?raw`,最先完整读取成功响应的节点胜出,每个请求超时 5 秒,随后取消剩余探针。探针全部失败时仍按候选顺序尝试实际资源,避免元数据请求失败阻断启动。结果写入 `$docs.runtime.cdn`,同一页面重复启动复用同一任务。
|
|
22
22
|
|
|
23
23
|
选中节点保存在 `localStorage['@deot/docs-launch:cdn']`。有缓存且该节点仍在当前候选中时,立即使用缓存启动,同时静默探测并更新缓存,供下次页面启动使用;本次页面的节点和资源保持不变。没有可用缓存时,先探测再加载。后台探测失败时保留原缓存;存储不可用时仍可正常探测和启动。
|
|
24
24
|
|
|
25
25
|
启动器按 Client、Renderer、Markdown、Playground 的顺序插入 stylesheet link,再插入 Client module script;不等待 CSS load 事件才请求 JS。所有地址先按选中节点生成,再经过用户可选的同步 `resolve.cdn({ url })`。返回 `null`、`undefined` 或空字符串时保留原地址,钩子本身不会被启动器替换,探针不经过钩子。
|
|
26
26
|
|
|
27
|
+
jsDelivr 的 Client 入口使用 `/@deot/docs-client/+esm`,ESM UNPKG 显式使用 `/@deot/docs-client/dist/index.js`。不使用 UNPKG 包根入口,因为带 `style` 字段的包可能重定向到 CSS。
|
|
28
|
+
|
|
27
29
|
Client 与 Playground 内置 jsDelivr / UNPKG 地址转换,继续使用选中的同一节点,再调用用户钩子。原配置与缓存保留原始地址。转换服务内部模块引用及重定向仍交给浏览器处理。
|
|
28
30
|
|
|
29
|
-
|
|
31
|
+
任一启动资源加载失败(包括错误 MIME、依赖请求失败),或五份资源在 30 秒内未全部加载完成时,排除当前节点、更新节点缓存并重载整页,尝试剩余候选。通过重载隔离可能迟到的模块执行,每轮每个候选只尝试一次。重试状态暂存在 `sessionStorage['@deot/docs-launch:cdn']`,下次启动读取后移除;后台探针不会重新缓存已失败的节点。没有可用的探针结果时,成功加载的资源节点也会写入缓存。
|
|
32
|
+
|
|
33
|
+
候选全部失败后清空节点缓存,输出控制台错误,并在尚未挂载的 `#app` 中显示刷新重试提示;手动刷新可重新开始一轮尝试。无法保存重试状态时停止自动重载,避免无限刷新。每次页面启动只探测一次,不提供持续测速或网络代理。启动器自身首次下载由 HTML 决定;本仓库入口在 launch 下载失败或超过 15 秒时尝试备用 ESM UNPKG JS 地址。自定义候选默认遵循 jsDelivr 路径规则,特殊入口可通过最终钩子调整。
|
|
30
34
|
|
|
31
35
|
包没有运行时依赖,通过 `--minify-package 'launch'` 生成单个自包含的普通压缩 ESM,体积预算为 3 KiB、gzip 后 1.5 KiB。无需 eval 或解压器。聚合包不会重导出自动启动入口。
|
|
32
36
|
|
package/dist/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=[`https://cdn.jsdelivr.net/npm/`,`https://esm.unpkg.com/`],t=Symbol.for(`@deot/docs-launch`),n=`@deot/docs-launch:cdn`,r=(r=window)=>{let i=r;return i[t]??=(async()=>{let t=i.$docs||={},r=t.cdns?.map(e=>e.trim()).filter(Boolean),a=[...new Set((r?.length?r:e).map(e=>`${e.replace(/\/+$/u,``)}/`))],o=(async()=>{let e=
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=[`https://cdn.jsdelivr.net/npm/`,`https://esm.unpkg.com/`],t=Symbol.for(`@deot/docs-launch`),n=`@deot/docs-launch:cdn`,r=(r=window)=>{let i=r;return i[t]??=(async()=>{let t=i.$docs||={},r=t.cdns?.map(e=>e.trim()).filter(Boolean),a=[...new Set((r?.length?r:e).map(e=>`${e.replace(/\/+$/u,``)}/`))],o=[];try{o=JSON.parse(i.sessionStorage.getItem(n)||`[]`).filter(e=>a.includes(e)),i.sessionStorage.removeItem(n)}catch{}let s=a.filter(e=>!o.includes(e)),c=e=>{try{i.localStorage.setItem(n,e)}catch{}},l=!1,u=(async()=>{let e=s.map(()=>new AbortController);try{return await Promise.any(s.map(async(t,n)=>{let r=e[n],i=setTimeout(()=>r.abort(),5e3);try{let e=await fetch(`${t}@deot/docs-theme@1.1.4/package.json?raw`,{signal:r.signal});if(!e.ok)throw Error(`${e.status} ${t}`);return await e.text(),t}finally{clearTimeout(i)}}))}finally{e.forEach(e=>e.abort())}})().then(e=>(o.includes(e)||(l=!0,c(e)),e)).catch(()=>void 0),d=``;try{d=i.localStorage.getItem(n)||``}catch{}if(s.includes(d)||(d=await u||s[0]),!d)throw Error(`[docs-launch] No CDN available`);t.runtime={...t.runtime,mode:t.runtime?.mode||`production`,cdn:d};let f=e=>{let n=`${d}${e}`;return t.resolve?.cdn?.({url:n})||n},p=i.document,m=5,h=!1,g=setTimeout(()=>_(),3e4),_=e=>{if(h||e?.type===`load`&&--m)return;if(h=!0,clearTimeout(g),e?.type===`load`){l||c(d);return}o.push(d);let t=s.find(e=>!o.includes(e));if(c(t||``),t)try{i.sessionStorage.setItem(n,JSON.stringify(o)),i.location.reload();return}catch{}console.error(`[docs-launch] Failed to load`,d,e);let r=p.querySelector(`#app:not([data-v-app])`);r&&(r.textContent=`文档资源加载失败,请刷新重试。`)};for(let e of[`client`,`renderer`,`markdown`,`playground`]){let t=p.createElement(`link`);t.rel=`stylesheet`,t.href=f(`@deot/docs-${e}/dist/index.style.css`),t.addEventListener(`load`,_),t.addEventListener(`error`,_),p.head.appendChild(t)}let v=p.createElement(`script`);v.type=`module`,v.src=f(`@deot/docs-client${new URL(d).hostname===`esm.unpkg.com`?`/dist/index.js`:`/+esm`}`),v.addEventListener(`load`,_),v.addEventListener(`error`,_),p.body.appendChild(v)})()};typeof window<`u`&&document.querySelector(`#app`)&&r().catch(e=>console.error(`[docs-launch] Failed to launch`,e)),exports.launch=r;
|
package/dist/index.js
CHANGED
|
@@ -2,10 +2,18 @@
|
|
|
2
2
|
var e = ["https://cdn.jsdelivr.net/npm/", "https://esm.unpkg.com/"], t = Symbol.for("@deot/docs-launch"), n = "@deot/docs-launch:cdn", r = (r = window) => {
|
|
3
3
|
let i = r;
|
|
4
4
|
return i[t] ??= (async () => {
|
|
5
|
-
let t = i.$docs ||= {}, r = t.cdns?.map((e) => e.trim()).filter(Boolean), a = [...new Set((r?.length ? r : e).map((e) => `${e.replace(/\/+$/u, "")}/`))], o =
|
|
6
|
-
|
|
5
|
+
let t = i.$docs ||= {}, r = t.cdns?.map((e) => e.trim()).filter(Boolean), a = [...new Set((r?.length ? r : e).map((e) => `${e.replace(/\/+$/u, "")}/`))], o = [];
|
|
6
|
+
try {
|
|
7
|
+
o = JSON.parse(i.sessionStorage.getItem(n) || "[]").filter((e) => a.includes(e)), i.sessionStorage.removeItem(n);
|
|
8
|
+
} catch {}
|
|
9
|
+
let s = a.filter((e) => !o.includes(e)), c = (e) => {
|
|
10
|
+
try {
|
|
11
|
+
i.localStorage.setItem(n, e);
|
|
12
|
+
} catch {}
|
|
13
|
+
}, l = !1, u = (async () => {
|
|
14
|
+
let e = s.map(() => new AbortController());
|
|
7
15
|
try {
|
|
8
|
-
return await Promise.any(
|
|
16
|
+
return await Promise.any(s.map(async (t, n) => {
|
|
9
17
|
let r = e[n], i = setTimeout(() => r.abort(), 5e3);
|
|
10
18
|
try {
|
|
11
19
|
let e = await fetch(`${t}@deot/docs-theme@1.1.4/package.json?raw`, { signal: r.signal });
|
|
@@ -18,35 +26,46 @@ var e = ["https://cdn.jsdelivr.net/npm/", "https://esm.unpkg.com/"], t = Symbol.
|
|
|
18
26
|
} finally {
|
|
19
27
|
e.forEach((e) => e.abort());
|
|
20
28
|
}
|
|
21
|
-
})().then((e) =>
|
|
22
|
-
try {
|
|
23
|
-
i.localStorage.setItem(n, e);
|
|
24
|
-
} catch {}
|
|
25
|
-
return e;
|
|
26
|
-
}), s = "";
|
|
29
|
+
})().then((e) => (o.includes(e) || (l = !0, c(e)), e)).catch(() => void 0), d = "";
|
|
27
30
|
try {
|
|
28
|
-
|
|
31
|
+
d = i.localStorage.getItem(n) || "";
|
|
29
32
|
} catch {}
|
|
30
|
-
|
|
33
|
+
if (s.includes(d) || (d = await u || s[0]), !d) throw Error("[docs-launch] No CDN available");
|
|
34
|
+
t.runtime = {
|
|
31
35
|
...t.runtime,
|
|
32
36
|
mode: t.runtime?.mode || "production",
|
|
33
|
-
cdn:
|
|
37
|
+
cdn: d
|
|
34
38
|
};
|
|
35
|
-
let
|
|
36
|
-
let n = `${
|
|
39
|
+
let f = (e) => {
|
|
40
|
+
let n = `${d}${e}`;
|
|
37
41
|
return t.resolve?.cdn?.({ url: n }) || n;
|
|
38
|
-
},
|
|
42
|
+
}, p = i.document, m = 5, h = !1, g = setTimeout(() => _(), 3e4), _ = (e) => {
|
|
43
|
+
if (h || e?.type === "load" && --m) return;
|
|
44
|
+
if (h = !0, clearTimeout(g), e?.type === "load") {
|
|
45
|
+
l || c(d);
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
o.push(d);
|
|
49
|
+
let t = s.find((e) => !o.includes(e));
|
|
50
|
+
if (c(t || ""), t) try {
|
|
51
|
+
i.sessionStorage.setItem(n, JSON.stringify(o)), i.location.reload();
|
|
52
|
+
return;
|
|
53
|
+
} catch {}
|
|
54
|
+
console.error("[docs-launch] Failed to load", d, e);
|
|
55
|
+
let r = p.querySelector("#app:not([data-v-app])");
|
|
56
|
+
r && (r.textContent = "文档资源加载失败,请刷新重试。");
|
|
57
|
+
};
|
|
39
58
|
for (let e of [
|
|
40
59
|
"client",
|
|
41
60
|
"renderer",
|
|
42
61
|
"markdown",
|
|
43
62
|
"playground"
|
|
44
63
|
]) {
|
|
45
|
-
let t =
|
|
46
|
-
t.rel = "stylesheet", t.href =
|
|
64
|
+
let t = p.createElement("link");
|
|
65
|
+
t.rel = "stylesheet", t.href = f(`@deot/docs-${e}/dist/index.style.css`), t.addEventListener("load", _), t.addEventListener("error", _), p.head.appendChild(t);
|
|
47
66
|
}
|
|
48
|
-
let
|
|
49
|
-
|
|
67
|
+
let v = p.createElement("script");
|
|
68
|
+
v.type = "module", v.src = f(`@deot/docs-client${new URL(d).hostname === "esm.unpkg.com" ? "/dist/index.js" : "/+esm"}`), v.addEventListener("load", _), v.addEventListener("error", _), p.body.appendChild(v);
|
|
50
69
|
})();
|
|
51
70
|
};
|
|
52
71
|
typeof window < "u" && document.querySelector("#app") && r().catch((e) => console.error("[docs-launch] Failed to launch", e));
|