* 解析插件入口 URL * @returns pluginUrl(字符串)以及是否无界面插件
(
pluginPath: string,
pluginConfig: any,
isDevelopment: boolean
)
| 179 | * @returns pluginUrl(字符串)以及是否无界面插件 |
| 180 | */ |
| 181 | private resolvePluginUrl( |
| 182 | pluginPath: string, |
| 183 | pluginConfig: any, |
| 184 | isDevelopment: boolean |
| 185 | ): { pluginUrl: string; isConfigHeadless: boolean } { |
| 186 | const isConfigHeadless = !pluginConfig.main |
| 187 | |
| 188 | if (isConfigHeadless) { |
| 189 | console.log('[Plugin] 检测到无界面插件(Config):', pluginConfig.name) |
| 190 | return { pluginUrl: pathToFileURL(hideWindowHtml).href, isConfigHeadless } |
| 191 | } |
| 192 | if (isDevelopment && pluginConfig.development?.main) { |
| 193 | console.log('[Plugin] 开发中插件,使用 development.main:', pluginConfig.development.main) |
| 194 | return { pluginUrl: pluginConfig.development.main, isConfigHeadless } |
| 195 | } |
| 196 | if (pluginConfig.main.startsWith('http')) { |
| 197 | console.log('[Plugin] 网络插件:', pluginConfig.main) |
| 198 | return { pluginUrl: pluginConfig.main, isConfigHeadless } |
| 199 | } |
| 200 | // 生产环境内置插件:使用本地 HTTP server 加载(避免 file:// 下的 CSP 限制) |
| 201 | if (isBundledInternalPlugin(pluginConfig.name) && getInternalPluginServerPort() > 0) { |
| 202 | const httpUrl = getInternalPluginUrl(pluginConfig.name, pluginConfig.main) |
| 203 | console.log('[Plugin] 内置插件使用 HTTP server:', httpUrl) |
| 204 | return { pluginUrl: httpUrl, isConfigHeadless } |
| 205 | } |
| 206 | return { |
| 207 | pluginUrl: pathToFileURL(path.join(pluginPath, pluginConfig.main)).href, |
| 208 | isConfigHeadless |
| 209 | } |
| 210 | } |
| 211 | |
| 212 | /** |
| 213 | * 创建并配置插件的 session(注册 preload、代理、图标协议) |
no test coverage detected