2013-03-12 15 views
7

Gereksinimimle optimizasyonumda biraz sorun yaşıyorum. Optimize ediciyi çalıştırdıktan sonra, derlenmiş/derlenmiş dosyamda birkaç hata mesajı alıyorum. En iyi duruma getirme adımı olmadan web uygulamamı çalıştırırken herhangi bir hatam yok.requirejs & r.js en iyileştirici kullanırken jQuery eklentileri yüklenemedi

Bu benim client.js dosyası (yapılandırma içerir) (CoffeeScript)

requirejs.config 
    baseUrl: '/source/' 
    paths: 
    text:     'lib/text' 
    io:     'lib/socket.io' 
    underscore:   'lib/underscore' 
    backbone:    'lib/backbone' 
    jquery:    'lib/jquery' 
# almond:    'lib/almond' 
    bootstrap:   'lib/bootstrap' 
    bootstrapFileUpload: 'lib/bootstrap-fileupload' 
    jqueryUniform:  'lib/jquery.uniform' 
    jqueryBrowser:  'lib/jquery.browser' 
    datatables:   'lib/jquery.dataTables' 
    datatables_bootstrap: 'lib/DT_bootstrap' 
    shim: 
    io: 
     exports: 'io' 
    jquery: 
     exports: 'jQuery' 
    jqueryBrowser: 
     deps: ['jquery'] 
    jqueryUniform: 
     deps: ['jqueryBrowser', 'jquery'] 
    underscore: 
     exports: '_' 
    backbone: 
     deps: ['underscore', 'jquery'] 
     exports: 'Backbone' 
    datatables_bootstrap: 
     deps: ['jquery', 'datatables'] 
    datatables: 
     deps: ['jquery'] 


require ['routers/router', 'backbone'], (Router, Backbone) -> 
    MainRouter = new Router() 
    Backbone.history.start() 

Ve burada optimize edici için benim yapılandırma olmasıdır. Optimizer'ı bir modül olarak 'requirejs' gerektirdikten sonra nodejs'den çalıştırıyorum.

config = 
    baseUrl: __dirname + '/../client/source' 
    name: 'lib/almond' 
    include: './client' 
    optimize: 'none' 
    out:  __dirname + '/../client/' + hash + '.js' 
    paths: 
     text:     'lib/text' 
     io:     'lib/socket.io' 
     underscore:   'lib/underscore' 
     backbone:    'lib/backbone' 
     jquery:    'lib/jquery' 
     bootstrap:   'lib/bootstrap' 
     bootstrapFileUpload: 'lib/bootstrap-fileupload' 
     jqueryUniform:  'lib/jquery.uniform' 
     jqueryBrowser:  'lib/jquery.browser' 
     datatables:   'lib/jquery.dataTables' 
     datatables_bootstrap: 'lib/DT_bootstrap' 
    shim: 
     bootstrap: 
     exports: 'bootstrap' 
     bootstrapFileUpload: 
     exports: 'bootstrapUpload' 
     io: 
     exports: 'io' 
     jquery: 
     exports: 'jQuery' 
     jqueryBrowser: 
     deps: ['jquery'] 
     jqueryUniform: 
     deps: ['jqueryBrowser', 'jquery'] 
     underscore: 
     exports: '_' 
     backbone: 
     deps: ['underscore', 'jquery'] 
     exports: 'Backbone' 
     datatables: 
     deps: ['jquery'] 
     datatables_bootstrap: 
     deps: ['jquery', 'datatables'] 



    requirejs.optimize config, (buildResponse) -> 
    js = true 
    if js && css 
     require './server' 
    , (err) -> 
    console.log 'requirejs err' 
    console.log err 

ben krom görüyorum hata: "Yakalanmayan TypeError: tanımsız malı 'varsayılan' okunamıyor":

/* Set the defaults for DataTables initialisation */ 
$.extend(true, $.fn.dataTable.defaults, { 

Herhangi bu pasajı ilişkilidir

fikir yanlış ne olabilir? Teşekkürler!

cevap

14

Aynı sorunla karşılaştım. Sanırım bu hatanın sebebi, bir yan etkiye bağlı olarak DT_bootstrap.js'un bir AMD modülü olmamasıdır. Bu durumda jquery.dataTables.js.

RequireJS optimize edici, başvuruda bulunduğunuz tüm modülleri bir büyük JS dosyasında birleştirdiğinde, ham DT_bootstrap.js, jquery.dataTables.js'dan sonra bir yerdedir. Sorun, birleştirilmiş js dosyanız yüklendiğinde DT_bootstrap.js'un hemen değerlendirilebilmesidir. Bu $.fn.dataTable o çizgiyi karşılaştığında tanımlanmalıdır istiyor: jquery.dataTables.js yana

$.extend(true, $.fn.dataTable.defaults, { 

o derlenmiştir bir AMD modülüdür ancak henüz değerlendirdi. Sadece daha sonra bir bağımlılık olarak gerekli olduğu kodda, bu değerlendirilecek ve sadece o zaman $.fn.dataTable tanımlayacaktır. https://github.com/amdjs/backbone/blob/master/backbone.js#L8-L24

Örneğin:

(function(root, factory) { 
    // Set up DT_bootstrap appropriately for the environment. 
    if (typeof define === 'function' && define.amd) { 
    // AMD 
    define(['jquery', 'datatables', 'bootstrap'], function($) { 
     factory($); 
    }); 
    } else { 
    // Browser globals 
    factory(root.jQuery); 
    } 
}(this, function($) { 
    // <--- original DT_bootstrap.js goes here 
})); 

Benim için sorun çözüldü burada yapılır gibi

Ben bir AMD modülü tanımında 'DT_bootstrap.js' sarma bu sorunu çalıştı.

+1

Merhaba, bunun için de mücadele ediyorum. Ama konsolu, $ .fn diyor.DataTable bir fonksiyon değildir – w3jimmy

+0

Bu satırda tanımlayın (['jquery', 'dataTable', 'bootstrap'] değişkenlerinizin değişken adınızla birlikte 'dataTable' yerine databs –

0

Peter neredeyse doğrudur. Kaçırdığı tek şey, tanımların Casey'nin yapılandırmasıyla eşleşmesi gerektiğiydi. Yani, yerine yukarıdaki yanıtında:

define(['jquery', 'dataTable', 'bootstrap'], function($) ... 

olması gerekir:

define(['jquery', 'datatables', 'bootstrap'], function($) ... 

Aksi js dosya dataTable.js ve değil almak için ihtiyacı olan arayacaktır gerektirir.

+0

cevabını bu değişiklikle güncelledim. @Mario. –

0

2.1.11 the wrapShim option gerektirdiğinden, bu sorunu ele alarak orijinal kaynak dosyasını saklayabilirsiniz.

+0

Bunu denemeden 5 dakika harcadım ve require.js için çalışmaz wrapShim sadece r.js no için görünüyor "? –

+0

Bağımlılık yönetimi, optimizasyon öncesi ve sonrasıyla aynıdır - wrapShim seçeneği her iki durumda da çalışır :-) Bu seçenek üzerinde bazı sınırlamalar var gibi görünüyor, ama ben kullandım, sorun olmadan çalıştı. –

+0

Ben needjs github bir sorun yayınladı.Bir nasıl bittiğini görelim.WrapShim seçeneği sadece kullanılmış olduğunu düşündüm tarafından r.js'ye göre wrapShim https://github.com/jrburke/requirejs/issues/1149 ile ilgili hiçbir şey görmüyorsunuz. –

İlgili konular