同一模块中有多个入口点的问题

Posted

技术标签:

【中文标题】同一模块中有多个入口点的问题【英文标题】:Problem with multiple entry Points in the same module 【发布时间】:2010-10-30 02:27:59 【问题描述】:

我在同一个模块中有多个入口点。

例如,我有一个主页入口点和一个管理员 管理页面的入口点。

<entry-point class='com.company.project.client.HomeModule'/> 
<entry-point class='com.company.project.client.AdminModule'/> 

我现在的设置方式 - 我需要在我的 OnModuleLoad:

if((RootPanel.get("someHomeWidget")!=null)&& 
  (RootPanel.get("someOtherHomeWidget")!=null)) 
 
  // do the stuff 
 

为了在 Home 时不执行 Admin Entrypoint 页面打开,反之亦然。

不做上面的检查还涉及到,如果我有一个 div 无论我注入什么,主页和管理页面中的名称都相同 它在每个人身上出现两次。

这在 1000 英里外很臭,显然是错误的:什么是正确的 在人们的经验中如何做到这一点?

任何帮助表示赞赏!

【问题讨论】:

【参考方案1】:

正确的方法是每个模块有一个入口点,将适当的小部件粘贴在适当的 div 中:

RootPanel panel = RootPanel.get("someHomeWidget");
if (panel) panel.add(new HomeWidget());

panel = RootPanel.get("adminWidget");
if (panel) panel.add(new AdminWidget());

这样它只会扫描页面以查找您拥有的任何 div 并插入适当的小部件。因此,您的 html 页面决定了何时显示哪些小部件,并且 GWT 代码已准备好处理任何情况。上面没有什么不好的地方,这是你的入口点应该写的方式。

另一种方法是,如果您的管理区域和正常区域完全不同(例如:您想在不同时间加载它们),那么它们应该是单独的模块,具有单独的入口点。

【讨论】:

在我的情况下,主页和管理页面需要在不同的时间加载(它们是不同的页面!) - 所以即使只有一个入口点,它也找不到 div 并且会抛出一个例外。另一方面,使用不同的模块不清楚的是如何配置哪个页面应该触发哪个模块。 为什么找不到 div?您确实意识到可以将 GWT 的 javascript 导入放在任意数量的页面上。所以你把它放在你的管理页面上,让管理 div 在页面的下方。然后你也会把它放在普通页面上,并将普通 div 放在页面下方。另一方面,如果你有多个模块,你只需在你想要的页面上包含你想要的模块的 javascript 导入,这真的很简单。 这似乎只在生产模式下运行代码时有效。在Eclipse开发模式下,onModuleLoad()会抛出异常。【参考方案2】:

我还想在 GWT 玩具应用中使用多个页面,我想我想通了。它需要对部署描述符(myApp.gwt.xml)进行一些按摩,但这就是我所做的。

创建了另一个实现 EntryPoint 的类,并添加了一些仅在新页面中添加到 div 的代码。 复制了原来的gwt.xml,改了两处: 模块重命名为 - 我改为“anothergwtapp” 入口点指定了新类。 当我编译项目时,“war”文件夹中有另一个目录,名为(等待它...)“anothergwtapp”。它包含 GWT 魔法“anothergwtapp.nocache.js”。 最后,我复制了原始的 HTML 页面并将“stockwatcher/stockwatcher.nocache.js”替换为“anothergwtapp/anothergwtapp.nocache.js”(是的,我很新——教程还在我的机器上) 我将新的 HTML 更改为稍有不同(新的 div 用于填充新入口点的 onload),并在第一页的新页面中添加了一个简单的 href。

成功了。只需复制 gwt.xml 并为模块提供一个新名称以与新的应用程序页面一起使用。我查看了其他一些链接,实际上我可能已经完成了所描述的内容,但是有太多的单词和重定向等(即我并没有真正阅读任何内容)。我正在为 Galileo 使用最新的 GWT 插件,所以现在可能是 IJW。

【讨论】:

我一直在寻找这个!谢谢。【参考方案3】:

不要将管理页面和主页视为不同的页面。页面的概念不适用于 GWT,因为只有一个页面,即单个入口点。 如果要实现不同页面的效果,那就使用GWT的URL重写功能吧。

如果你确实想使用不同的入口点,那么如上面评论中所说,使用不同的模块。

【讨论】:

谢谢 - 我对 URL 重写不是很熟悉(你能提供一些链接吗?) - 在这个模块和多个模块之间最好的方法是什么?在您描述的场景中,为什么首先可以定义多个入口点?您是说永远不应使用同一模块中的多个入口点吗? 嗨,John,对于 URL 重写,我建议您在 GWT 中浏览与历史相关的全部内容。基于模块的事物的多个入口点 - 很多时候,特别是对于企业应用程序,您可能希望部署一组模块,而不是根据客户购买的内容部署其他模块组。这就是模块的基本概念。每个模块都有一个单独的入口点,是一个可单独部署的应用程序单元。单个模块中的多个入口点,从技术和业务角度对我来说都没有意义。【参考方案4】:

通常最好只有一个入口点。一个模块中的多个入口点都是同时启动的,这有时会做你意想不到的事情。

在如何单独处理它时,您有很多选择: - 有 2 种不同的编译,一种用于 Admin,一种用于 Home 应用程序。 - 使用历史标记表明您想要管理员或主页 - 检查一个 JS 变量以显示一个或另一个 - 检查是否存在特定的 DIV id 以显示 Admin 或 Home (RootPanel.get(id)) - 使用 URL 参数来指示应用程序。 - ...等

【讨论】:

您对同时开始的多个入口点的评论是我在尝试打包基本应用程序并对其进行扩展时遇到的情况。感谢您确认我对为什么可以多次调用入口点的怀疑。【参考方案5】:

有一个简单(棘手)的方法来实现这一点:

将 Main 类设为您的入口点。

<module rename-to='gwt'>
  <inherits name='com.google.gwt.user.User'/>
  <entry-point class='com.example.client.Main'/>
  <source path='client'/>
  <source path='shared'/>
</module>;<br/>

创建此 Main.java 以像调度程序一样工作:

package com.example.client;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.RootPanel;

public class Main implements EntryPoint 

  public void onModuleLoad() 

    String url = Window.Location.getHref();
    if ( url.indexOf("?install")>-1 ) 
      Install install = Install.getInstance();
      RootPanel.get().add(install);      
    else if ( url.indexOf("?admin")>-1 ) 
      Admin admin = Admin.getInstance();
      RootPanel.get().add(admin);    
     else 
      Application app = Application.getInstance();
      RootPanel.get().add(app);      
    
  

现在不同的类应用程序、管理和安装 像单独的单位一样工作。

这里是一个简单的安装示例:

package comexample.client;

import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HTML;

public class Install extends FlowPanel 

  /** Singleton stuff - to access Main from all subclasses! */
  private static Install singelton;
  public static Install getInstance() 
    if (singelton == null) singelton = new Install();
    return singelton;
  

  /** Constructor - called by Main.onModuleLoad() */
  private Install() 
    this.add(new HTML("<h1>Do whatever You have to do!</h1>"));
  

您不需要 Singleton 的东西 (getInstance),但它在大型应用程序中非常方便。

现在在 /war-directory 中创建名为 install 和 admin 的目录,并在其中创建一个 HTML 页面,如下所示:

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="refresh" content="0; URL=/index.html?install">
</head>
<body></body>
</html>

所以当用户将他的浏览器指向http://www.example.com/install 时,他将被重定向到http://www.example.com/index?install,并且 index.html 绑定到 Main.java,它将分派请求并加载 Install.java

【讨论】:

【参考方案6】:

我的博客上有一个解决方案。您可以下载具有多个入口点并使用 url-rewriting 的示例 maven 项目。看一看:http://zenoconsulting.wikidot.com/blog:16

【讨论】:

【参考方案7】:

你试过这个框架了吗? http://gwtmultipage.org/ 克劳狄斯

【讨论】:

以上是关于同一模块中有多个入口点的问题的主要内容,如果未能解决你的问题,请参考以下文章

如何使用具有多个页面和入口点的 React 和 TypeScript 设置 chrome 扩展?

具有多个入口点的 Webpack watch() - 为未更改的文件发送捆绑包?

如何使用具有多个入口点的 Webpack 和 Gulp 来转换应用程序和测试目录?

C#提示不只定义了一个入口点,请使用/main进行编译以指定包含入口点的类型

如何在 package.json 中有多个入口点?

程序定义了多个入口点? CS0017 main() 有问题?