|
|
@@ -163,27 +163,75 @@ const width = computed(() => {
|
|
|
|
|
|
// srcdoc 外链 CDN 镜像替换
|
|
|
const CDN_RULES: [RegExp, string][] = [
|
|
|
- // ===== lucide 特殊处理:必须指向 UMD 路径,并锁定版本 =====
|
|
|
+ // ===== 1. lucide 特殊处理(必须放在最前,且指向 UMD)=====
|
|
|
[/unpkg\.com\/lucide@latest/g,
|
|
|
'cdn.jsdmirror.com/npm/lucide@1.47.0/dist/umd/lucide.min.js'],
|
|
|
[/unpkg\.com\/lucide@([\d.]+)/g,
|
|
|
'cdn.jsdmirror.com/npm/lucide@$1/dist/umd/lucide.min.js'],
|
|
|
+ [/cdn\.jsdelivr\.net\/npm\/lucide@([\d.]+)(?!\/dist\/umd)/g,
|
|
|
+ 'cdn.jsdmirror.com/npm/lucide@$1/dist/umd/lucide.min.js'],
|
|
|
|
|
|
- // ===== 其他 unpkg 包 → jsDelivr npm 路径 =====
|
|
|
- [/unpkg\.com/g, 'cdn.jsdelivr.net/npm'],
|
|
|
+ // ===== 2. unpkg → JSDMirror(一步到位,避免链式替换)=====
|
|
|
+ [/unpkg\.com/g, 'cdn.jsdmirror.com/npm'],
|
|
|
|
|
|
- // ===== jsDelivr 全系列 → JSDMirror =====
|
|
|
- [/cdn\.jsdelivr\.net/g, 'cdn.jsdmirror.com'],
|
|
|
+ // ===== 3. jsDelivr 全系列 → JSDMirror =====
|
|
|
[/fastly\.jsdelivr\.net/g, 'cdn.jsdmirror.com'],
|
|
|
[/gcore\.jsdelivr\.net/g, 'cdn.jsdmirror.com'],
|
|
|
+ [/cdn\.jsdelivr\.net/g, 'cdn.jsdmirror.com'],
|
|
|
|
|
|
- // ===== cdnjs、Google Fonts、jQuery、Tailwind 规则保持不变 =====
|
|
|
- [/cdnjs\.cloudflare\.com/g, 'cdnjs.loli.net'],
|
|
|
+ // ===== 4. Google Hosted Libraries → JSDMirror(按路径精确映射)=====
|
|
|
+ [/ajax\.googleapis\.com\/ajax\/libs\/jquery\/([\d.]+)\/jquery(\.min)?\.js/g,
|
|
|
+ 'cdn.jsdmirror.com/npm/jquery@$1/dist/jquery$2.js'],
|
|
|
+ [/ajax\.googleapis\.com\/ajax\/libs\/([^\/]+)\/([\d.]+)\/(.+)/g,
|
|
|
+ 'cdn.jsdmirror.com/npm/$1@$2/$3'],
|
|
|
+ [/ajax\.googleapis\.com\/ajax\/libs\/([^\/]+)\/([\d.]+)/g,
|
|
|
+ 'cdn.jsdmirror.com/npm/$1@$2'],
|
|
|
+
|
|
|
+ // ===== 5. Google Fonts =====
|
|
|
[/fonts\.googleapis\.com/g, 'fonts.loli.net'],
|
|
|
[/fonts\.gstatic\.com/g, 'gstatic.loli.net'],
|
|
|
- [/code\.jquery\.com/g, 'cdn.jsdmirror.com/npm/jquery'],
|
|
|
+ [/themes\.googleusercontent\.com/g, 'gstatic.loli.net'],
|
|
|
+
|
|
|
+ // ===== 6. cdnjs =====
|
|
|
+ [/cdnjs\.cloudflare\.com/g, 'cdnjs.loli.net'],
|
|
|
+ [/cdnjs\.loli\.net/g, 'cdnjs.loli.net'], // 幂等,防止重复替换
|
|
|
+
|
|
|
+ // ===== 7. Font Awesome =====
|
|
|
+ [/kit\.fontawesome\.com/g, 'cdn.jsdmirror.com/npm/@fortawesome/fontawesome-free@6/js/all.min.js'],
|
|
|
+ [/use\.fontawesome\.com\/releases\/([^\/]+)\/css\/all\.min\.css/g,
|
|
|
+ 'cdn.jsdmirror.com/npm/@fortawesome/fontawesome-free@$1/css/all.min.css'],
|
|
|
+
|
|
|
+ // ===== 8. Bootstrap CDN =====
|
|
|
+ [/stackpath\.bootstrapcdn\.com\/bootstrap\/([\d.]+)\/css\/bootstrap(\.min)?\.css/g,
|
|
|
+ 'cdn.jsdmirror.com/npm/bootstrap@$1/dist/css/bootstrap$2.css'],
|
|
|
+ [/stackpath\.bootstrapcdn\.com\/bootstrap\/([\d.]+)\/js\/bootstrap(\.min)?\.js/g,
|
|
|
+ 'cdn.jsdmirror.com/npm/bootstrap@$1/dist/js/bootstrap$2.js'],
|
|
|
+ [/maxcdn\.bootstrapcdn\.com\/bootstrap\/([\d.]+)\/css\/bootstrap(\.min)?\.css/g,
|
|
|
+ 'cdn.jsdmirror.com/npm/bootstrap@$1/dist/css/bootstrap$2.css'],
|
|
|
+ [/maxcdn\.bootstrapcdn\.com\/bootstrap\/([\d.]+)\/js\/bootstrap(\.min)?\.js/g,
|
|
|
+ 'cdn.jsdmirror.com/npm/bootstrap@$1/dist/js/bootstrap$2.js'],
|
|
|
+
|
|
|
+ // ===== 9. polyfill =====
|
|
|
+ [/polyfill\.io/g, 'cdn.jsdmirror.com/npm/polyfill-library@3/polyfill.min.js'],
|
|
|
+ [/polyfill-fastly\.io/g, 'cdn.jsdmirror.com/npm/polyfill-library@3/polyfill.min.js'],
|
|
|
+
|
|
|
+ // ===== 10. Tailwind Play CDN =====
|
|
|
[/https?:\/\/cdn\.tailwindcss\.com[\d.\/]*/g,
|
|
|
'https://cdn.jsdmirror.com/npm/@tailwindcss/browser@4.3.3'],
|
|
|
+
|
|
|
+ // ===== 11. jQuery 官方 CDN =====
|
|
|
+ [/code\.jquery\.com\/jquery-([\d.]+)(\.min)?\.js/g,
|
|
|
+ 'cdn.jsdmirror.com/npm/jquery@$1/dist/jquery$2.js'],
|
|
|
+
|
|
|
+ // ===== 12. GitHub Raw =====
|
|
|
+ [/raw\.githubusercontent\.com\/([^\/]+)\/([^\/]+)\/([^\/]+)\/(.+)/g,
|
|
|
+ 'cdn.jsdmirror.com/gh/$1/$2@$3/$4'],
|
|
|
+ [/raw\.githack\.com\/([^\/]+)\/([^\/]+)\/([^\/]+)\/(.+)/g,
|
|
|
+ 'cdn.jsdmirror.com/gh/$1/$2@$3/$4'],
|
|
|
+
|
|
|
+ // ===== 13. Gravatar(这个真没有靠谱国内镜像,建议保留原样)=====
|
|
|
+ // 如果必须替换,用下面这条,但不保证可用
|
|
|
+ // [/www\.gravatar\.com\/avatar/g, 'sdn.geekzu.org/avatar'],
|
|
|
]
|
|
|
|
|
|
const processedSrcDoc = computed(() => {
|