【发布时间】:2020-09-23 09:31:39
【问题描述】:
我正在将我的 Spring Boot + Vaadin 应用程序从“Vaadin 13 兼容模式”中的 Vaadin 14 切换到“本机 Vaadin 14 模式”。这主要是因为我想使用 Vaadin Gradle 插件以便能够启用生产模式。这也需要从 Full Calendar web component 升级到 Full Calendar 4 web component,它现在支持 Vaadin 14+ 并且还封装了更新版本的 FullCalendar。不幸的是,很多事情需要同时发生。
我现在遇到的问题是,当显示 FullCalendar 组件时,我收到此客户端错误:
(ReferenceError) : 时刻未定义
我看到 FullCalendar Web 组件 jar 在 org.vaadin.stefan.fullcalendar 包中的 FullCalendar 类上有这些注释:
@NpmPackage(value = "moment", version = "2.24.0")
@NpmPackage(value = "moment-timezone", version = "0.5.28")
@NpmPackage(value = "@fullcalendar/moment", version = "4.4.0")
@NpmPackage(value = "@fullcalendar/moment-timezone", version = "4.4.0")
之所以在这里列出前两个,可能是因为它们被定义为后两个的对等依赖项,所以不会自动安装。
我还注意到 FullCalendar 4 Web 组件页面提到了以下已知问题:
构建问题/JS(客户端)错误(V14+)
可能是传递依赖没有正确解析。
如果您使用的是 Spring Boot,请将 @EnableVaadin 注解添加到您的应用程序类中。添加包 org.vaadin.stefan 加上你的根包作为参数。这应该使 Spring 能够在运行时分析所有 npm 依赖项。其他 CDI 版本应该也能正常工作。
所以我已将此注释添加到我的应用程序类中:
@SpringBootApplication
@EnableVaadin({"org.vaadin.stefan", "com.mypackage"})
public class MyApplication {
但这似乎不起作用。
我也尝试过运行 gradle 任务 vaadinBuildFrontend 而不仅仅是 vaadinPrepareFrontend,但这并没有什么不同。
我还应该做些什么来确保moment 被正确加载和初始化?
更新:如果我在build.gradle 中显式启用vaadin.productionMode,那么错误就消失了。当然,我也希望能够在开发模式下运行应用程序。
更新 2:我已经尝试从提供的基础项目创建一个干净的 Vaadin + Spring Boot + Gradle 项目。我注意到一个不同之处:在我自己的应用程序中,我收到了一条警告:
dev-updater : Couldn't find dev dependencies file. Dev dependencies won't be locked
...我没有进入干净的项目。我在那里得到了以下我自己的项目中没有的日志记录行:
dev-updater : Visited 88 classes. Took 16 ms.
dev-updater : Skipping `pnpm install` because the frontend packages are already installed...
dev-updater : Copying frontend resources from jar files ...
dev-updater : Visited 13 resources. Took 84 ms.```
UDPATE 3:我发现moment() 函数实际上是从使用calendar.getElement().executeJs(...) 执行的代码中调用的。显然,该功能在该范围内是未知的。也许是由于严格模式?不确定这是否解释了它为什么在生产模式下工作。
【问题讨论】:
标签: spring-boot vaadin vaadin-flow vaadin14