WebpackでjQueryを実際のWindowオブジェクトに公開する


111

jQueryオブジェクトを、ブラウザーの開発者コンソール内からアクセスできるグローバルウィンドウオブジェクトに公開したい。今、私のwebpack設定には次の行があります:

plugins: [
                new webpack.ProvidePlugin({
                    $: 'jquery',
                    jQuery: 'jquery'
                })
            ]

これらの行は、私のwebpackモジュールの各ファイルにjQuery定義を追加します。しかし、プロジェクトをビルドして、次のように開発者コンソールでjQueryにアクセスしようとすると、

window.$;
window.jQuery;

これらのプロパティは未定義であると言っています...

これを修正する方法はありますか?


1
私も設定this: 'window'できますか?多くのライブラリはthis変数をWindowオブジェクトであると想定しているため
Abhinav Singi

回答:


129

エクスポーズローダーを使用する必要があります。

npm install expose-loader --save-dev

必要なときにこれを行うことができます。

require("expose?$!jquery");

またはあなたの設定でこれを行うことができます:

loaders: [
    { test: require.resolve('jquery'), loader: 'expose?jQuery!expose?$' }
]

更新:webpack 2以降では、exposeの代わりにexposed -loaderを使用する必要があります:

module: {
    rules: [{
        test: require.resolve('jquery'),
        use: [{
            loader: 'expose-loader',
            options: '$'
        }]
    }]
}

11
ProvidePlugin主にサードパーティ製のライブラリは、グローバル変数の存在に依存している状況で使用する必要があります。
Johannes Ewald 2015年

オンラインでよく見た「怠惰な」目的で提供プラグインを使用しているのではないかと間違った仮定をしましたが、あなたは正しいです:)
Matt Derrick

8
これは私が探していたまさにですし、ちょうどさらに追加するには、ローダーのために、あなたも1行でそれを行うことができます:{test: /jquery\.js$/, loader: 'expose?jQuery!expose?$'}
フェルナンド

8
最初のスクリプトを追加するだけでは$ = require('jquery'); window.jQuery = $; window.$ = $;どうですか。(必要ありませんexpose-loader
ヘルマン

1
エクスポーズローダーGitHubページによると、webpack 2の構文は次のとおりです module: { rules: [{ test: require.resolve('jquery'), use: [{ loader: 'expose-loader', options: 'jQuery' },{ loader: 'expose-loader', options: '$' }] }] }。これは、jQueryを公開できる唯一の方法であり、新しいmodule.rules構文を使用しています。
ギャビンサザーランド

84

ProvidePluginは、それぞれのインポートを通じて別のソースのシンボルを置き換えますが、グローバルネームスペースでシンボルを公開しません。典型的な例はjQueryプラグインです。それらのほとんどは、jQueryグローバルに定義されることを期待しています。を使用するProvidePluginと、jQueryが依存関係(たとえば、以前にロードされたもの)であることを確認しjQuery、それらのコード内のの出現を、と同等のwebpack rawで置き換えrequire('jquery')ます。

シンボルに依存してグローバル名前空間にある外部スクリプトがある場合(たとえば、外部でホストされているJS、JavascriptがSeleniumを呼び出す、または単にブラウザーのコンソールでシンボルにアクセスするとします)、expose-loader代わりに使用します。

つまり、ProvidePluginはグローバルシンボルへのビルド時の依存関係をexpose-loader管理するのに対し、はグローバルシンボルへの実行時の依存関係を管理します。


2
説明ありがとう
Foton

公式ドキュメントのwebpackを使用したProvidePluginの例:webpack.js.org/plugins/provide-plugin/#usage-jquery
James Gentes

33

windowオブジェクトがすべてのモジュールで公開されているように見えます。

なぜインポート/要求JQueryして配置しないのですか?

window.$ = window.JQuery = JQuery;

window.JQuery必要なモジュールまたはそれが使用されているモジュールのいずれかで、を使用するモジュールを要求/インポートする前に、これが発生することを確認する必要があります。


新しい依存関係を追加せずに最も簡単なソリューション。ありがとう!
fatihpense 2016年

これは、変数を使用して、他のネストされたモジュールは、単に「定義されていません」wheile動作しません
aboutqx

4
まあそれは使用requireしていないときに動作しますimport
aboutqx

@aboutqxどういう意味かわかりません。私の答えは、JQueryがすでにインポート/要求され、という名前の変数に割り当てられていることを想定していますJQuery
メッセ

2
@mhessを使用するとimportimportsがファイルの先頭にソートされ、sが配置されたrequire場所にとどまるため、エラーが発生する可能性があります。したがって、実行順序importは、ウィンドウ変数が設定されていない場合にのみ変更されます。
aboutqx 2017年

16

これは常に私のために働いた。webpack 3を含む window.$ = window.jQuery = require("jquery");


2
最高のソリューション!2018
waza123

6

上記のどれも私にとってはうまくいきませんでした。(そして私はエクスポーズローダーの構文が本当に好きではありません)。代わりに、

私はwebpack.config.jsに追加しました:

var webpack = require('webpack');
module.exports = {
   plugins: [
       new webpack.ProvidePlugin({
           $: 'jquery',
       })     
   ]
}

すべてのモジュールがjQueryから$を介してアクセスできます。

webpackにバンドルされているモジュールのいずれかに以下を追加することで、ウィンドウに公開できます。

window.$ = window.jQuery = $

1
これは、舞台裏でwebpack-streamを使用して私に役立ちました
klewis

1

Webpack v2のアップデート

Matt Derrickの説明に従って、露出ローダーをインストールします。

npm install expose-loader --save-dev

次に、次のスニペットをに挿入しますwebpack.config.js

module.exports = {
    entry: {
        // ...
    },
    output: {
        // ...
    },
    module: {
        loaders: [
                { test: require.resolve("jquery"), loader: "expose-loader?$!expose-loader?jQuery" }
        ]
    }
};

expose-loader docsから


これで、これをWebpackのどのバージョンでも機能させることができなくなりました。何が変わったのかwindow.jQuery = require('jquery');
わかり

0

私の場合はうまくいきます

{ test: require.resolve("jquery"), loader: "expose?$!expose?jQuery" } 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.