Pdf.js: Поддержка Systemjs

Созданный на 22 дек. 2015  ·  34Комментарии  ·  Источник: mozilla/pdf.js

Пожалуйста, добавьте поддержку systemjs.

2-feature

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

Я бы запросил дополнительную информацию, поскольку примеры не приводятся. И я думаю, что Browserify в настоящее время работает с pdfjs-dist (за исключением некоторых модулей).

Вот наиболее распространенный пример использования systemjs:

npm install jspm
jspm init # use defaults
jspm install pdfjs-dist

index.html

<!DOCTYPE html>
<html lang="en-us">

<head>
<meta charset="utf-8">
<title>Title</title>
</head>

<body>
    <script src="jspm_packages/system.js"></script>
    <script src="config.js"></script>
    <script>
      System.import('src/app.js');
    </script>
</body>
</html>

src / app.js

# ES6 syntax
import pdfjs from 'pdfjs-dist';

# expected pdfjs to be a window.PDFJS object

Например спасибо

В предыдущих версиях мы могли использовать jspm shim для использования pdfjs.
https://github.com/jspm/registry/wiki/Configuring-Packages-for-jspm
Но после включения node-sure мы не можем (node-sure несовместим с system.js).

Собственно, это запрос на упаковщик jspm, а не на загрузчик Systemjs.
Т.е. было бы хорошо, если бы для этого потребовалась прокладка jspm, но не добавляйте несовместимые изменения, такие как node -secure.

@Vanuan

Наличие в config.js следующего решения проблемы:

    "npm:[email protected]": {
      "process": "github:jspm/[email protected]",
      "node-ensure": "empty",
      "entry?name=[hash]-worker.js": "empty"
    },

(пусто - это файл empty.js без содержимого)

Подобный хак нужен для Browserify

Теперь проблема: pdf.worker.js загружается дважды, проблема была решена с помощью request.ensure () в webpack. Необходимо запретить загрузку файла ./pdf.worker.js до тех пор, пока он действительно не понадобится.

Я подумал: «PDFJS.disableWorker = true;» решает это? Не так ли?

Если вы используете System.import('./pdf.worker') , он выдаст только один HTTP-запрос.

Или даже System.import('pdfjs-dist/build/pdf.worker')

Есть ли конкретная причина, по которой был использован node-ensure ? Я считаю, что системный загрузчик отлично работает в Webpack.

"PDFJS.disableWorker = true;" это не вариант, так как мы хотим переместить обработку PDF в другой поток. Мы же не хотим предлагать пользователям библиотеки плохое решение, не так ли?

Что ж, я бы предпочел паршивое решение, чем полное отсутствие решения. Для моего случая достаточно даже остановки страницы на 1 секунду.
Буду рад, если вы найдете решение получше.

Есть ли конкретная причина, по которой использовался node -secure?

Если вы внимательно посмотрите, что дает examples / webpack /:

pdf.js yury$ ls -la build/webpack/
total 2384
drwxr-xr-x   5 yury  staff     170 Dec 22 15:20 .
drwxr-xr-x  34 yury  staff    1156 Dec 22 10:08 ..
-rw-r--r--   1 yury  staff  546125 Dec 21 16:35 1.bundle.js
-rw-r--r--   1 yury  staff  546463 Dec 21 16:35 9d074593b165291f150e-worker.js
-rw-r--r--   1 yury  staff  122796 Dec 21 16:35 bundle.js

"bundle.js" - это основной загружаемый файл (это означает, что он будет загружать и инициализировать пользовательский интерфейс после 122796 байт - более быстрый запуск страницы). «9d074593b165291f150e-worker.js» - рабочий, который запускает логику и не блокирует пользовательский интерфейс на медленных устройствах. Часть «1.bundle.js» загружается только при запуске disableWorker и для устаревших браузеров, таких как IE9.

Буду рад, если вы найдете решение получше.

Я ожидаю, что у systemjs может быть какая-то защита, чтобы не анализировать все, что требуется (замена "./pdf.worker.js" на "empty" для меня не сработала).

@Vanuan Можете ли вы

Похоже, самая последняя проблема на systemjs https://github.com/systemjs/systemjs/issues/983 ?

Что ж, я бы предпочел паршивое решение, чем полное отсутствие решения. Для моего случая достаточно даже остановки страницы на 1 секунду.

@Vanuan , ничего не изменилось в использовании файла pdf.combined.js (надеюсь) - похоже, нам нужно сохранить его для таких случаев. Вам нужно использовать это, как вы описали как проблему в # 6729. Из вашего описания было неясно, что вы планируете использовать systemjs для загрузки PDFJS.

ничего не изменилось при использовании файла pdf.combined.js

Ах, отлично!

Во всяком случае, что-то определенно изменилось в отношении использования его с worker.
Раньше мы могли использовать полный путь к worker, но внутри него было Uncaught ReferenceError: require is not defined :

PDFJS.workerSrc = 'jspm_packages/npm/[email protected]/build/pdf.worker.js';

Теперь кажется, что он застрял при загрузке файлов. Как будто обратный вызов загруженного модуля никогда не завершается.
Последний запрошенный модуль - process .

Вероятно, Systemjs не может обработать следующую конструкцию:

(function(process) {
  if (typeof PDFJS === 'undefined') {
    (typeof window !== 'undefined' ? window : this).PDFJS = {};
  }
})(require('process'));

Во всяком случае, что-то определенно изменилось в отношении использования его с worker.
Раньше мы могли использовать полный путь к worker,

pdf.combined.js полностью включен / включает pdf.worker.js и не требует указания workerSrc.

Изменения в pdf.combined.js https://github.com/mozilla/pdfjs-dist/commit/a7cd5f77b00bac19c0f6ee4c2cfd5bbf0fe45d8f#diff -eccf5b94e31b0939738de07167e02af6

Ага, я просто оцениваю варианты использования воркеров вместе с jspm.

Теперь проблема: pdf.worker.js загружается дважды, проблема была решена с помощью request.ensure () в webpack

Итак, теперь он загружается в основной поток и не использует importScripts ()?

Мой src / app.js:

import pdfjs from 'pdfjs-dist';

console.log(PDFJS);

Таким образом, он еще даже не использует getDocument, но в сетевом мониторе показывает две записи для pdf.worker.js

Странно. Я вижу только одну запись.

Странно. Я вижу только одну запись.

Это не должно быть AFAIK :)

То же самое в Firefox и Chrome:
screen shot 2015-12-22 at 5 34 42 pm

Ах. Похоже, Systemjs тупо разбирает все require s и пытается их загрузить ...

Условное требование - не очень распространенный вариант использования.

Вот почему он также пытается загрузить node -secure.

@yurydelendik
Каким образом требуется помощь webpack? Webpack по-прежнему загружает воркера с помощью importScripts, верно?

Условное требование - не очень распространенный вариант использования.

Я бы не согласился, https://github.com/systemjs/systemjs/issues/983 и https://github.com/webpack/docs/wiki/code-splitting - распространенные варианты использования.

Webpack по-прежнему загружает воркера с помощью importScripts, верно?

Оно делает. через new Worker(..) . Но у него также есть возможность загрузить pdf.worker.js как модуль, если рабочие отключены.

Проблема будет решена с помощью # 6775 - в systemjs есть автоматическое определение типа модуля. Теперь это commonjs, с UMD это будет AMD, поэтому она не будет пытаться анализировать require ().

PS протрите https://github.com/yurydelendik/pdf.js/tree/pdfjsumd

Ух, отлично, попробую, как только слит и выпустит.

Закрытие исправлено # 6825. Если остались проблемы, откройте новый выпуск.

Я также рекомендую переопределить формат модуля при использовании jspm: jspm install npm:pdfjs-dist -o "{format: 'amd'}"

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

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

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

sujit-baniya picture sujit-baniya  ·  3Комментарии

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

smit-modi picture smit-modi  ·  3Комментарии

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