整体架构
坦率地说,示例应用程序没有太多架构。去年我做了很多教程。很容易选择一个现有的示例应用程序,然后添加 maven 插件来缩小资源。结果发现,在我去年做的所有教程中,有一个非常适合本教程。这是关于使用 AngularJS 的 HTML 编辑器的教程。这是我的原始教程的链接 - Reusable HTML Editor Control with AngularJS。本教程中的示例应用程序包含三个 JavaScript 文件和一个 CSS 文件。其中一个 JavaScript 文件有 630 多行。很高兴看到这个文件被缩小并在包含到 HTML 中后工作。它确实如此。
现在我有了一个示例应用程序,我所要做的就是找到一个 maven 插件,然后添加到项目中。最大的问题是我需要未缩小的资源文件以便解决问题,并且我想在准备部署应用程序时使用缩小的文件。您可能知道,选择哪种文件作为 HTML 代码的一部分必须在运行时或打包时以某种方式决定。我应该选择哪一个?事实证明,在运行时在未缩小文件和缩小文件之间进行选择更容易。这是 ASP.NET MVC 在应用程序启动期间使用捆绑对象的工作方式。如果知道如何动态加载资源文件,它可以很容易地复制到基于 Spring Boot 的应用程序中。可以使用 Thymeleaf 模板引擎来完成服务器端 HTML 渲染。
这个想法是我有一个配置文件。其中,有一个属性将指示应用程序将运行的环境,应用程序将相应地加载资源文件。在构建时,我将配置构建,以便缩小文件与原始资源文件位于同一文件夹中。然后使用配置文件来决定何时加载缩小的资源文件。下一节将分为两个小节。第一个小节将讨论如何添加 maven 插件来缩小资源文件。第二小节将讨论如何使用配置文件加载资源。
在 Spring Boot Web 应用程序中使用压缩资源
我已经解释了如何构建和利用缩小的资源。现在是解释如何完成这两个步骤的时候了。在下一小节中,我将解释为什么我选择 yui-compressor maven 插件以及它是如何添加到构建配置中的。
使用 Yui-Compressor 插件
我选择 yui-compressor 作为压缩 web 应用程序资源文件的工具的原因是这个工具已经存在了很长时间,根据我阅读的评论,它的 maven 插件是一个很棒的插件。它还有非常详细的文档,解释了如何使用插件。我没有查看其他插件以获取更多信息。对我来说,我会更加信任一个有据可查并且已经存在很长时间的插件。
将此插件添加到构建过程中一点也不难。难的是配置插件和自定义资源文件缩小过程。在本教程中,我只使用了最基本的配置。对于读者,请查阅相关文档以了解此插件的高级使用。
我为构建所做的所有更改都可以在我的 maven POM 文件中找到。如果您不理解我在下面描述的更改,请参考此文件,它会一目了然。
我做的第一件事是将 yui-compressor 插件依赖添加到dependencies
POM 文件的部分。
在上面的代码片段中,我添加了两个新的依赖项,第一个是用于服务器端渲染 HTML 源代码的 ThymeLeaf 启动器依赖项。第二个是粗体的 yui-compressor maven 插件,我们需要它来压缩资源文件。
POM 文件尚未完成。下一步是配置插件,如下所示:
这部分可能非常复杂。但我不需要复杂的压缩处理。所以上面的代码片段不难理解。首先,我将插件配置为在压缩阶段运行。我猜这是生成 jar 文件的阶段。我不熟悉这个特定阶段,无法解释更多。如果您想了解更多信息,请查看它。在configuration
插件部分,我将标志设置force
为“true
“。这是为了删除之前压缩的资源文件,以便可以再次压缩原始文件。我测试过,如果我不设置这个标志,会有一些解决编译警告。警告抱怨缩小文件存在并且需要设置此标志才能删除此警告。据我所知,此标志用于定义压缩器的行为,以保留现有的缩小文件或删除这些缩小文件以便可以创建新文件。还有那个excludes
部分,这个部分我把三个目录的所有文件都添加到这里了,原因是这些文件是第三方资源文件,已经被缩小了,再次缩小时会抛出编译错误。所以他们可以排除在处理之外。
这还不算太糟糕,不是吗?我不会破坏乐趣。您,读者,将在如何运行示例应用程序部分中看到这个插件的运行。在下一小节中,我将解释如何使用 ThymeLeaf 通过配置加载缩小或未缩小的文件。
通过配置利用缩小/未缩小的资源文件
在我的原始教程中,索引 HTML 文件是位于文件夹资源/静态中的静态文件。这意味着任何资源文件(如 CSS 或 JS 文件)都被硬编码在此文件中。这不适用于我的示例应用程序。现在我拥有原始资源文件和缩小的资源文件。我不能将两者都放在同一个文件中,并且必须选择要使用的文件。我需要的是,当我开发应用程序时,我想使用未缩小的资源文件。当我准备好将应用程序部署到生产环境时,应该使用最小化的资源。这就是为什么我需要一种方法来拥有两组资源文件,并在适当的时间加载一个而不是另一个。
ASP.NET MVC 已经可以通过应用程序启动包配置来解决这个问题。那是我可以使用 .NETConfigurationManager
加载配置值的地方,然后决定是否捆绑未缩小或缩小的资源文件。我可以在我的 Spring Boot 应用程序中做同样的事情。为了实现这一点,我需要一种在服务器端呈现 HTML 文件的方法。然后我可以自定义要为该页面加载的资源文件。