JavaScript框架 Dojo 1.7 發布,包含若干重大更新

openkk 12年前發布 | 37K 次閱讀 Dojo

Dojo 1.7作為變化重大的一個版本,已經Release近兩個月,而現在已經放出了1.7.2的小版本更新,包括了一些小的fix。讓人難以理解的是即使 Dojo 1.7已經Release這么久,但是其release notes至今仍然是draft狀態。。這也導致了遲遲不能對它進行翻譯。看來Dojo社區的那幫老大完全是技術狂,對于文檔和社區其他用戶的關注還遠遠不夠啊,需要改進。。

盡管Release notes仍然是草稿狀態,但也算相對完整,包括了對重要更新的介紹,以及一小部分的升級指南。于是我們對其進行了翻譯,希望能幫助大家盡快了解 Dojo1.7的新特性,重點關注依然是:AMD。我們同時會保持對英文版release notes的同步更新,大家也可以關注我們的新浪微博:http://weibo.com/dojotoolkit 來獲得最新進展。

下面內容翻譯自:http://livedocs.dojotoolkit.org/releasenotes/1.7


瀏覽器支持

經過有效的測試,Dojo1.7支持所有下面列出的瀏覽器。即使某個瀏覽器不在列表中,也有可能是支持的,尤其是那些快速release的瀏覽器(比如 Chrome,Firefox)。另外再隨后的一些小的release中,Dojo可能會包含一些針對最新瀏覽器的修復,但是并不一定能保證。

桌面系統
  • Firefox 3.6-8
  • Safari 5.0-5.1
  • Chrome 13-15
  • IE 6-9
  • Opera 10.50-11.50
  • Mobile (dojox/mobile)

iOS 4.x, 5.0 (Mobile Safari) (including all Dijit widgets except Editor, Dialog)
  • Android 2.2, 2.3, 3.1
  • Blackberry 6
  • Mobile compatibility on desktop browsers: IE 8-9, Firefox 3.6-7, Safari 5.0-5.1, Chrome 13-15



</div> </div>
基本功能
Dojo Base

AMD

Dojo現在完全支持AMD模塊的異步加載,并且同步或者異步加載是可以通過“async”屬性進行配置的。
[javascript] view plain copy
</div>
  1. <script data-dojo-config="async: true" src="dojo.js"></script>  
</div> 注意以前被強制加載的模塊,現在在異步模式下會被隱含加載。需要確保在require()的參數列表里列出所有模塊中需要使用的其他依賴模塊(包括再parseOnLoad設為true時需要引入dojo/parser)。比如: </div>
 
<script src="/dojo/dojo.js"
data-dojo-config="parseOnLoad: true, async: true"></script>

<script>
require([
"dojo/dom", // needed for dojo.byId
"dijit/registry", // needed for dijit.byId
"dojo/parser", // needed for parseOnLoad to run
...
], function(dom, registry, parser){
// callback when above modules finish loading
function update(){
var viewNode = dom.byId("view1");
var view1 = registry.byId("view1");
view1.domNode.innerHTML = "...";
}
});

</script> </pre> </div> 注意,許多Dojo核心和dijit中的模塊都在1.7中拆分成更小的模塊,以便再異步加載的情況下能支持輕量級的應用。另外,作為這項改動的一部分,Dojo核心中的模塊還沒有被完美拆分,這項工作將在1.8中繼續進行。 </div>


Limitations
一些局限性

某些已有的Dojo 1.7之前的模塊被設計成只支持同步加載模式。這些模塊通過使用同步模式可以繼續使用,但如果將async設置為true,即異步模式,則無法工作。 Dojo社區正在研究一些可能的控件替換,使得這些功能能夠完好的支持異步模式。這是Dojo 2.0之前的工作。

DTL (dojox.dtl - Django Templating): 

dojox.dtl就是一個例子,它的設計以同步加載為前提。但這個模塊已經被重構以支持異步的AMD加載,但是所有的tag和filter的類庫需要被顯示的引入。這個限制對于在用戶定義的類庫和dojox.dtl的默認類庫都是一樣的。

下面的表格列出了內置的tag和它們對應的模塊:
Tag Library Tags
dojox/dtl/tag/date now
dojox/dtl/tag/logic if, for, ifequal, ifnotequal
dojox/dtl/tag/loader extends, block, include, load, ssi
dojox/dtl/tag/misc comment, debug, filter, firstof, spaceless, templatetag, widthratio, with
dojox/dtl/tag/loop cycle, ifchanged, regroup

舉個例子,如果一個模版使用"{% for" 標簽, 那么 'require("dojox/dtl/tag/logic")' 就必須通過應用來加載,從而使得“for”標簽能夠運行。

下面的表格列出了內置的filter和它們對應的模塊:

Filter Library Filters
dojox/dtl/filter/dates date, time, timesince, timeuntil
dojox/dtl/filter/htmlstrings linebreaks, linebreaksbr, removetags, striptags
dojox/dtl/filter/integers add, get_digit
dojox/dtl/filter/lists dictsort, dictsortreversed, first, join, length, length_is, random, slice, unordered_list
dojox/dtl/filter/logic default, default_if_none, divisibleby, yesno
dojox/dtl/filter/misc filesizeformat, pluralize, phone2numeric, pprint
dojox/dtl/filter/strings addslashes, capfirst, center, cut, fix_ampersands, floatformat, iriencode, linenumbers, ljust, lower, make_list, rjust, slugify, stringformat, title, truncatewords, truncatewords_html, upper, urlencode, urlize, urlizetrunc, wordcount, wordwrap


has.js
Dojo 1.7 引入了一個稱之為has()的特性檢測API。大多數Dojo核心和dijit模塊已經被轉換為使用這些特性檢查。這項工作將繼續在1.8中進行。

dojo.connect
This has been refactored to use the new dojo/on module for event handling. See dojo/on below for more information.
這個API已經被重構為新的dojo/on模塊以用于事件處理。參見下面對dojo/on的介紹。

Dojo核心
</div>

dojo/on
這個新模塊提供了一套新的事件處理系統,包含如下的新功能:
  • 事件代理: 事件類型可以包含元素選擇符來指定特定的觸發對象,例如:on(list, "li:click", onListItemClickHandler);
  • 擴展事件:能夠創建并使用自定義事件類型作為擴展事件。新的dojox.gesture.*實現了一些擴展事件。
  • 可暫停事件:事件處理可以通過on.pausable暫停。
  • 單次執行事件:通過on.once使監聽函數僅被調用一次。
  • (手動)發射事件:瀏覽器內置事件可以用on.emit(target, "click", event);來(手動)觸發。
  • 自包含的事件處理對象:on()調用返回的對象包含remove()方法,可直接用于停止對該事件的監聽。
  • 觸摸事件的標準化:觸摸事件實現了跨平臺(Android,iOS)的標準化。
  • 基于has()的功能檢測:這使得為特定瀏覽器打包(移除該瀏覽器不需要的功能,例如一些針對IE的特殊代碼)成為可能。
這個模塊去除了一些遺留的鍵盤事件處理代碼(最好使用keydown事件),因此減少了代碼量。
這個API計劃在Dojo2.0中代替現存的dojo.connect函數。針對非DOM事件所傳的參數與事件名稱在Dojo2.0中會有改變,因此目前 Dojo1.x的應用如果使用dojo.connect鏈接了非DOM事件,就不應遷移到dojo/on,以免在將來受到影響。

dojo/query
這個新模塊提供了查詢DOM結點的功能(類似于dojo.query)。該模塊還能加載其他的選擇符引擎,例如Sizzle、Slick、Dojo新的輕量級查詢選擇符引擎、甚至是瀏覽器內置的選擇符查詢引擎(但其CSS兼容性最差)。在異步模式下(參見新的Dojo config設置),當dojo/main沒有加載時,dojo/query將載入一個采用瀏覽器自帶的qeurySelectAll方法的輕量級引擎,并且只在需要的時候加載完整的acme選擇符引擎。dojo/query采用了新的has()方法做功能檢測,以便在針對特定瀏覽器打包時只加載該瀏覽器所需的最小的選擇符引擎。

dojo/data/ObjectStore
如果底層的object store是"Observable"的,這個模塊現在將廣播該store所產生的所有通知。如果底層的object store在返回結果(results)上有一個observe()方法(通常是用dojo.store.Observable包裝),那么 dojo/data/ObjectStore就會監聽object store中發生的變化,并發送出dojo.data通知事件。

Parser(解析器)
Dojo的頁面解析器在新版本中得到了進一步增強。現在您可以區分瀏覽器自帶的捏制屬性和Dojo對象的屬性,將內置屬性直接寫在html標簽中,而將Dojo對象屬性都寫到data-dojo-props屬性里,例如:
 
 <input data-dojo-type="dijit.form.TextBox" name="dept"   data-dojo-props="scrollOnFocus: true"/>  


</div>
解析器還支持聲明方式創建dojo.on和object.watch的監聽函數。方法是加入type="dojo/on"或type="dojo/watch"的<script>標簽。下面是一個type="dojo/on"的例子:
 
    <button data-dojo-type="dijit.form.Button">  
    Click Me!  
    <script type="dojo/on" data-dojo-event="click" data-dojo-args="e">console.log("I was clicked!");</script>  
    </button>  


一個type="dojo/watch"的例子(基于dojo/on):
 
    <button data-dojo-type="dijit.form.Button">Click Me!       
    <script type="dojo/on" data-dojo-event="click" data-dojo-args="e">  
        dijit.byId("textBox1").set("value", "New Value!");      
    </script>  
    </button>  
    <div data-dojo-type="dijit.form.TextBox" id="textBox1" data-dojo-props="value: 'Old Value'">  
    <script type="dojo/watch" data-dojo-prop="value" data-dojo-args="prop,oldValue,newValue">  
        console.log("Prop '"+prop+"' was '"+oldValue+"' and is now '"+newValue+"'");  
    </script>  
    </div>  

注意: </div>
目前不再支持type="dojo/watch"的<script>標簽的prop屬性,解析器只能識別data-dojo-prop屬性。

提醒:
當使用異步模式時,您需要顯示地加載dojo/parser模塊以確保parseOnLoad: true能夠生效。(在非異步模式下,dojo/parser將會自動加載,但會出現一條“不推薦”警告。從技術角度而言,dojo/parser是不被自動加載的,但在1.7之前,它在許多情況下都會被自動加載,這是因為dijit/_Templated依賴于它,而許多widget都依賴dijit /_Templated。

dojo/touch
這個模塊提供了一組統一的觸摸事件:"press | move | release | cancel"。這些事件能夠兼容大量設備(包括桌面設備)。

其原理非常簡單,"press | move | release | cancel"分別對應于:
  • "touchstart | touchmove | touchend | touchcancel" (觸摸屏設備W3C Touch Events Specification
  • "mousedown | mousemove | mouseup | mouseleave" (桌面設備)
因此有了dojo/touch,我們在切換設備平臺時就不再需要關心如何正確設置各種內置事件了。

dojo/touch基于 dojo/on ,下面的示例在桌面環境和觸摸屏設備(包括Android 2.2/2.3以及針對1.7的iOS3+)上都能正常工作:

更詳細的資料請參考 dojo/touch doc
</div>

Dijit
</div>
針對桌面瀏覽器的開發的Web應用經常在手機瀏覽器上運行失敗。為避免這種情況,Dojo從1.7開始,除了Editor控件以外的dijit控件增加了對主流手機平臺(蘋果、安卓以及黑莓)的基本支持。
另外,在手機平臺上運行Dialog控件時,必須把draggable參數設為false,以確保Dialog的關閉圖標工作正常。將在未來的版本中修復這個bug。

_WidgetBase
_WidgetBase類添加了getParent()方法,可以使用該方法得到當前控件的父容器控件,不論父控件是否有isContainer標記。同時isContainer標記已被廢棄。

_TemplatedMixin, _WidgetsInTemplateMixin
新增了兩個粒度更小的模板聚合類:_TemplatedMixin和_WidgetsInTemplatedMixin。在控件模板內部不包含其他控件時,使用_TemplatedMixin作為控件的模板類;如果空間模板內部包含控件時,除使用_TemplatedMixin外,還要添加 _WidgetsInTemplateMixin作為控件的模板類。原先的模板類_Templated功能以及接口保持不變。

_setXXXAttr

_setXXXAttr方法作為函數在之前的版本可以設置對象屬性,或者觸發設置屬性時要被執行的邏輯。在新版本中_setXXXAttr還能被作為單純的對象使用,以下舉例說明:1._setTabIndexAttr: "focusNode"
該語句會把對象tabIndex屬性直接添加到控件的focusNode上:this.focusNode.tabIndex;

2._setTitleAttr: { node: "titleNode", type: "innerHTML" }
該語句會使用title屬性對控件的titleNode.innerHTML進行賦值,如myWidget.set(“title”, “hello world”)會給myWidget的titleNode.innerHTML賦為hello world。
這樣就替換了原本的attributeMap的功能,attributeMap參數已被廢棄并將在2.0版本中刪除。

dijit/focus, dijit/place, and dijit/popup
focus、place以及popup三個模塊從dijit/_base移到了dijit目錄下,所以這三個模塊都不會在加載dijit時默認加載。也就是說,控件可根據需要選擇性的加載這三個模塊,避免增加不必要的代碼。
There are a few API changes in the top level modules compared to the ones in dijit/_base (although for backwards compatibility the modules in dijit/_base maintain their old API):
作為可獨立加載的模塊,focus、place以及popup中的方法也做了相應的修改:
?     popup.around()替換了dijit.popup.placeAroundElement(),同時參數也從{BL:”TL”,…}變為更人性化的[“before”,”after”,…];
?     dijit/focus不再包含選擇(selection)相關的代碼,只包含focus相關代碼;
?     dijit/focus提供了watch()和on()方法以檢測控件的獲得焦點事件;
?     dijit/_base/popup中一些原先可接受節點或控件作為參數的方法,在新版本中只接受控件參數。
另外,dijit/popup模塊只能通過新的AMD API加載,如:
require(["dijit/popup"], function(popup){ popup.open(...); });

CalendarLite
dijit.CalendarLite是針對手機平臺開發的新日歷控件。其基本功能與Calendar相同,不過不支持鍵盤操作,也不包含月份下拉列表。
ComboBox, FilteringSelect
ComboBox和FilteringSelect為應用dojo.store(新的數據讀寫接口)做了相應的修改,同時依然支持舊的dojo.data 接口。

DojoX


圖表 (Charting)
Action2d 包已經包括了新的縮放(Zoom)和搖擺(Pan)功能,以及數據指示和交互功能。它們使得用戶能用鼠標或者觸摸手勢來與圖表進行交互。
在移動設備方面采用各種方法類提高性能。大多數圖表類型都支持新的允許緩存參數,能夠允許緩存和重用gfx圖形。
使用AMD模塊格式
通過兩個BidiSupport類來支持圖表的雙向文字.(一個類用于dojox.charting, 一個類用于dojox.charting.widget) 在程序中為了支持雙向文字必須請求這些類。

儀表 (Gauges)
儀表從原來位于dojox.widget移動到了新的命名空間dojox.guages
加入了幾種新的指示器來用于創建用戶自己的儀表,例如文字指示器可用于以文字的形式繪出儀表的刻度值。
創建圓形儀表時能夠選擇順時針或者逆時針走向。
改進了圓形刻度的標簽布局
儀表現在能夠支持在移動設備上的觸摸交互
Dojox.gauges使用AMD 模塊格式
可以直接獲得三種的新內建儀表:GlossyHorizontalGuage, GlossyCircularGauge和GlossySemiCircularGauge

地圖 (GeoCharting Map)
Dojox.geo.charting模塊實現了多種改進:包括tooltip管理,當更改數據列時模擬顏色變化
提供新的數據源結構,以及地圖元素和數據源元素之間的數據綁定
通過安裝專門的交互類,允許交互式的通過鼠標或者觸摸手勢來對地圖進行縮放和搖擺
通過新的地圖 Dijit控件將非dijit dojox.geo.charting 地圖控件封裝,從而實現更輕松的整合
使用AMD模塊格式

Gfx
現在每個形狀都由一個關聯的唯一的id(Shape.getUID())來標識. 此外,新的dojox.gfx.shape.byId() 函數將返回與此形狀關聯的id。
添加了輸入事件來支持畫布提供者。這個功能缺省是打開的,可以通過設置dojoConfig中的“canvasEvents”標志來關閉之。
鼠標事件指向的Gfx形狀可以通過事件本身的“gfxTarget”屬性來獲取:
group.connect("onmousedown", function(evt){ var s = evt.gfxTarget; ... });

Gesture
基于dojo/touch和dojo/on,這個新的模塊提供了一種機制,讓我們可以實現能良好運行在不同的設備上的手勢行為,包括桌面和各種各樣的可觸摸設備。
dojox/gesture/Base
一個用于實現各種手勢行為的抽象基類,它主要用于:
?     綁定 on() 監聽器用于處理手勢事件,如tap, taphold, doubletap
?     監聽底層事件并執行不同階段動作 - 'press'|'move'|'release'|'cancel'
?     基于on() 接口觸發手勢事件
實現一個手勢動作只需要擴展和覆寫適當階段的處理函數即可 - press() | move() | release() | cancel() 用于識別和觸發手勢
dojox/gesture/tap(只適用于單觸摸)
?     提供公共的tap手勢方式,包括tap, tap.hold and tap.doubletap
?     用戶可配置 e.g. Tap.hold的閾值, tap.doubletap有效半徑
dojox/gesture/swipe(只適用于單觸摸)
?     提供公共的swipe手勢方式,包括swipe, swipe.end
touch & gesture demo 展示了基于dojo/touch 和dojox/gesture.的dijit/form/HorizontalSlider 控件和dojo/dnd 是如何運行在 iOS4+ 的操作系統上的。  除了一個tap手勢, 這個示例也展示了基于多觸摸實現一個新的旋轉的手勢是非常容易的。
更多詳細信息請參考 dojox/gesture doc .
Grid
DataGrid/EnhancedGrid/TreeGrid/LazyTreeGrid
?     1.7 修復的大量的缺陷和問題, 更多詳細信息請參考 defect list 
下一代Grid
?     進行中的項目:dgrid 和 gridx 正密切合作,目標下一代Grid
Mobile
Dojo Mobile 是目前市場上一流的移動web開發庫, 支持AMD加載方式和新的Build模式,現在有一個專門為Dojo移動開發庫制定的新的指導手冊和詳細的API文檔Dojo Mobile Reference Guide
?     加入了新的BlackBerry OS6 皮膚,迄今為止,已支持以上列表中所有的移動設備和操作系統。
?     dojox.mobile.deviceTheme是一個皮膚加載器,他會識別訪問的設備并加載相應合適的皮膚。
?     新的SpinWheel控件讓你可以通過該控件設置和選擇相應的值,支持兩種方式:SpinWheelDatePicker 和SpinWheelTimePicker,
?     新的卡盤(Carousel)控件,他會顯示一個圖像列表,用戶可以從中選擇相應的元素。
?     新的RoundRectDataList 和EdgeToEdgeDataList 控件,他們基于RoundRectList 和EdgeToEdgeList控件,支持數據驅動。
?     新的PageIndicator控件,他會顯示當前的頁號,并配合以小圓點。該控件可以和 SwapView 或者Carousel合用。
?     加入了一些新的動畫效果: Dissolve, Flip2, Cover, Reveal, Slide Vertical, Cover Vertical, Reveal Vertical, Swirl, Zoom In/Out, and Scale In/Out.
?     將FlippableView 控件更名為SwapView.
?     dojox.mobile 現在均基于 AMD 模式
?     TextBox 控件從原來的 mobile/app/ 包下面移動到 mobile/包下面。
?     新的Tooltip 控件會彈出一個容器,該容器可包含簡單文本或另一個新的控件。
?     新的Overlay控件從下方滑入,完成后則向下方滑出。
?     新的Opener控件加入了實時的屏幕大小偵測器,并配合以使用Tooltip控件(針對大屏的移動設備)和Overlay 控件(針對小屏的移動設備)。
?     新的ComboBox 控件(實驗階段) 支持文字搜索(同dijit.form.ComboBox)
?     新的ExpandingTextarea 控件支持縱向的基于文字內容的伸展和收縮。
?     新的Slider 控件使用戶能夠很方便的通過觸摸/手勢來控制其值。
?     新的HTML 表單控件包裝器 (Textarea, CheckBox, RadioButton) 使得表單可以和各種dijit的控件聯合使用,如:container/dialog 等等控件.
Limitations:
?     很多動畫效果是基于CSS 3 transition / animation的,并且他們的行為依賴于具體的移動設備和移動瀏覽器,所以有些動畫效果在 Android 和BlackBerry等移動設備上并不是很流暢。
?     ScrollableView 在HTC Android設備上經常會被“凍死”, 如:HTC Evo, HTC Desire,等等,尤其是當你在屏幕已經在滑動的同時,進行另外一個滑動操作。這是JavaScript 的一個缺陷,目前還沒有好的解決方案。
?     在Android設備上,當你通過觸摸的方式試圖選中ScrollableView中一個表單中的一個輸入框或者按鈕時,會發現有時無法讓該控件獲取焦點,可能你需要多試幾次才行。
MVC
dojox.mvc 是一個新的實驗性質的dojox 項目,基于MVC的思想,實現Client段的Model,Control和View三層的分離,使得基于Dojo開發諸如企業級應用,IT應用,CRUD 應用,主從模式應用等等的復雜應用變得更為簡單。這個release包括:
?     一流的數據模型,能與data stores直接交互
?     能讓控件或者可視化組件綁定到數據模型的數據綁定功能
?     MVC 還包括分組(用于分級數據) 和重復(用于重復的數據,如:數組)
?     還有諸如 數據綁定輸出和數據驅動的UI生成器的MVC控件
?     可以基于以上MVC模型構造出各種各樣的富數據模式示例
OpenLayers Maps
?     新的dojox.geo.openlayers 工具包基于已開源的OpenLayers庫,詳細可 (參見 http://www.openlayers.org/ ).
?     用戶可在以OpenLayers地圖為背景的區域內添加添加 地圖相關Gfx 形狀或者控件.
?     基于AMD 的形式.


Migration

升級指南


加載器,構建器相關
<script>

在以前的版本中,可以通過<script>標簽來加載模塊(module)和layer, 例如
<script src="/mysite/app/MyWidget.js">盡管這種用法在1.7的構建后的build中依然有效,但將不推薦使用,并且在未構建的源代碼版本中將無法使用,強制使用會導致程序出錯同時控制臺中會出現"multipleDefine" 錯誤。在這種情況下應使用dojo.require(), 例如
dojo.require("app.MyWidget");或者直接用最新的AMD的require() API全局變量
在以前的版本中,可以在一個模塊中通過如下方式定義全局方法:

dojo.provide("my.module");
function myOnClick(){ ... }

然后在1.7中,所有模塊都在一個封閉的方法中被解釋(evaluated),上述的方法將只存在于對應的閉包(closure)中而非全局空間中。如果需要在模塊中定義全局空間中的方法或變量,應使用dojo.global:
dojo.provide("my.module");dojo.global.myOnClick = function(){ ... }
關于定制壓縮Build的注意事項
selectorEngine

值得注意的是acme 查詢引擎(acme query engine) 默認將不再包含在壓縮后的dojo.js中,因此在dojo/query 或 Dojo base 加載時會導致額外的網絡請求以獲取。如果希望將acme query engine包含到壓縮后的dojo.js中,可以在build profile中定義selectorEngine: "acme" 或直接在build命令行中添加selectorEngine=acme 參數,也可以參考Dojo 1.7.1中自帶的standard.profile.js

關于更多selector engines的信息,請參考dojo/query documentation.
dijit/_base

 以前的版本中,在壓縮時dijit/_base 會自動導入其所依賴的dijit/_Widget模塊. 在1.7版本中dijit/_Widget模塊只會在非AMD(向后兼容)模式中被導入。因此Dojo構建器不再認為dijit/_base依賴于 dijit/_Widget。

 為了避免可能額外的網絡請求,建議在上述情況下將dijit/_Widget作為顯示的依賴添加到build profile中。

跨域模式中使用本地模塊
Dojo 1.7 有一個局限性,在非AMD向后兼容的模式下,跨域訪問即dojo.js是從第三方域加載的輕快下,Dojo 無法加載使用非AMD即dojo.require形式的模塊。目前唯一的辦法是將本地模塊改寫成新的AMD語法,或者在這種情況下避免使用跨域訪問,請參見 defect #14459.
debugAtAllCosts
在1.7版本中,djConfig 中的debugAtAllCosts 參數將無法使用,可以使用如下相應的方式替換:

將應用轉成新的AMD語法并使用異步加載模式(async:true),  所有通過標準AMD加載的模塊便可進行調試
通過運行壓縮build, 將所有非AMD模塊轉成新的AMD 語法。
注意:在將應用轉換正最新的AMD語法時可能會需要額外的時間例如來移除舊的API - dojo.getObject 等,盡管這可能會比直接壓縮一個build費時,但將能獲得1.7帶來的全面改進特性。

轉自:http://blog.csdn.net/dojotoolkit/article/details/7333193

 本文由用戶 openkk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!