如何让GWT Super Dev Mode在HTML iframe内的GWT应用中生效?
当然可以!我之前也碰到过一模一样的场景,核心问题就是Super Dev Mode的CodeServer默认只会扫描当前页面的GWT模块,主页面本身没有相关模块,所以才会弹出“未找到GWT模块”的提示,但iframe里的模块其实是存在的。下面是几个亲测有效的解决办法:
1. 启动CodeServer时指定目标GWT模块
直接在CodeServer的启动命令里明确指定iframe内嵌的GWT模块名称,这样不管你打开主页面还是单独的iframe页面,CodeServer都会监听这个模块。
比如原来的启动命令是:
java com.google.gwt.dev.codeserver.CodeServer
修改为:
java com.google.gwt.dev.codeserver.CodeServer com.yourcompany.YourIframeGwtModule
把com.yourcompany.YourIframeGwtModule替换成你实际的GWT模块全限定名即可。启动后CodeServer会直接关联这个模块,主页面里的iframe应用就能被正常识别。
2. 手动在主页面控制台注入调试脚本
如果不想修改启动命令,也可以手动在主页面的浏览器控制台里执行Super Dev Mode的调试脚本,让它连接到iframe内的模块:
- 打开主页面,按下F12调出浏览器开发者工具的控制台。
- 打开CodeServer的页面(默认是
http://localhost:9876),复制页面上的那段调试脚本(包含__gwt_initDevMode的代码)。 - 将复制的脚本粘贴到主页面的控制台中执行,脚本会自动扫描页面内的iframe,找到里面的GWT模块并建立调试连接。
3. 主页面HTML自动加载调试脚本
要是不想每次都手动执行脚本,可以在主页面的HTML中添加一段代码,让页面加载时自动拉取CodeServer的调试脚本:
<script> // 替换成你的CodeServer地址,默认是localhost:9876 const codeServerUrl = 'http://localhost:9876'; const devScript = document.createElement('script'); devScript.src = `${codeServerUrl}/devmode.js`; document.head.appendChild(devScript); </script>
这段代码会自动加载CodeServer的调试脚本,脚本会自动检测页面内所有iframe中的GWT模块,打开主页面后就能直接用Super Dev Mode调试了。
4. 用-launchDir参数指定模块所在目录(可选)
如果主应用和iframe应用的代码在同一个目录下,或者有依赖关系,可以通过-launchDir参数让CodeServer扫描整个目录下的GWT模块:
java com.google.gwt.dev.codeserver.CodeServer -launchDir /path/to/your/app/root com.yourcompany.YourIframeGwtModule
替换/path/to/your/app/root为你的应用根目录路径,CodeServer会扫描该目录下的所有GWT模块,自然也能识别到iframe里的目标模块。
这些方法都能帮你不用单独打开iframe应用,直接在主应用中让Super Dev Mode对其生效,我自己调试内嵌GWT应用时常用第一种和第三种方法,效率很高!
内容的提问来源于stack exchange,提问作者Amey Parundekar

