You need to enable JavaScript to run this app. Maizzle生产构建时如何保留组件内嵌入的运行时执行PHP代码
优惠活动
大模型
产品
解决方案
定价
更多

Maizzle生产构建时如何保留组件内嵌入的运行时执行PHP代码

组件内PHP代码被构建剥离问题说明

核心原因

Maizzle默认构建流程的执行顺序存在固定层级:

  1. 第一阶段:递归解析所有<component>标签引入的外部组件文件,完成跨文件内容拼接
  2. 第二阶段:执行用户自定义的posthtml插件规则、模板表达式忽略逻辑

你现有配置仅在主模板场景生效,是因为主模板中的PHP代码在第一阶段拼接完成后,进入第二阶段时被规则识别、正常保留;但组件内的PHP代码在第一阶段组件解析时,就被默认的HTML语法清洗逻辑识别为非法节点直接剥离,根本没有机会进入第二阶段的规则匹配流程,这不属于Maizzle的固有能力限制。

可落地解决方案

方案1:使用框架内置的raw标签替代自定义rawcode标签

  • 框架内置的raw标签解析规则是全局生效的,会覆盖主模板、普通组件、嵌套组件所有场景,不需要额外配置就会跳过内容的编译、剥离逻辑
  • 自定义的rawcode标签因为不在框架内置的忽略白名单中,组件解析阶段不会对它包裹的内容做特殊保护,因此无法阻止内容被剥离
  • 调整组件内的代码写法,将自定义标签替换为内置标签:
<!-- 组件文件 compname.html 内的调整后代码 -->
<p>News for the Week of 
  <raw>
    <?php echo $start_date ?> to <?php echo $end_date ?> from the following categories: <?php echo $cat01, $cat02, $cat03, $cat04 ?>
  </raw>
</p>
  • 注意表达式配置里的忽略标签字段需要使用复数形式ignoredTags,支持数组传入多个需要全局忽略解析的标签名,单数字段ignoredTag仅对主模板场景生效。

方案2:调整posthtml插件执行优先级,提前PHP识别逻辑

  • 将PHP识别插件的挂载顺序提前到组件解析插件之前,在组件解析阶段就把PHP代码块转成不会被HTML清洗逻辑误删的文本节点
  • 调整后的生产配置参考:
// config.production.js
module.exports = {
  posthtml: {
    plugins: [
      // 第一优先级:先识别所有文件中的PHP语法结构
      require('posthtml-custom-elements')({
        directives: [
          { name: '?php', start: '<', end: '>' }
        ]
      }),
      // 第二优先级:再执行组件解析逻辑
      require('@maizzle/framework/src/posthtml/components')(),
    ]
  },
  expressions: {
    ignoredTags: ['raw', 'rawcode']
  }
}

方案3:组件内PHP代码前置实体转义

  • 不需要调整插件配置,在编写组件时直接将PHP代码里的尖括号做HTML实体转义,利用构建流程的实体反转译规则输出原始PHP代码
  • 转义后的组件写法参考:
<p>News for the Week of &lt;?php echo $start_date ?&gt; to &lt;?php echo $end_date ?&gt; from the following categories: &lt;?php echo $cat01, $cat02, $cat03, $cat04 ?&gt;</p>
  • 配套生产配置需要关闭HTML实体压缩规则,避免转义内容被二次处理:
// 生产配置补充
prettify: {
  extra: {
    unescapeAll: true
  }
}

上述方案中,单组件场景优先选择方案1即可解决问题,嵌套组件、大量复用PHP代码块的场景适合选择方案2。

内容的提问来源于stack exchange,提问作者markm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.02 19:06:03