sencha app build构建报错但sencha app watch正常如何排查
sencha app watch运行正常但构建后报别名不存在,核心原因是两种模式的加载逻辑不同:watch模式默认开启动态加载,会按需拉取所有请求到的框架类,不会做裁剪;而testing/production构建会做静态依赖扫描,只把扫描到的引用类打进产物,只要扫描阶段漏识别了类引用,就会出现Unrecognized alias报错,你遇到的两个问题都属于这个范畴,按以下步骤排查即可:
1. 补全app.json的工具包级依赖
不要依赖框架的隐式引入规则,手动将缺失别名对应的实体类加到对应工具包的requires配置中:
- Modern工具包的
passwordfield别名对应类是Ext.field.Password,找到app.json中modern配置块下的requires数组,加入该类名 - Classic工具包的
layout: 'center'别名对应类是Ext.layout.container.Center,找到app.json中classic配置块下的requires数组,加入该类名
注意:不要把分工具包的类加到全局requires中,会导致Modern/Classic两个构建产物都混入无关类,徒增包体积。
2. 规范自定义类的依赖声明
Cmd的静态依赖扫描对字符串形式的xtype、layout type识别能力有限,所有自定义视图、控制器、模型中用到的组件、布局、插件,必须在类定义顶部的requires数组中显式声明,不要靠全局动态加载兜底。
错误写法示例(会导致扫描漏类):
Ext.define('MyApp.view.login.Form', { extend: 'Ext.form.Panel', items: [{ xtype: 'passwordfield', name: 'password' }] })
正确写法:
Ext.define('MyApp.view.login.Form', { extend: 'Ext.form.Panel', // 显式声明所有用到的类,扫描器会识别并打包 requires: ['Ext.field.Password'], items: [{ xtype: 'passwordfield', name: 'password' }] })
Classic布局的处理逻辑完全一致:用到center布局的容器,必须在自身requires中加入Ext.layout.container.Center。
3. 排查构建配置的排除规则
如果补全requires后仍报错,检查app.json中的构建配置:
- 确认每个工具包对应的build配置中,
classpath没有遗漏业务代码目录 - 检查
exclude配置块,确认没有写过宽的排除规则把Ext.field.Password、Ext.layout.container.Center这类框架基础类误排除 - 可以临时给构建配置加
"debug": true参数,执行sencha app build testing,翻构建日志里的Excluding class条目,确认目标类是不是被标记为未使用裁掉了。
4. 清理缓存全量重构建
Cmd的增量构建缓存经常会出现依赖扫描异常,配置改完后按以下流程清缓存重打:
- 删除项目根目录下的
build文件夹 - 删除系统用户目录下的
.sencha缓存目录(Windows路径为C:\Users\你的用户名\.sencha,Mac/Linux路径为~/.sencha) - 在项目根目录执行
sencha app refresh重新生成类引导文件 - 执行
sencha app build testing做全量构建,不要用增量构建命令。
如果以上步骤做完还是有个别类识别不到,可以直接在对应工具包的requires数组中强制加入缺失类,属于临时兜底方案,只会小幅增加包体积,不影响功能运行。
内容的提问来源于stack exchange,提问作者MX Starter

