<p>pdf.js не работает с requirejs</p>

Созданный на 3 мая 2016  ·  18Комментарии  ·  Источник: mozilla/pdf.js

Следующий HTML демонстрирует проблему:

<html> <head> <title>Flexpaper React/Require Sandbox</title> <script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.2.0/require.js"></script> <script> require(['pdf'], function(pdf) { console.log('PDFJS Module: ' + pdf); console.log('PDFJS Global: ' + window.PDFJS); }); </script> </head> </html>

pdf.js, обнаруживает существование функций «require» и «define» и, соответственно, НЕ устанавливает глобальный экземпляр PDFJS. Однако он также не возвращает ссылку на этот экземпляр через загрузчик модуля.

Поскольку и pdf, и window.PDFJS в приведенном выше примере не определены, библиотеку нельзя использовать в приложениях, которые используют require. Это так независимо от того, используется ли require для загрузки pdf.js.

Обратите внимание, что это работает правильно с версией 1.0.1040, но не работает с 1.4.20 и 1.5.188. Я не тестировал другие версии, кроме этих 3. Поведение было одинаковым во всех трех версиях между Chrome и Safari.

Самый полезный комментарий

Поскольку я тоже немного боролся с правильными ссылками в RequireJS, я оставлю свое решение, которое является частью конфигурации RequireJS:

paths: {
    'pdfjs-dist/build/pdf': 'myfolder/pdf.min',
    'pdfjs-dist/build/pdf.worker': 'myfolder/pdf.worker.min'
}

Когда вы делаете это таким образом, вам даже не нужно назначать путь к рабочему процессу PDFJS.workerSrc , как предлагается в примерах , потому что рабочий будет найден автоматически.

Все 18 Комментарий

что такое "pdf"? можете ли вы привести полный пример?

Конечно, я настрою репозиторий Github, чтобы продемонстрировать более полно.

Вот репо: https://github.com/MartinSnyder/pdfjs-with-requirejs

'pdf' - это ссылка на модуль, который требует, чтобы попытался вернуться к этой функции. В этом сценарии Requirejs динамически загружает pdf.js и пытается вернуть «ссылку на модуль» функции обратного вызова, однако ссылка на модуль не установлена. Вы можете увидеть, как динамическая нагрузка происходит через сетевой отладчик браузера.

Обычно это не было бы такой большой проблемой, за исключением того, что что-то внутри pdf.js обнаруживает наличие загрузчика модуля и НЕ устанавливает глобальный объект PDFJS. Поскольку ни того, ни другого нет, вы не можете использовать библиотеку, когда на странице есть requirejs.

Обратите внимание, что это происходит, даже если вы не используете команду require для загрузки объекта. Я поместил закомментированную ссылку на сценарий pdf.js на странице. Если это будет помещено перед требованием, то глобальное значение будет установлено правильно. Если это размещено после require, глобальное значение НЕ будет установлено.

С кодом есть две проблемы:

  1. модуль не упоминается по его имени, используйте pdfjs-dist / build / pdf (и если вы перемещаете pdfjs-dist в другое место, используйте require.config, чтобы изменить местоположение)
  2. вы используете document.write, который стирает документ

Попробуйте что-нибудь вроде:

        require.config({paths: {'pdfjs-dist': './node_modules/pdfjs-dist'}});
        require(['pdfjs-dist/build/pdf'], function(pdf) {
            console.log('PDFJS Module: ' + pdf + '<br>');
            console.log('PDFJS Global: ' + window.PDFJS);
        });

Закрытие, как ответили.

Обратите внимание, что это правильно работает с версией 1.0.1040.

Работа с этой версией является побочным эффектом, когда requirejs загружает скрипт как обычный тег скрипта - это не означает, что он совместим с require.js.

установить глобальный экземпляр PDFJS

Глобальный PDFJS будет удален в будущих версиях, поэтому, если вы используете requirejs, вы можете использовать тот же объект через pdf.PDFJS /

В отношении пункта 1:
Я не использовал node для включения pdf.js в этот пример. Я загрузил официальный дистрибутив и скопировал pdf.js в корневой каталог образца. По этой причине правильно называть его «pdf». Вы можете убедиться в этом, посмотрев на пример в сетевом отладчике, и вы увидите, что файл правильно загружен с помощью require.

В отношении пункта 2:
Это было сделано для упрощения примера. Независимо от того, что делает пример, ссылки не определены, и библиотеку использовать нельзя. В частности, переход на console.log также показывает ссылки как неопределенные.

Что касается удаления Global PDFJS в будущих версиях:
Меня это устраивает, но как ссылаться на библиотеку через pdf.PDFJS, если pdf не определен?

Я не использовал node для включения pdf.js в этот пример

Я не предполагал, что вы используете node.js.

скачал официальный дистрибутив и скопировал pdf.js в корневой каталог образца.

PDF.js - это библиотека, состоящая из множества файлов, например, модуль pdfjs-dist / build / pdf может загружать модуль pdfjs-dist / build / pdf.worker.

По этой причине правильно называть его «pdf».

Вам все равно нужно использовать имя AMD, указанное в определении, см. Https://github.com/MartinSnyder/pdfjs-with-requirejs/blob/master/pdf.js#L21

Вы пробовали приведенный выше пример с require.config, указывающим на полную библиотеку?

Вы пробовали приведенный выше пример с require.config, указывающим на полную библиотеку?

Я только что закончил это сейчас, и он работает, как вы сказали.

Означает ли это, что вы не можете использовать для этой цели «скачанный» дистрибутив?
https://mozilla.github.io/pdf.js/getting_started/#download

Пока вы используете пакет node 'pdfjs-dist', все в порядке, но загруженная версия не должна работать с этим?

Пока вы используете пакет node 'pdfjs-dist', все в порядке, но загруженная версия не должна работать с этим?

Я думаю, это не имеет отношения к теме, но вы все равно можете использовать файлы pdf.js / pdf.worker.js из этого пакета, укажите requirejs 'pdfjs-dist' в заархивированное место (он будет работать с pdf.js и pdf. Файлы worker.js находятся в папке сборки).

Вам все равно нужно использовать имя AMD, указанное в определении, см. Https://github.com/MartinSnyder/pdfjs-with-requirejs/blob/master/pdf.js#L21

Это был ключевой момент, которого я не понимал. Спасибо, что нашли время мне это объяснить.

Привет, у меня похожая проблема, поэтому я не собираюсь открывать новую, но спрашиваю здесь, надеюсь, что все в порядке.
Я пытаюсь реализовать средство просмотра на основе https://github.com/mozilla/pdf.js/blob/master/examples/components/simpleviewer.js, используя require.js. Но когда мне нужны файлы pdf.js и pdf_viewer.js, PDFJS.PDFViewer не определен.

Вот образец репо: https://github.com/Lazzi/pdfjs-bower-requirejs

@Lazzi, ваш модуль main.js выглядит очень странно для AMD, попробуйте:

define('main', ['pdfjs-dist/build/pdf', 'pdfjs-dist/web/pdf_viewer'], function(pdfjsLib, viewer, require) {

совместимость не AMD, поэтому я не знаю, как она будет работать.

Да, это не AMD, но require.js также поддерживает такое определение модуля: http://requirejs.org/docs/api.html#cjsmodule.

Однако предложенное вами изменение не устранило мою проблему.

@Lazzi Ясно, давайте попробуем # 7332 (AFAIK имя AMD имеет значение)

@yurydelendik Работает! Вы мне очень помогли. Спасибо.

это может сработать и для вас, помещенное в ваш require.config

    map: {
        '*': {
            'pdfjs-dist/build/pdf.worker' : 'path/to/your/install/pdf.worker'
        }
    },

Функция map - это, по сути, глобальная замена строки, а '*' указывает, для каких зависимостей следует использовать замену строки - в основном используется для включения разных версий библиотек для других библиотек. Это похоже на параллельную работу двух версий JQuery. Будьте осторожны при использовании - поскольку он выполняет только замену строк, вы можете в конечном итоге заменить пути в других зависимостях, если они совпадают.

'*' В этом случае, вероятно, будет только основной зависимостью pdf.js.

Поскольку я тоже немного боролся с правильными ссылками в RequireJS, я оставлю свое решение, которое является частью конфигурации RequireJS:

paths: {
    'pdfjs-dist/build/pdf': 'myfolder/pdf.min',
    'pdfjs-dist/build/pdf.worker': 'myfolder/pdf.worker.min'
}

Когда вы делаете это таким образом, вам даже не нужно назначать путь к рабочему процессу PDFJS.workerSrc , как предлагается в примерах , потому что рабочий будет найден автоматически.

Спасибо @dmaxweiler! Я боролся с той же проблемой - у меня возникли проблемы с правильной загрузкой pdf.js при использовании RequireJS. Ваше решение сработало для меня! Потрясающие. Спасибо за вашу помощь.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

azetutu picture azetutu  ·  4Комментарии

anggikolo11 picture anggikolo11  ·  3Комментарии

dmisdm picture dmisdm  ·  3Комментарии

AlexP3 picture AlexP3  ·  3Комментарии

hp011235 picture hp011235  ·  4Комментарии