jquery.fileupload插件导致require.js随机失败导入

时间:2013-12-19 05:11:56

标签: javascript requirejs jquery-file-upload

我正在使用require.js并且有一个使用了jquery.fileupload的页面。在介绍插件后,我现在看到在执行define回调之前无法导入某些文件。这会导致库无法找到其依赖项的随机错误。就好像require.js在所有依赖关系都可以解决之前继续前进。

我已按照这些说明操作:

https://github.com/blueimp/jQuery-File-Upload/wiki/How-to-use-jQuery-File-Upload-with-RequireJS

但除此之外,这是一个非常香草的安装。我尽可能使用缩小版本的库。欢迎任何见解。

这是main.js:

(function () {                                                                          
  'use strict';                                                                         

  require.config({                                                                      
    baseUrl: '/js',                                                                     
    waitSeconds: 800,                                                                   
    paths: {                                                                            
      jquery: ['//ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min',               
        'lib/jquery/jquery-2.0.3.min'],                                                 
      'jquery.fileupload': 'lib/jquery.fileupload/jquery.fileupload',                   
      'jquery.fileupload-ui': 'lib/jquery.fileupload/jquery.fileupload-ui',             
      'jquery.fileupload-image': 'lib/jquery.fileupload/jquery.fileupload-image',       
      'jquery.fileupload-validate': 'lib/jquery.fileupload/jquery.fileupload-validate', 
      'jquery.fileupload-video': 'lib/jquery.fileupload/jquery.fileupload-video',       
      'jquery.fileupload-audio': 'lib/jquery.fileupload/jquery.fileupload-audio',       
      'jquery.fileupload-process': 'lib/jquery.fileupload/jquery.fileupload-process',   
      'jquery.ui.widget': 'lib/jquery.ui/jquery.ui.widget',                             
      'jquery.iframe-transport': 'lib/jquery.iframe-transport/jquery.iframe-transport', 
      'load-image': 'lib/load-image/load-image.min',                                    
      'load-image-meta': 'lib/load-image/load-image-meta',                              
      'load-image-exif': 'lib/load-image/load-image-exif',                              
      'load-image-ios': 'lib/load-image/load-image-ios',                                
      'canvas-to-blob': 'lib/canvas-to-blob/canvas-to-blob.min',                        
      tmpl: 'lib/tmpl/tmpl.min',                                                        
      bootstrap: 'lib/bootstrap/bootstrap',                                             
      bootstrapTab: 'lib/bootstrap/bootstrap-tab',                                      
      EventEmitter: 'lib/event_emitter/EventEmitter',                                   
      linkedin: ['//platform.linkedin.com/in.js?async=true',                            
        'http://platform.linkedin.com/in.js?async=true'],                               
      skinny: 'lib/skinny/skinny',                                                      
      selectize: 'lib/selectize/selectize.min',                                         
      sifter: 'lib/sifter/sifter',                                                      
      microplugin: 'lib/microplugin/microplugin.min'                                    
    },                                                                                  

    shim: {                                                                             
      bootstrap: {                                                                      
        deps: ['jquery'],                                                               
      },                                                                                
      bootstrapTab: {                                                                   
        deps: ['jquery', 'bootstrap'],                                                  
      },                                                                                
      linkedin: {                                                                       
        exports: 'IN'                                                                   
      },                                                                                
      selectize: {                                                                      
        deps: ['jquery', 'sifter', 'microplugin']                                       
      },                                                                                
      'jquery.iframe-transport': {                                                      
        deps: ['jquery']                                                                
      }                                                                                 
    }                                                                                   
  });                                                                                   
  require(['app'], function (App) {                                                     
    App.initialize();                                                                   
  });                                                                                   
}());

来自代码:

define([], function () {
  'use strict';

  return function () {
    require(['jquery', 'tmpl', 'load-image', 'canvas-to-blob',
  'jquery.iframe-transport', 'jquery.fileupload-ui'], function ($) {

      $('#product').fileupload({
        url: '/products/create'
      });
    });
  };
});

在加载页面后调用模块。

还值得注意的是,所有文件都已成功下载。没有404等等。

3 个答案:

答案 0 :(得分:1)

事实证明,load-image.js的缩小版本存在一个缺陷,它会破坏依赖关系的加载方式。我没有确切的证据证明为什么,它可能是较小的尺寸导致竞争条件,或者它可能是特定文件中的奇怪东西。我所知道的是缩小版本导致随机错误而正常版本没有(这是主要的,所以我想我冒了风险)。

我提出了flag here

编辑:事实证明,插件的缩小版本包括解释奇怪依赖行为的所有扩展。

答案 1 :(得分:1)

matt的答案是这种情况下的最佳解决方案。万分感谢,它节省了我们很多时间。 在requirejs.config中,您必须分开添加load-image依赖项 - 逐个文件。 例如:

require.config({
        'jquery.ui.widget' : 'lib/jQuery-File-Upload-9.9.2/js/vendor/jquery.ui.widget',            
        'jquery.fileupload':'lib/jQuery-File-Upload-9.9.2/js/jquery.fileupload',
        'jquery.fileupload-ui': 'lib/jQuery-File-Upload-9.9.2/js/jquery.fileupload-ui',
        'jquery.fileupload-image': 'lib/jQuery-File-Upload-9.9.2/js/jquery.fileupload-image',
        'jquery.fileupload-validate':'lib/jQuery-File-Upload-9.9.2/js/jquery.fileupload-validate',
        'jquery.fileupload-audio':'lib/jQuery-File-Upload-9.9.2/js/jquery.fileupload-audio',
        'jquery.fileupload-video':'lib/jQuery-File-Upload-9.9.2/js/jquery.fileupload-video',
        'jquery.fileupload-process': 'lib/jQuery-File-Upload-9.9.2/js/jquery.fileupload-process',
        'jquery.fileupload-jquery-ui': 'lib/jQuery-File-Upload-9.9.2/js/jquery.fileupload-jquery-ui',
        'jquery.iframe-transport': 'lib/jQuery-File-Upload-9.9.2/js/jquery.iframe-transport',
        'load-image':'lib/load-image-1.10.0',
        'load-image-meta':'lib/load-image-meta-1.10.0',
        'load-image-ios':'lib/load-image-ios-1.10.0',
        'load-image-exif':'lib/load-image-exif-1.10.0',
        'canvas-to-blob':'lib/canvas-to-blob-2.0.5',
        'tmpl':'lib/tmpl.2.4.1'
    }
});

在html网站中调用:

requirejs(['jquery',
            'jquery.ui.widget',
            'tmpl',
            'load-image',
            'jquery.iframe-transport',
            'jquery.fileupload-ui'], function () {
                $('#fileupload').fileupload({
                    url: 'photo-upload.html'
            });
        }
);

答案 2 :(得分:0)

一种可能性修改垫片:

   shim: {                                                                             
      bootstrap: {                                                                      
        deps: ['jquery'],                                                               
      },                                                                                
      bootstrapTab: {                                                                   
        deps: ['jquery', 'bootstrap'],                                                  
      },                                                                                
      linkedin: {                                                                       
        exports: 'IN'                                                                   
      },                                                                                
      selectize: {                                                                      
        deps: ['jquery', 'sifter', 'microplugin']                                       
      },                                                                                
      'jquery.iframe-transport': {                                                      
        deps: ['jquery']                                                                
      },
      'jquery.fileupload-ui':{
        deps: ['jquery']   
      } 

另一个选项将jquery降级为1.X(这是因为示例页面使用的是jquery 1.X)