2016-07-11 5 views
1

私のプロジェクトでは、require.jsとpdf.jsライブラリを一緒に使っていました。最近まで、Pdf.jsはグローバルオブジェクトに自分自身を置いてきました。私はまだシムを使用して私のrequirejs設定でそれを使用することができます。 pdfjsライブラリは、pdf.workerという別のライブラリをロードします。このモジュールを見つけるための解決策は、workerSrcというグローバルPDFJSオブジェクトにプロパティを追加し、ディスク上のファイルをポイントすることでした。これは、pdfjsライブラリーをロードする前または後に行うことができます。 pdfjsライブラリはpdf.workerを使用してWebWorkerを開始し、そうするためにはソースファイルへのパスが必要です。pdf.jsを1.5にしてrequire.jsを一緒に使ってみましょう

プロジェクトのpdfjsライブラリを新しいバージョン(1.5.314)に更新しようとしたところ、ライブラリをロードしてインクルードする方法がUMDモジュールを使用するように変更されましたが、今はすべて手間がかかります。

pdfjsライブラリは、環境でrequirejsが使用されているかどうかをチェックし、 "pdfjs-dist/build/pdf"という名前のモジュールとして定義します。このモジュールがロードされると、 "pdfjs-dist/build/pdf.worker"という名前のモジュールがチェックされます。私は新しいパスで私のrequirejsのconfigオブジェクトにそれらを追加した別のフォルダ構造を持っているので:

paths: { 
    "pdfjs-dist/build/pdf": "vendor/pdfjs/build/pdf", 
    "pdfjs-dist/build/pdf.worker": "vendor/pdfjs/build/pdf.worker" 
} 

これは、すべてのモジュールを見つけるためのモジュールローダを作ることです。開発中、これは素晴らしい作品です。しかし、私のgruntビルド・ステップでrequirejsオプティマイザを使用しようとすると、すべてのプロジェクト・ファイルが1つのファイルにまとめられます。このステップは、同様pdf.workerモジュールを含むしようとすると、これはエラーを生成します。ワーカーソースは、ディスク上の単一のファイルにする必要があります

Error: Cannot uglify2 file: vendor/pdfjs/build/pdf.worker.js. Skipping it. Error is: RangeError: Maximum call stack size exceeded

以来、私はこのモジュールが含まれるようにしたくありません。 したがって、requirejs設定で2つの異なる設定を試しました。

paths: { 
    "pdfjs-dist/build/pdf.worker": "empty:" 
} 

テストの2番目のものは私のモジュールからそれを除外することである:

modules: [{ 
    name: "core/app", 
    exclude: [ 
     "pdfjs-dist/build/pdf.worker" 
    ] 
}] 

両方の技術がないオプティマイザを教えてください は最初の試みは、オプションを構築し、私のうなり声でパスのプロパティをオーバーライドすることでしたモジュールを含めるには両方の試行が以前と同じエラーで終了しました。 requirejsオプティマイザはまだモジュールをビルドに含めようとしますが、それをうまくしようとするとRangeErrorで終わります。

uglifyのステップが失敗したため、それは含まれず、私は私のビジネスについて話すことができますが、醜いステップがpdfjsの新しいアップデートで動作するようになったらどうなりますか?

ビルドステップでrequirejs設定を除外するだけでなく、そのようにする方法を知ってもらえますか?

+0

https://github.com/mozilla/pdf.js/tree/master/examples/webpackまたはhttps://github.com/mozilla/pdf.js/tree/master/examples/browserifyを参照してください。それはより明確で助かります - すべてのバンドル業者がpdf.jsでうまくいくわけではありませんuglifyエラーは別のものです(https://github.com/mozilla/pdf.js/issues/7044を参照)、クロムで動作させるには回避策が必要です。 – async5

+0

私が経験したuglifyエラーは、実行時に参照したバグの場合のようではありません。私の問題はr.jsのビルドステップで発生します。私が持っている問題は、オプティマイザは、私がそれを知らないときにワーカーファイルを取り出そうとしているということです。 – Tryggve

+0

右のwebpackとbrowserifyは、package.jsonを使用してそれを無視しています。 「問題(s)」(https://github.com/mishoo/UglifyJS2/search?q=Maximum+call+stack+size+exceeded&type=Issues&utf8=%E2%9C%93)には、「最大値」に関するuglifyがありましたコールスタックサイズを超えました " - 私はいくつかの構成の回避策が提案されました。 – async5

答えて

0

私は自分の問題の核心を知りましたが、今は問題を解決してビルドプロセスを働かせる方法があります。私のビルドステップでは、grunt-contrib-requirejsを使用しています。このジョブの設定でいくつかのオプションを無効にする必要がありました。

  1. pdf.workerモジュールを連結して縮小した生産コードに含めることを希望しませんでした。

  2. r.jsを後で連結ファイルから除外するだけで、r.jsがそれを小さくすることは望ましくありませんでした。

私はそれが第二の問題も解決されなければならないことを意味すると考えて最初の問題を解決しようとしました。 2つが別々であることがわかったとき、私は最終的に解決策を見つけました。

githubのr.js exampleには、fileExclusionRegExpという名前のプロパティがあります。これは、私が現在r.jsにファイルをビルドフォルダにコピーしないように伝えるために使用するものです。

fileExclusionRegExp: /pdf.worker.js/ 

第2に、このモジュールを連結ファイルに含めないようにオプティマイザに指示する必要があります。これは、このモジュールのpathsプロパティを"empty:"の値にオーバーライドすることによって行われます。

paths: { 
    "pdfjs-dist/build/pdf.worker": "empty:" 
} 

私のgruntビルドのステップはエラーなく動作し、すべてがうまくいきます。 uglifyとpdf.workerのバグについて私に知らせるためにasync5に感謝します。この回避策は、作業者を醜悪にしてビルドフォルダーに別々にコピーする別の粗悪なタスクに適用されます。生産のために構築されたとき

compress: { 
    sequences: false 
} 

が今私のプロジェクトは素晴らしい作品

grunt-contrib-uglifyタスクはpdf.workerファイルを壊さないために、このプロパティが必要になりますするためのオプションは、オブジェクト。

関連する問題