与第3版煎茶Cmd的新的主要成分之一是编译器。简单地说,编译器是一个JavaScript到JavaScript框架感知优化。它的目的是“理解”的高层次的Ext JS和煎茶触摸代码,并产生最小的,最高效的代码,以支持这些高层次的抽象。
使用编译器之前,你应该了解的基本知识煎茶Cmd的阅读下面的指南:
集和当前设置
编译器在后台,管理一组的源文件,对这些文件进行分析,以确定它们的依赖关系。该组中的所有文件的类路径
:
sencha compile -classpath=sdk/src,app ...
..
在这个例子中,编译器递归加载“JS”
从指定的文件夹列表。这组中的所有文件的所有操作定义的基础上,遵循(也就是说,它定义了“宇宙”)。
使用的编译器默认的classpath来自这些配置属性:
${framework.classpath},${workspace.classpath},${app.classpath}
编译器的输出的命令(例如,的Concat的
和元数据
)的操作称为“当前设置”上的文件组。目前组开始了宇宙中的所有文件,但使用提供的命令来执行一组操作,这可以被操纵。
注意:使用的编译器,你经常会看到相当长的命令行,使用命令链机制和
。此外,在实际使用中的情况下,很长的命令行,你应该考虑使用的Ant或“响应文件”。见 先进的煎茶CMD。在本指南中,所有的命令行是完整的(可能很长),以保持尽可能明确的例子。
产生输出CONCAT
编译器最终是所有关于编写有用的输出一定数量的投入。的的 CONCAT
命令来连接的当前设置的源文件在适当的依赖顺序。
一个必需的参数是的
,这表明输出文件的名称。还有其他的选项,但是,效果生成的文件。您可以选择压缩的下列选项之一:
-压缩
-压缩生成的文件使用默认的压缩机。目前,这是一样裔
。最大
-使用所有的压缩机压缩生成的文件,并保持最小。-关闭
-压缩使用谷歌暂停办理股份过户编译器生成的文件。丑化
-使用UglifyJS压缩生成的文件。YUI
-使用YUI压缩机压缩的源文件 。带
-地带的输出文件的意见,但保留空白。这是用来转换“转所有调试W-comments.js”转变为“EXT-ALL-debug.js”的选项。
下面的命令演示了如何制作三种口味的单次读取源的输出。
sencha compile -classpath=sdk/src \
exclude -namespaceExt.chart and \
concat ext-all-nocharts-debug-w-comments.js and \
-debug=true \
concat -strip ext-all-nocharts-debug.js and \
-debug=false \
concat -yui ext-all-nocharts.js
生成元数据
在许多有用的方法,编译器也可以生成元数据,例如,所有源文件,相关性顺序的一组文件等的名称要了解什么是可用的,看到的生成元数据的指南。
保存和恢复设置
当你需要产生多个输出文件,它可以保存当前的设置以备后用,你这样做是非常有帮助的:
sencha compile -classpath=sdk/src \
exclude -namespaceExt.chart and \
save nocharts and \
...
restore nocharts and \
...
...
保存
命令将当前设置的快照,并将其存储在给定的名称(
nocharts在上面)。
最简单的使用已保存的一组是还原
命令。这的保存
的时间时,执行相反的操作,并恢复它的状态的电流设置为。
SET操作
许多编译器提供的命令归为一组,这是业务工作和生产套。在编译器的情况下,此装置设置的文件或类。让我们先来看看在设定的术语。
稍微设置理论
有三个经典的集合操作:
-
路口 - 两个集合的交集是一组只包含了两套。
-
联盟 - 两个集合是一组含无论是在套。
-
差异 - 两组的差异是在第一盘,在第二盘的所有东西的集合。
设置包括
和排除
这两个集操作可能是最常见的和灵活的设置操作。两者都支持这些基本的交换机:
命名空间
-匹配所有文件中指定的命名空间中定义类型。一流的
-匹配一个特定的类型。文件
-匹配文件名 和/或使用Ant风格的的glob模式(一个“*”匹配文件名 字符,其中“*”匹配文件夹)的文件夹名称。标签
-匹配任何文件指定的标签(S)(见下文)。设置
-文件,这些文件在任何指定的命名集。
在所有这些情况下,下面的命令行参数是一个由逗号分隔的列表的匹配条件。此外,单个排除
或包含
可以有许多开关/值对。
所以,让我们从一个简单的例子,建立“转全没有图表调试-W-comments.js”
。
sencha compile -classpath=sdk/src \
exclude -namespaceExt.chart and \
...
...
这里正在发生的事情是,我们开始使用的Ext JS源(SDK / src目录“
),他们所有的“当前设置”。然后,我们进行了不同的Ext.chart
命名空间中的所有文件不包括。目前套,相当于“的ext-all.js”,
但没有任何的图表包。
的否定与不
包括
和排除
包括
和不包括
支持一组丰富的匹配条件。这是圆形的开关,否定它后面的匹配条件。这意味着包含的文件或排除所有那些不与条件匹配的。
例如:
sencha compile -classpath=sdk/src,js \
... \
exclude -not-namespaceExtand \
...
上述排除
命令会从当前组中排除任何的外部
命名空间中的类。
的所有
集
在某些情况下,这是非常方便的恢复电流设置为所有文件或为空集。要做到这一点,只需使用包括
或排除
的所有
开关。要建立在前面的例子:
sencha compile -classpath=sdk/src \
... \
include -all and \
... \
exclude -all and \
...
后,包括所有
当前的设置是所有文件。后排除一切
是空集。
工会
已经所示,包括
命令是一个形式,并集:它执行的联合当前的一组与组匹配的文件。有时它是可取的,不包括工会和电流设定在这些文件匹配所需的标准。这是工会
命令。
工会
命令所有的选项,包括
。考虑这个联盟的
命令:
sencha compile -classpath=sdk/src ...and \
union-namespaceExt.grid,Ext.chart and \
...
这是这对排除
和包括
命令完全等同于:
sencha compile -classpath=sdk/src ...and \
exclude -all and \
include -namespaceExt.grid,Ext.chart and \
...
及物性/递归联盟
最重要的业务之一是工会的所有文件明确规定,所有他们所需要的文件。这是核心的构建过程,因为这是你如何只选择您需要的文件集。所以,如果你有顶级文件的一小部分,开始的过程中,说的类MyApp.App
,你可以做这样的事情:
sencha compile -classpath=sdk/src,app \
union-r -classMyApp.Appand \
...
工会
命令启动无电流设定,只包含类MyApp.App
,然后进行包括所有的东西,它需要递归。所产生的电流是应用程序所需的所有文件。
相交(严格)
相交
命令是有点不太灵活,它支持的标准:只接受命名集(使用组
)。
sencha compile -classpath=sdk/src,common,page1/src,page2/src \
... \
intersect -set page1,page2 and \
... \
上面这个命令相交的两页设置和产生它们的交点作为当前的一组。
相交(模糊)
在处理二套以上,相交,
有一个选项,称为分钟,
在当前组的成员设置阈值。此选项Ext JS的应用多页更详细地讨论。
例如,
sencha compile ... \
intersect -min=2-set page1,page2,page3 and \
...
使用的相交
产生的当前设置的所有文件,发现在两个指定的三套。
编译器指令
在许多情况下,它是有帮助的,只有编译器将挑选的文件中嵌入元数据。要做到这一点,编译器可以识别的指令行注释。
指令的列表是:
-
//@charset
//@tag
//@define
//@require
字符编码
有没有标准的方法来指定一个特定的JS文件的字符编码。煎茶CMD编译器,因此,了解下面的指令:
//@charset ISO-9959-1
这必须是对JS文件的第一行。右边的字符集
的值可以是任何有效的Java字符集 名称。默认值是“UTF-8”。
用来描述编译器的输入文件的编码字符集的
指令。这并不影响的输出文件的编码。输入文件的内容转换为Unicode内部。
标记
在一个理想的世界中,一个命名空间是足够的兴趣来定义一组。然而,有时候,一组可以很随意,甚至跨越命名空间的界限。这个问题,而不是移动到命令行级别,编译器可以跟踪文件中的任意标签。
考虑这个例子:
//@tag foo,bar
分配标签富
和酒吧
的文件。这些标签可以被用于包括
, 排除
和工会
命令其标签
选项。
“其他”的JavaScript文件处理
在某些情况下,JavaScript文件中定义的类或对象,并要求Ext.define
和需要
或Ext.require的
条款,不表示的类或对象。使用 Ext.define,
你仍然可以说,一类需要
这样的事情和动态加载程序不会抱怨,只要这些东西存在(如果它们不存在,加载程序将试图加载它们,这很可能会失败)。
为了支持任意JavaScript的方法来定义和要求的类型,编译器还提供了以下指令:
//@define Foo.bar.Thing//@requires Bar.foo.Stuff
这些指令集编译器,跟踪文件中定义的类型和什么类型的文件需要相同的基本元数据。在大多数方面,那么,这些指令完成同样的事情,一个Ext.define
一个需要的
属性。
您可以使用这些指令在一个文件中,而无需使用其他。
条件编译
编译器支持条件编译指令,如所示:
foo:function(){//<debug>if(sometest){Ext.log.warn("Something is wrong...");}//</debug>this.bar();}
这可能是最有用的条件指令,你会使用的代码,你要在开发环境中运行,而不是在生产。
重要说明:当您使用条件编译,请记住,除非你总是运行编译后的代码,指令只是意见和有条件的代码将是“活”在开发过程中。
调试指令
编译时,默认情况下,没有预处理语句进行检查。因此,在这种情况下,其结果是开发模式。如果我们切换调试
我们得到了一个非常相似的结果,但与预处理的活性。事实上,唯一的区别是,除去的预处理器指令。
例如,下面的命令:
sencha compile -classpath=... \
-debug \
...
生成的代码是这样的:
foo:function(){if(sometest){Ext.log.warn("Something is wrong...");}this.bar();}
然而,这个命令:
sencha compile -classpath=... \
-debug=false \
...
生成的代码是这样的:
foo:function(){this.bar();}
你可以看到,测试和log语句都删除。
“如果指令
最普遍的指令是“ 如果“
。如果
指令测试一个或多个配置选项对指令的属性和删除的代码块中,如果有任何错误的。
例如:
//<if debug>//</if>
这是相当于到<debug>
指令。
评论