私は既存のライブラリをインポートしようとしているこの状況があり、troublesome
(Webpack/Babel FWIWを使用)と呼び、モジュール構文を使用して解決しようとしているjQuery
へのグローバル参照があります。
私はjqueryをモジュールの「ローカル」スコープに正常にインポートしました:
import jQuery from 'jquery'
だから私は試しました:
import jQuery from 'jquery'
import 'troublesome'
おそらく驚くことではありませんが、jQuery is not a function
のようなものがtroublesome.js
からキックバックされます
私もこれを試しました:
System.import('jquery')
.then(jQuery => {
window.jQuery = jQuery
})
import 'troublesome'
しかし、System.import
は、いわゆる「モジュールローダー」仕様の一部であり、es6/2015仕様から引き出されたため、Babelによって提供されていないことがわかりました。 poly-fill がありますが、WebpackはSystem.import
への呼び出しを介して達成される動的なインポートを管理できません。
しかし... index.htmlのスクリプトファイルを次のように呼び出すと:
<script src="https://code.jquery.com/jquery-2.1.4.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/troublesome/troublesome.js"></script>
<script src="the-rest-of-my-js.js"></script>
jQuery
への参照はtroublesome.js
で解決されており、状況は良好ですが、webpackがそれらを管理しないため、スクリプトタグルートを回避したいと思います。
誰でもこのようなシナリオに対処するための適切な戦略を推奨できますか?
update
@ TN1ckからのガイダンスにより、最終的に imports-loader を使用して1つのWebpack中心のソリューションを特定することができました。
このソリューションの構成は次のようになります。
//...
module: {
loaders: [
//...
{
test: require.resolve('troublesome'),
loader: "imports?jQuery=jquery,$=jquery"
}
]
}
シミングモジュールを使用する方法です。 http://webpack.github.io/docs/shimming-modules.html
私はページから引用します:
このプラグインは、モジュールをすべてのモジュールで変数として使用できるようにします。このモジュールは、変数を使用する場合にのみ必要です。
例:require("jquery")
を記述せずに、すべてのモジュールで$およびjQueryを使用可能にします。
new webpack.ProvidePlugin({
$: "jquery",
jQuery: "jquery",
"window.jQuery": "jquery"
})
これをwebpack-configで使用するには、このオブジェクトをconfigのpluginsという配列に追加するだけです:
// the plugins we want to use
var plugins = [
new webpack.ProvidePlugin({
$: "jquery",
jQuery: "jquery",
"window.jQuery": "jquery"
})
];
// this is your webpack-config
module.exports = {
entry: ...,
output: ...,
module: ...,
plugins: plugins
}
Es6/2015では、次のことを行いました。
import {jsdom} from 'jsdom';
import jQuery from 'jquery';
var window = jsdom(undefined, {}).defaultView;
var $ = jQuery(window);
//window.jQuery = $; //probably not needed but it's there if something wrong
//window.$ = $;//probably not needed but it's there if something wrong
その後、通常どおり使用できます
var text = $('<div />').text('hello world!!!').text();
console.log(text);
お役に立てれば。
jQuery
をモジュールにインポートしても、'troublesome'
で使用できるようにはなりません。代わりに、jQuery
およびその他の必要な「グローバル」を提供する'troublesome'
のシンラッパーモジュールを作成できます。
troublesome-module.js:
// Bring jQuery into scope for troublesome.
import jQuery from 'jquery';
// Import any other 'troublesome'-assumed globals.
// Paste or have build tool interpolate existing troublesome.js code here.
その後、あなたのコードで次のことができるはずです
import 'troublesome-module';
Jspmとdygraphsを使用して同様の問題が発生しました。私が解決した方法は、System.import
を使用してみたように動的ロードを使用することでしたが、重要な部分は、設定後にSystem.import
を使用して連続する各「パート」をもう一度プロミスonfulfillmentハンドラー内でチェーンロードすることでしたグローバル名前空間変数。私のシナリオでは、実際にthen
ハンドラー間でいくつかのインポートステップを分離する必要がありました。
Jspmで動作しなかった理由、そしておそらくあなたにも動作しなかった理由は、import ... from ...
構文がコードの前、そして間違いなく非同期のSystem.import
の前に評価されるからです。
あなたの場合、それは次のような単純なものです:
import jQuery from 'jquery';
window.jQuery = jQuery;
System.import('troublesome').then(troublesome => {
// Do something with it...
});
また、System
モジュールローダーの推奨事項は最終的なES6仕様から除外されており、 新しいローダー仕様 が作成されていることにも注意してください。
npm install import-loader
。import 'troublesome'
with import 'imports?jQuery=jquery,$=jquery!troublesome
。私の意見では、これはあなたの質問に対する最も簡単な解決策です。質問@ TN1ckで書いた答えに似ていますが、webpackの設定を変更しません。詳細については、以下を参照してください: https://github.com/webpack/imports-loader
シミングは問題なく、これを解決するさまざまな方法がありますが、私の答え here によると、最も簡単なのは、グローバルな依存関係を必要とするライブラリのロードにrequireを使用することです。ウィンドウを確認してください。割り当てはrequireステートメントの前であり、両方とも他のインポートの後です。順序は意図したとおりに維持する必要があります。この問題は、Babelがすべての他のコードの前に実行されるようにインポートを持ち上げることが原因です。