diff --git a/README.md b/README.md index d643513..b1d631e 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ ### A. 极简带版本模式 (防缓存) ```html - + ``` ### B. 简写 Hash 模式 @@ -41,11 +41,11 @@ Loader 内部维护了完整的依赖链。例如: ### `__apigo_load(...pkgs)` - **`__apigo_load('base')`**: 加载默认稳定版。 -- **`__apigo_load('state:1.0.11')`**: 指定特定包的版本。 +- **`__apigo_load('state:1.0.23')`**: 指定特定包的版本。 --- ## 开发者提示 (AI 必读) 1. **参数优先级**: URL 查询参数 `?load=` 优先级高于 Hash 参数 `#`。 2. **同步执行**: Loader 利用浏览器对动态插入脚本的顺序解析机制,保障了依赖项在业务代码运行前就绪。 -3. **自清理**: `__apigo_load` 仅在 ` - - - -
loading
- - - - diff --git a/test/loader.spec.js b/test/loader.spec.js index 0f91629..62bb2d2 100644 --- a/test/loader.spec.js +++ b/test/loader.spec.js @@ -1,33 +1,43 @@ import { test, expect } from '@playwright/test'; -test('loader dynamic importmap generation and custom path redirect', async ({ page }) => { +test('loader injects dependency script urls', async ({ page }) => { page.on('console', msg => console.log('BROWSER LOG:', msg.text())); - - // 打开测试页面 - await page.goto('http://127.0.0.1:8084/test/index.html'); - // 1. 验证生成的 importmap 标签结构 - const importMapJson = await page.evaluate(() => { - const script = document.querySelector('script[type="importmap"]'); - return script ? JSON.parse(script.textContent) : null; + await page.setContent(` + + + + + + +
loading
+ + + `, { waitUntil: 'commit' }); + + await page.waitForFunction(() => typeof window.__apigo_load === 'function'); + await page.waitForFunction(() => document.readyState !== 'loading'); + + const urls = await page.evaluate(() => { + const captured = []; + const originalAppend = document.head.appendChild.bind(document.head); + + document.head.appendChild = node => { + if (node && node.tagName === 'SCRIPT' && node.src) { + captured.push(node.src); + } + return node; + }; + + __apigo_load('state', 'bootstrap', 'base'); + + document.head.appendChild = originalAppend; + return captured; }); - expect(importMapJson).not.toBeNull(); - expect(importMapJson.imports).toBeDefined(); - - // 2. 检查 state (常规 CDN 映射) 是否生成正确 - const stateUrl = importMapJson.imports['@apigo.cc/state']; - expect(stateUrl).toContain('cdn.jsdelivr.net/npm/@apigo.cc/state'); - - // 3. 检查 bootstrap (本地相对路径重定向) 是否保留 - const bootstrapUrl = importMapJson.imports['@apigo.cc/bootstrap']; - expect(bootstrapUrl).toBe('./mock-bootstrap.js'); - - // 4. 检查 base (本地绝对 HTTP 重定向) 是否保留 - const baseUrl = importMapJson.imports['@apigo.cc/base']; - expect(baseUrl).toBe('http://127.0.0.1:8084/test/mock-base.js'); - - // 5. 验证重定向的 mock 模块确实可以被 ESM 成功导入并运行 (通过页面 status 的变化) - const status = page.locator('#status'); - await expect(status).toHaveText('success'); + expect(urls).toEqual([ + 'https://cdn.jsdelivr.net/npm/@apigo.cc/state@1.0.23/dist/state.js', + 'https://cdn.jsdelivr.net/npm/@apigo.cc/bootstrap@1.0.9/dist/bootstrap.js', + 'https://cdn.jsdelivr.net/npm/@apigo.cc/base@1.0.23/dist/base.js' + ]); }); diff --git a/test/mock-base.js b/test/mock-base.js deleted file mode 100644 index 98c6063..0000000 --- a/test/mock-base.js +++ /dev/null @@ -1,3 +0,0 @@ -export const HTTP = { isMock: true, name: 'base-mock' }; -export const UI = { toast: () => {} }; -export default { HTTP, UI }; diff --git a/test/mock-bootstrap.js b/test/mock-bootstrap.js deleted file mode 100644 index b2c993e..0000000 --- a/test/mock-bootstrap.js +++ /dev/null @@ -1,2 +0,0 @@ -export const Bootstrap = { isMock: true, name: 'bootstrap-mock' }; -export default Bootstrap;