Javascript Filesaver和requireJS:不匹配的匿名定义

Javascript Filesaver和requireJS:不匹配的匿名定义,javascript,requirejs,Javascript,Requirejs,我在客户端为用户保存JSON文件 使用RequireJS加载Filesaver JS时出错: Uncaught Error: Mismatched anonymous define() module: function () { return saveAs; } 我的requirejs优化器配置文件: require.config({ paths: { ... blobjs : "../../libs/blobjs

我在客户端为用户保存JSON文件

使用RequireJS加载Filesaver JS时出错:

Uncaught Error: Mismatched anonymous define() module: function () {
    return saveAs;
}
我的requirejs优化器配置文件:

require.config({
    paths: {
        ...
        blobjs                 : "../../libs/blobjs/Blob",
        ....
        filesaver              : "../../libs/filesaver/FileSaver",
    },
    shim : {
        ...
        blobjs: {
             exports: "Blob"
        },
        filesaver: {
             exports: "Filesaver"
        },
        ...
   },

   optimize: 'uglify2',
   uglify2: {
      output: { beautify: true },
      beautify: { semicolons: false }
   },
   baseUrl                 : '../assets/js/',
   mainConfigFile          : '../assets/js/config.js',
   name                    : 'formbuilder',
   out                     : 'formbuilder.min.js',
   output : { beautify: true },
   preserveLicenseComments : false,

   include : ['here i include some views template']
});
在我的代码中:

var blob = new Blob([jsonContent], {
     type: "application/json;charset=utf-8"
});

saveAs(blob, collectionAndFilename['filename'] + '.json');

谢谢你的帮助

我也有同样的问题。经过调查,我意识到我是在脚本标记中加载FileSaver文件的,因为在FileSaver中调用了define()函数,这是一个问题

这是本手册中的内容:

确保通过RequireJS API加载所有调用define()的脚本。 不要在HTML中手动编写脚本标记以加载具有 在它们中定义()调用

我用requireJS API加载了该文件,一切正常…

这对我来说很有用:

requirejs(["lib/FileSaver"], function(){
    console.log("in FileSAver");

    var text = createString();
    var fileName = getFileName();

    var blob = new Blob([text], {type: "text/plain;charset=utf-8"});
    window.saveAs(blob, fileName);

});

由于
FileSaver.js
使用的是命名的AMD模块,因此您必须将其作为
require.config
文件中的包使用,就像
moment
库一样

require.config({
    packages: [{
      name: 'moment',
      location: './js/resources/',
      main: 'moment'
    }, {
      name: 'FileSaver.js',
      location: './js/resources/',// path where you have placed FileSaver.js file
      main: 'FileSaver.js'
    }]
  });
然后只需要包
FileSaver.js

  requirejs(["FileSaver.js"], function(FileSaver) {
    //FileSaver is now available as function
    console.log(FileSaver);
  });

这并不能解释OP得到的错误。不存在解决方案取决于设置
包的“不匹配的匿名定义”错误。接受的答案解释了OP的错误。是的,但如果它对任何人都有帮助的话,仅通过requireJS API加载文件并不是一个真正的解决方案,因为我已经尝试过了。注意
filesaver:{exports:“filesaver”}的用法不正确,
不起作用。如果您发布了用于使require callback函数与filesaver一起加载的代码,那么这个答案会更有帮助。这个答案告诉了我为什么会出现这个问题,但是IMO requirejs文档在需要更多配方时就不好了。