我试图做的是覆盖所有AJAX请求,包括AJAX代理,所以我创建的是Ext.data.Connection的覆盖。在开发模式下,这就像一个魅力,但在生产版本中,事情变得有点奇怪。
事情变得奇怪的原因是因为我们正在做一些"拆分"构建的事情(链接在这里)。这意味着,我们将所有框架代码放入其自己的文件中,然后使用"app.js",这本质上是我们用于启动应用程序的内容,以及"viewport.js",这是启动成功后的实际应用程序。我们这样做是因为在"app.js"中,我们有一个身份验证调用,确保用户有效,如果他们有效,那么我们加载"viewport.js"。
我认为这样做的问题是,因为我们正在覆盖这样一个核心功能,所以在app加载之前它实际上不会被覆盖.js,在这一点上,Ext.Ajax--被覆盖的类Ext.data.Connection的单例-已经被创建,我们失去了覆盖它。看起来覆盖包含在 app.js 中,因此此假设是有意义的。
我认为需要发生的是构建.xml需要在框架.js文件中包含此覆盖,但我真的不知道该怎么做......我从未与蚂蚁打过交道,所以我甚至不确定我会从哪里开始。如果有人能指出我正确的方向,那将非常有帮助。这就是构建.xml现在的样子(请参阅开始自定义添加注释,了解我们添加拆分代码的位置):
<?xml version="1.0" encoding="utf-8"?>
<project name="NewApp" default=".help">
<!-- Find and load Sencha Cmd ant tasks -->
<script language="javascript">
<![CDATA[
var dir = project.getProperty("basedir"),
cmdDir = project.getProperty("cmd.dir"),
cmdLoaded = project.getReference("senchaloader");
if (!cmdLoaded) {
function echo(message, file) {
var e = project.createTask("echo");
e.setMessage(message);
if (file) {
e.setFile(file);
}
e.execute();
};
if (!cmdDir) {
function exec(args) {
var process = java.lang.Runtime.getRuntime().exec(args),
input = new java.io.BufferedReader(new java.io.InputStreamReader(process.getInputStream())),
headerFound = false,
line;
while (line = input.readLine()) {
line = line + '';
java.lang.System.out.println(line);
if (line.indexOf("Sencha Cmd") > -1) {
headerFound = true;
}
else if (headerFound && !cmdDir) {
cmdDir = line;
project.setProperty("cmd.dir", cmdDir);
}
}
process.waitFor();
return !!cmdDir;
}
if (!exec(["sencha", "which"])) {
var tmpFile = "tmp.sh";
echo("source ~/.bash_profile; sencha " + whichArgs.join(" "), tmpFile);
exec(["/bin/sh", tmpFile]);
new java.io.File(tmpFile)['delete']();
}
}
}
if (cmdDir && !project.getTargets().containsKey("init-cmd")) {
var importDir = project.getProperty("build-impl.dir") ||
(cmdDir + "/ant/build/app/build-impl.xml");
var importTask = project.createTask("import");
importTask.setOwningTarget(self.getOwningTarget());
importTask.setLocation(self.getLocation());
importTask.setFile(importDir);
importTask.execute();
}
]]>
</script>
<!--
The following targets can be provided to inject logic before and/or after key steps
of the build process:
The "init-local" target is used to initialize properties that may be personalized
for the local machine.
<target name="-before-init-local"/>
<target name="-after-init-local"/>
The "clean" target is used to clean build output from the build.dir.
<target name="-before-clean"/>
<target name="-after-clean"/>
The general "init" target is used to initialize all other properties, including
those provided by Sencha Cmd.
<target name="-before-init"/>
<target name="-after-init"/>
The "page" target performs the call to Sencha Cmd to build the 'all-classes.js' file.
<target name="-before-page"/>
<target name="-after-page"/>
The "build" target performs the call to Sencha Cmd to build the application.
<target name="-before-build"/>
<target name="-after-build"/>
-->
<!-- BEGIN CUSTOM ADDITION TO BUILD.XML -->
<target name="-after-js">
<!-- The following is derived from the compile-js target in
.sencha/app/js-impl.xml. Compile the viewport and all of its
dependencies into viewport.js. Include in the framework
dependencies in the framework file. -->
<x-compile refid="${compiler.ref.id}">
<![CDATA[
union
-r
-class=${app.name}.view.main.Main
and
save
viewport
and
intersect
-set=viewport,allframework
and
include
-set=frameworkdeps
and
save
frameworkdeps
and
include
-tag=Ext.cmd.derive
and
concat
-remove-text-references=${build.remove.references}
-optimize-string-references=${build.optimize.string.references}
-remove-requirement-nodes=${build.remove.requirement.nodes}
${build.compression}
-out=${build.framework.file}
${build.concat.options}
and
restore
viewport
and
exclude
-set=frameworkdeps
and
exclude
-set=page
and
exclude
-tag=Ext.cmd.derive,derive
and
concat
-remove-text-references=${build.remove.references}
-optimize-string-references=${build.optimize.string.references}
-remove-requirement-nodes=${build.remove.requirement.nodes}
${build.compression}
-out=${build.out.base.path}/${build.id}/viewport.js
${build.concat.options}
]]>
</x-compile>
<!-- Concatenate the file that sets the main view. -->
<concat destfile="${build.out.base.path}/${build.id}/viewport.js" append="true">
<fileset file="classic/viewport.js"/>
</concat>
</target>
<target name="-before-sass">
<!-- The viewport is not explicitly required by the application,
however, its SCSS dependencies need to be included. Unfortunately,
the property required to filter the output, sass.name.filter, is
declared as local and cannot be overridden. Use the development
configuration instead. -->
<property name="build.include.all.scss" value="true"/>
</target>
</project>
回顾一下,运行sencha 应用程序监视并加载页面将显示 Ext.Ajax 单例的侦听器,但运行sencha 应用程序构建生产并加载页面将显示不显示侦听器。不,我不希望创建自己的 Ext.Ajax 版本或我自己的数据代理......我意识到这可能是正确的方法,但是有很多代码我必须替换它,这将是我目前没有时间进行的大量回归测试。
我想我可能已经想通了,但它可能效率低下。 我所做的是更新 Build.xml 文件以包含页面,并将框架.js文件的输出写入路径更改为 app.js 所在的位置。 然后我更新了 app.json 以更改编写框架节点的路径。 不知道为什么我必须更改这两个地方,我几乎觉得它将框架.js写入 app.js,然后稍后覆盖它......所以这可能效率低下,但这似乎确实有效。
<x-compile refid="${compiler.ref.id}">
<![CDATA[
union
-r
-class=${app.name}.view.main.Main
and
save
viewport
and
intersect
-set=viewport,allframework
and
include
-set=frameworkdeps
and
save
frameworkdeps
and
include
-tag=Ext.cmd.derive
and
// added this
include
-set=page
and
concat
-remove-text-references=${build.remove.references}
-optimize-string-references=${build.optimize.string.references}
-remove-requirement-nodes=${build.remove.requirement.nodes}
${build.compression}
// changed this
-out=${build.classes.file}
${build.concat.options}
and
restore
viewport
and
exclude
-set=frameworkdeps
and
exclude
-set=page
and
exclude
-tag=Ext.cmd.derive,derive
and
concat
-remove-text-references=${build.remove.references}
-optimize-string-references=${build.optimize.string.references}
-remove-requirement-nodes=${build.remove.requirement.nodes}
${build.compression}
-out=${build.out.base.path}/${build.id}/viewport.js
${build.concat.options}
]]>
</x-compile>
然后在 app.json 的输出节点中:
"framework": {
// Added this path
"path": "${build.id}/app.js",
"enable": true
}