[解決済み] webpackでグローバル変数を定義する
質問
webpackでグローバル変数を定義して、このような結果を得ることは可能でしょうか?
var myvar = {};
私が見たすべての例は、外部ファイルである
require("imports?$=jquery!./file.js")
どのように解決するのですか?
グローバルにアプローチする方法はいくつかあります。
- 変数をモジュールに入れる。
Webpackはモジュールを一度だけ評価するので、あなたのインスタンスはグローバルなまま、モジュールからモジュールへ変更を引き継ぎます。
そのため、もしあなたが
globals.js
を作成し、すべてのグローバルのオブジェクトをエクスポートすると、次のようになります。
import './globals'
を作成し、これらのグローバルに対して読み書きを行います。あるモジュールにインポートして、関数からオブジェクトに変更を加え、別のモジュールにインポートして、関数でその変更を読み込むことができます。また、物事が起こる順序を覚えておいてください。Webpackはまずすべてのインポートを受け取り、それらを
entry.js
. 次に
entry.js
. ですから、グローバルに対する読み書きをどこで行うかが重要なのです。モジュールのルートスコープからなのか、後から呼び出された関数の中なのか?
config.js
export default {
FOO: 'bar'
}
somefile.js
import CONFIG from './config.js'
console.log(`FOO: ${CONFIG.FOO}`)
備考
: インスタンスを
new
を毎回使用します。
ES6クラス
. 伝統的にJSでは、クラスは(オブジェクトの小文字とは対照的に)次のように大文字で書きます。
import FooBar from './foo-bar' // <-- Usage: myFooBar = new FooBar()
- Webpackの ProvidePlugin
ここでは、WebpackのProvidePlugin(モジュールをすべてのモジュールで、実際に使用するモジュールのみ変数として利用できるようにする)を使用する方法を紹介します。を何度も打ちたくないときに便利です。
import Bar from 'foo'
を何度も何度も繰り返す。あるいは、jQueryやlodashのようなパッケージをここでグローバルとして取り込むこともできます(ただし、Webpackの
エクスターナル
).
ステップ1)任意のモジュールを作成します。例えば、ユーティリティのグローバルなセットがあると便利です。
utils.js
export function sayHello () {
console.log('hello')
}
ステップ 2) モジュールのエイリアスを設定し、ProvidePlugin に追加します。
webpack.config.js
var webpack = require("webpack");
var path = require("path");
// ...
module.exports = {
// ...
resolve: {
extensions: ['', '.js'],
alias: {
'utils': path.resolve(__dirname, './utils') // <-- When you build or restart dev-server, you'll get an error if the path to your utils.js file is incorrect.
}
},
plugins: [
// ...
new webpack.ProvidePlugin({
'utils': 'utils'
})
]
}
ここで
utils.sayHello()
を任意の js ファイルに追加すれば動作するはずです。Webpackを使用している場合は、開発サーバーを再起動することを確認してください。
注意: linterにグローバルについて伝えるのを忘れないようにしてください。例えば、私の ESLintに対する回答はこちら .
- Webpackの 定義プラグイン
グローバルに文字列値でconstを使いたいだけなら、このプラグインをWebpackのプラグインリストに追加することができます。
new webpack.DefinePlugin({
PRODUCTION: JSON.stringify(true),
VERSION: JSON.stringify("5fa3b9"),
BROWSER_SUPPORTS_HTML5: true,
TWO: "1+1",
"typeof window": JSON.stringify("object")
})
のように使います。
console.log("Running App version " + VERSION);
if(!BROWSER_SUPPORTS_HTML5) require("html5shiv");
- グローバルウィンドウオブジェクト(またはNodeのグローバル)を使用する
window.foo = 'bar' // For SPA's, browser environment.
global.foo = 'bar' // Webpack will automatically convert this to window if your project is targeted for web (default), read more here: https://webpack.js.org/configuration/node/
これはポリフィルなどでよく見かけると思います。
window.Promise = Bluebird
- のようなパッケージを使用します。 ドットエンブ
(サーバーサイドのプロジェクトの場合) dotenv パッケージはローカルの設定ファイル (キーや認証情報がある場合は .gitignore に追加できます) を受け取り、設定変数を Node の プロセス.env オブジェクトを作成します。
// As early as possible in your application, require and configure dotenv.
require('dotenv').config()
を作成します。
.env
ファイルをプロジェクトのルートディレクトリに作成します。新しい行に環境固有の変数を
NAME=VALUE
. 例えば
DB_HOST=localhost
DB_USER=root
DB_PASS=s1mpl3
以上です。
process.env
で定義したキーと値を持つようになりました。
.env
ファイルを作成します。
var db = require('db')
db.connect({
host: process.env.DB_HOST,
username: process.env.DB_USER,
password: process.env.DB_PASS
})
注意事項
Webpackの 外観 これは、ビルドしたバンドルに含まれないモジュールを除外したい場合に使用します。Webpackはそのモジュールをグローバルに利用できるようにしますが、バンドルには入れません。これはjQueryのような大きなライブラリに便利です(ツリーが外部パッケージを揺らすので はWebpackでは動作しません。 を使用する場合、これらは別のスクリプトタグですでにページに読み込まれています(おそらくCDNから)。
関連
-
Vueの「データを聴く」原則を解説
-
[解決済み] 正規表現で変数を使うには?
-
[解決済み] 要素外でのクリックを検出するにはどうすればよいですか?
-
[解決済み] jQueryでチェックボックスに "checked "を設定する
-
[解決済み] JavaScriptで現在のURLを取得する?
-
[解決済み] event.preventDefault() vs. return false
-
[解決済み] forEachループでasync/awaitを使用する
-
[解決済み] Node.jsを使うタイミングをどう判断するか?
-
[解決済み] jQueryを使用してキーボードのEnterキーを押したことを検出する方法は?
-
[解決済み] webpackでjQueryプラグインの依存関係を管理する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
vue for 登録ページ効果 vue for sms 認証コードログイン
-
JavaScriptの配列共通メソッド解説
-
Vueのフォームイベントのデータバインディングの説明
-
Vueのフィルタの説明
-
Vueの一般的な組み込みディレクティブの説明
-
[解決済み】SyntaxError: JSONの位置1に予期しないトークンoがある。
-
[解決済み】Uncaught SyntaxError: JSONの位置0に予期しないトークンuがあります。
-
[解決済み】Node Version Manager のインストール - nvm コマンドが見つかりません。
-
[解決済み】「X-Frame-Options」を「SAMEORIGIN」に設定したため、フレームでの表示を拒否された。
-
[解決済み】ERROR エラーです。スイッチのname属性が指定されていないフォームコントロールの値アクセッサがない