私はfabric.jsバージョン2を含むJSPMでjavascriptバンドルを作成しようとしています。残念ながら、jspmバンドルの実行は失敗します。
$ jspm bundle src/main --minify --inject
Building the bundle tree for src/main...
err Error on fetch for @empty/lib/jsdom/living/generated/utils.js at file:///Users/dkoerner/projects/JSPMFabricTestCase/@empty/lib/jsdom/living/generated/utils.js
Loading npm:[email protected]/dist/fabric.js
Loading npm:[email protected]
Loading src/bootstrap.js
Loading src/main.js
Error: ENOENT: no such file or directory, open '/Users/dkoerner/projects/JSPMFabricTestCase/@empty/lib/jsdom/living/generated/utils.js'
jspmとファブリックの例に従ってテストプロジェクト(https://github.com/dkoerner85/JSPMFabricTestCase)を作成し、バンドルの作成が現在のファブリック安定版リリースv1.7.22で機能することを確認しました。ただし、バージョンをリリース候補v2.0.0-rc4に上げると、バンドルが壊れます。
私はjavascriptアプリの開発にかなり慣れていないため、これが失敗する理由とその修復方法を理解していません。ポインタや説明に感謝します。
npm:v5.5.1ノード:v8.9.3
プロジェクトにオーバーライドセクションを追加しますpackage.json
。
"overrides": {
"npm:[email protected]": {
"map": {
"canvas": "@empty",
"fs": "@empty",
"jsdom/lib/jsdom/living/generated/utils": "@empty",
"jsdom/lib/jsdom/utils": "@empty",
"jsdom": "@empty",
"http": "@empty",
"https": "@empty",
"xmldom": "@empty",
"url": "@empty"
}
}
}
jspmとsystemJSについて読んだ後、私はこの問題の解決策を見つけました。重要なコードは、ファブリックパッケージのfabric.jsファイルとpackage.jsonファイルにあります。
dist /fabric.js
...
fabric.document = require('jsdom').jsdom(decodeURIComponent('%3C!DOCTYPE%20html%3E%3Chtml%3E%3Chead%3E%3C%2Fhead%3E%3Cbody%3E%3C%2Fbody%3E%3C%2Fhtml%3E'),{ features: {FetchExternalResources: ['img']}});
fabric.jsdomImplForWrapper = require('jsdom/lib/jsdom/living/generated/utils').implForWrapper;
fabric.nodeCanvas = require('jsdom/lib/jsdom/utils').Canvas;
fabric.window = fabric.document.defaultView;
DOMParser = require('xmldom').DOMParser;
...
package.json
...
"browser" : {
"canvas": false,
"fs": false,
"jsdom": false,
"jsdom/lib/jsdom/living/generated/utils": false,
"jsdom/lib/jsdom/utils": false,
"http": false,
"https": false,
"xmldom": false,
"url": false
},
...
これで、でパッケージをインストールするとjspm install npm:[email protected]
、jspmはrequireステートメントを変更し、次のコードになります。
jspm_packages/npm/[email protected]/dist/fabric.js
...
fabric.document = require('@empty').jsdom(decodeURIComponent('%3C!DOCTYPE%20html%3E%3Chtml%3E%3Chead%3E%3C%2Fhead%3E%3Cbody%3E%3C%2Fbody%3E%3C%2Fhtml%3E'), {features: {FetchExternalResources: ['img']}});
fabric.jsdomImplForWrapper = require('@empty/lib/jsdom/living/generated/utils').implForWrapper;
fabric.nodeCanvas = require('@empty/lib/jsdom/utils').Canvas;
fabric.window = fabric.document.defaultView;
DOMParser = require('@empty').DOMParser;
...
バンドルを作成しようとすると、jspmは'@empty/lib/jsdom/living/generated/utils'
requireステートメントに遭遇します。
Error: ENOENT: no such file or directory, open '/Users/dkoerner/projects/JSPMFabricTestCase/@empty/lib/jsdom/living/generated/utils.js'
jspmは、jsdom
最初にエントリをの必要に応じて処理package.json
したため、より詳細なエントリを認識できませんでした'jsdom/lib/jsdom/living/generated/utils'
。マップを正しい順序で提供する必要があります-短いパスの前に長いパス。
これは、上記のソリューションに示されているように、ローカルオーバーライドを使用して実現できます。元の。とは対照的に、オーバーライドでjsdom
以下@empty/lib/jsdom/living/generated/utils
に順序付けられていることに注意してくださいpackage.json
。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加