Show Menu
主题×

AEM项目原型的ui.frontend模块

AEM Project Archetype包括一个可选的、基于Webpack的专用前端构建机制。 因此,ui.frontend模块成为项目所有前端资源(包括JavaScript和CSS文件)的中心位置。 要充分利用这一有用、灵活的功能,必须了解前端开发如何适合AEM项目。

AEM Projects和前端开发

AEM项目简单易用,可视为由两个单独但相关的部分组成:
  • 后端开发,它驱动AEM的逻辑并生成Java库、OSGi服务等。
  • 前端开发,它驱动生成网站的演示和行为并生成JavaScript和CSS库
由于这两个开发过程都集中在项目的不同部分,因此后端和前端开发可以并行进行。
但是,任何最终的项目都需要同时使用这些开发工作的产出,即后端和前端。
npm run dev 行开始前端构建过程,该过程收集存储在ui.frontend模块中的JavaScript和CSS文件,并生成调用并存放在ui.apps模块中的两个精简客户端库 clientlib-site``clientlib-dependencies 或ClientLib。 ClientLib可部署到AEM,并允许您将客户端代码存储在存储库中。
当使用所有项目对象(包括ClientLib)运 mvn clean install -PautoInstallPackage 行整个AEM项目原型时,系统会将其推送到AEM实例。

ClientLibs概述

前端模块可通过AEM ClientLib 使用 。 执行NPM构建脚本时,将构建应用程序,aem-clientlib-generator包将获得的构建输出并将其转换为此类ClientLib。
ClientLib将包含以下文件和目录:
  • css/ : 可在HTML中请求的CSS文件
  • css.txt : 告诉AEM文件的顺序和名称, css/ 以便合并它们
  • js/ : 可在HTML中请求的JavaScript文件
  • js.txt 告诉AEM文件的顺序和名称, js/ 以便合并它们
  • resources/ : 源映射、非入口点代码块(由代码拆分产生)、静态资产(例如图标)等。

可能的前端开发工作流

前端构建模块是一个实用且非常灵活的工具,但并未对它的使用方式提出任何具体意见。 以下是两个可能的使 用示例 ,但您的个别项目需求可能决定其他使用模式。

使用Webpack Static Development Server

使用Webpack,您可以根据ui.frontend模块中AEM网页的静态输出进行样式设计和开发。
  1. 预览AEM中的页面(使用页面预览模式 wcmmode=disabled 或在URL中传递)
  2. 视图页面源并在ui.frontend模块中另存为静态HTML
  3. 开始Web Pack并开始设计样式并生成必要的JavaScript和CSS
  4. npm run dev 行以生成ClientLib
在此流程中,AEM开发人员可执行步骤一和步骤二,并将静态HTML传递给前端开发人员,后者根据AEM HTML输出进行开发。
您还可以利用组 件库 ,捕获每个组件标记输出的样本,以便在组件级别而不是页面级别工作。

使用故事书

使 用Storybook ,您可以执行更多原子前端开发。 尽管AEM Project Archetype中不包含Storybook,但您可以安装它并在ui.frontend模块中存储Storybook对象。 准备好在AEM中进行测试后,可通过运行将它们部署为ClientLib npm run dev
AEM Project Archetype中不包含Storybook。 如果选择使用它,则必须单独安装它。

确定标记

无论您决定为您的项目实施哪个前端开发工作流程,后端开发人员和前端开发人员都必须首先同意该标记。 通常,AEM定义由核心组件提供的标记。 但是,如有必要,可以自定义此项

ui.frontend模块

AEM Project Archetype包括基于Webpack的可选专用前端构建机制,该机制具有以下功能。
  • 完全TypeScript、ES6和ES5支持(带有适用的Webpack包装)
  • 使用TSLint规则集的TypeScript和JavaScript linting
  • ES5输出,支持传统浏览器
  • 通配
    • 无需在任何位置添加导入
    • 现在,所有JS和CSS文件都可添加到每个组件。
      • 最佳实践在 /clientlib/js 以下 /clientlib/css 、或 /clientlib/scss
    • 由于 .content.xml 所有内 js.txt 容都通过Webpack运行 css.txt ,因此无需任何或/文件。
    • 该全局程序将拉入该文件夹下的所有JS /component/ 文件。
      • Webpack允许通过JS文件链接CSS/SCSS文件。
      • 他们被拉进两个入口点, sites.js 然后 vendors.js
    • AEM使用的唯一文件是输 site.js 出文 site.css /clientlib-site dependencies.js 以及 dependencies.css /clientlib-dependencies
  • 区块
    • 主要(站点js/css)
    • 供应商(依赖项js/css)
  • 完全Sass/Scss支持(Sass通过Webpack编译为CSS)
  • 具有内置代理的静态WebPack开发服务器,指向AEM的本地实例
有关ui.frontend模块的更多技术信息,请参阅GitHub 上的文档

安装

  1. 局安装 NodeJS(v10+)。 这也将安装npm。
  2. 在项目中导航到ui.frontend并运行 npm install
您必须运 行带有 “填充ui. -DoptionIncludeFrontendModule=y frontend”文件夹”选项的原型。

使用

以下npm脚本驱动前端工作流:
  • npm run dev -禁用JS优化(树摇动等)和源映射并禁用CSS优化的完整构建。
  • npm run prod -在启用JS优化(树摇动等)、禁用源映射和启用CSS优化的情况下实现完整构建。
  • npm run start -开始静态webpack开发服务器进行本地开发,并且对AEM的依赖性最小。

输出

ui.frontend模块编译文件夹下的代码 ui.frontend/src ,并输出已编译的CSS和JS以及名为的文件夹下的任何资源 ui.frontend/dist
  • 站点 - site.js 以及布局相关 site.css 图像和字体的文件夹都在clientlib-site文 resources/``dist/ 件夹中创建。
  • 依赖项 - dependencies.js dependencies.css 在文件夹中创 dist/clientlib-dependencies 建。

JavaScript

  • 优化——对于生产构建,所有未使用或未调用的JS都会被删除。

CSS

  • 自动预修——所有CSS都通过预修器运行,任何需要预修的属性都将自动在CSS中添加这些属性。
  • 优化——在发布时,所有CSS都通过优化程序(cssnano)运行,优化程序根据以下默认规则将其标准化:
    • 尽可能减少CSS计算表达式,确保浏览器兼容性和压缩在等效长度、时间和角度值之间进行转换。 请注意,默认情况下,长度值不会转换。
    • 删除规则、选择器和声明中及周围的注释
    • 删除重复的规则、at规则和声明
      • 请注意,这仅适用于精确重复。
    • 删除空规则、媒体查询和具有空选择器的规则,因为它们不影响输出
    • 按选择器和重叠的属性/值对合并相邻规则
    • 确保CSS文件中仅存在一个@charset并将其移至文档顶部
    • 当结果输出较小时,将CSS初始关键字替换为实际值
    • 使用SVGO压缩内联SVG定义
  • 清理——包括明确的清理任务,用于按需清除生成的CSS、JS和映射文件。
  • 源映射——仅限开发构建
前端构建选项利用共享公共配置文件的仅开发和仅生产Webpack配置文件。 这样,可以单独修改开发和生产设置。

客户端库生成

ui.frontend模块构建过程利用 aem-clientlib-generator plugin将编译的CSS、JS和任何资源移入ui.apps模块。 aem-clientlib-generator配置在中定义 clientlib.config.js 。 将生成以下客户端库:
  • clientlib-site - ui.apps/src/main/content/jcr_root/apps/<app>/clientlibs/clientlib-site
  • clientlib-dependencies - ui.apps/src/main/content/jcr_root/apps/<app>/clientlibs/clientlib-dependencies

在页面上包括客户端库

clientlib-site clientlib-dependencies 类别通过页面策略配 置作为默认模板的一 部分,包括在页面上。 要视图策略,请编辑“内 容页面模板”>“页面信息”>“页面策略 ”。
站点页面中最终包含的客户端库如下:
<HTML>
    <head>
        <link rel="stylesheet" href="clientlib-base.css" type="text/css">
        <script type="text/javascript" src="clientlib-dependencies.js"></script>
        <link rel="stylesheet" href="clientlib-dependencies.css" type="text/css">
        <link rel="stylesheet" href="clientlib-site.css" type="text/css">
    </head>
    <body>
        ....
        <script type="text/javascript" src="clientlib-site.js"></script>
        <script type="text/javascript" src="clientlib-base.js"></script>
    </body>
</HTML>

当然,可以通过更新页面策略和/或修改各个客户端库的类别和嵌入属性来修改上述包含内容。

静态Webpack Development Server

ui.frontend模块包含一个webpack-dev-server,它为AEM外的快速前端开发提供实时重装。 安装程序利用html-webpack-plugin自动将从ui.frontend模块编译的CSS和JS注入静态HTML模板。

重要文件

  • ui.frontend/webpack.dev.js
    • 它包含webpack-dev-serve的配置并指向要使用的html模板。
    • 它还包含运行在localhost:4502上的AEM实例的代理配置。
  • ui.frontend/src/main/webpack/static/index.html
    • 这是服务器将运行的静态HTML。
    • 这允许开发人员进行CSS/JS更改,并立即在标记中反映这些更改。
    • 假定此文件中放置的标记准确反映了AEM组件生成的标记。
    • 此文件中的标记不会自动与AEM组件标记同步。
    • 此文件还包含对存储在AEM中的客户端库(如核心组件CSS和响应式网格CSS)的引用。
    • Webpack开发服务器设置为根据中的配置代理运行的AEM实例中的这些CSS/JS包 ui.frontend/webpack.dev.js

使用

  1. 从项目的根目录中运行命令 mvn -PautoInstallSinglePackage clean install ,将整个项目安装到运行于的AEM实例 localhost:4502
  2. 在文件夹内 ui.frontend 导航。
  3. 运行以下命令 npm run start 以开始webpack dev server。 启动后,它应打开浏览器( localhost:8080 或下一个可用端口)。
您现在可以修改CSS、JS、SCSS和TS文件,并立即查看Webpack开发服务器中反映的更改。