我正在将我的 Spring Boot + Vaadin 应用程序从“Vaadin 13 兼容模式”中的 Vaadin 14 切换到“本机 Vaadin 14 模式”。这主要是因为我想使用 Vaadin Gradle 插件以便能够启用生产模式。这也需要从Full Calendar web 组件升级到Full Calendar 4 web component,它现在支持 Vaadin 14+ 并且还包装了更新版本的FullCalendar。不幸的是,很多事情需要同时发生。
我现在遇到的问题是,当显示 FullCalendar 组件时,我收到此客户端错误:
(ReferenceError) : 时刻未定义
我看到 FullCalendar Web 组件 jarFullCalendar
在包中的类上有这些注释org.vaadin.stefan.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
而不是 just vaadinPrepareFrontend
,但这并没有什么不同。
我还应该做些什么来确保moment
正确加载和初始化?
更新:如果我明确启用vaadin.productionMode
in build.gradle
,那么错误就消失了。当然,我也希望能够在开发模式下运行应用程序。
更新 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(...)
. 显然,该功能在该范围内是未知的。也许是由于严格模式?不确定这是否解释了为什么它在生产模式下工作。