Как включить jszip с requirejs: jszip не определен

Я использую библиотеку js-xlsx для создания файла Excel в JavaScript.

Эта библиотека использует jszip. Я пытался определить библиотеку jszip в своем файле JavaScript перед загрузкой jszip, но jszip никогда не определялся:

Uncaught TypeError: jszip is not a function

Требуется конфигурация:

<script type="text/javascript">
  requirejs.config({
    paths : {
      jszip : '../tools/jszip'
    }
  });
</script>

Вот как я использую его в своем JS-файле:

define(['jszip', '../tools/xlsx'], function(jszip, xlsx) {
  ...
}

person wawanopoulos    schedule 12.09.2015    source источник


Ответы (3)


JSZip (и ODS для поддержки расширения ods) должны быть загружены и прикреплены к окну до загрузки XLSX. Я получаю работу, используя прокладку с пользовательским «xlsx-загрузчиком»:

main.js

requirejs.config({
    paths: {
        ods: '...path to ods',
        jszip: '...path to jszip',
        xlsxloader: '...path to xlsx-loader',
        xlsx: '...path to xlsx'
    },
    shim: {
        xlsx: {
            exports: 'XLSX',
            deps: ['xlsxloader']
        }
    }
});

xlsx-loader.js

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

    window.JSZip = jszip;
    window.ODS = ods;
});

ваш файл JS

define(['xlsx'], function () {
    // Do what you want with XLSX
    ...

Вариант 2. Вы также можете выполнить эту цепочку, она не требует прокладки, но не работает с оптимизатором.

require(['jszip', 'ods'], function (jszip, ods) {
    window.JSZip = jszip;
    window.ODS = ods;
    require(['xlsx'], function () {
        // Do what you want with XLSX
        ...
    });
});
person Federico Baron    schedule 05.01.2016
comment
Спасибо за это. Должен быть помечен как ответ точно! Вы не только решили проблему, но и сделали это правильно с загрузчиком shim и xlsx. - person Martyn; 14.06.2016

если вы откроете xlsx.js, вы увидите, что используется глобальная переменная с именем JSZip, которая фактически заполняет значение jszip. Итак, если вы измените определение своей функции, как это

define(['jszip', '../tools/xlsx'], function(JSZip , xlsx) { 

должно работать, я думаю

person Ahmad    schedule 01.10.2015
comment
Код, который вы здесь показываете, функционально не отличается от кода, который у меня есть в моем ответе. Первым аргументом обратного вызова для определения может быть jszip, JSZip, potato, flalalalalala или что угодно. - person Louis; 01.10.2015

Вы должны определить lib var как имя конструктора.

В моем случае у меня была такая же проблема:

define("Statistics", ["jquery", "underscore", "Datatable", "moment", "jszip"], function($, _, Datatable, moment, jszip) {

и я изменил jszip на JSZip следующим образом:

define("Statistics", ["jquery", "underscore", "Datatable", "moment", "jszip"], function($, _, Datatable, moment, JSZip) {
person mEnE    schedule 14.07.2017