2016-01-13 5 views
19

私は典型的なimport/require構文を使用して別のスクリプトファイルから参照したい設定項目を含む単一の.jsonファイルを持っています。現在、これらの依存関係を解決してバンドルするためにwebpackを使用しています。しかし、このファイルは実行時にロードしたいので、実行時にこのファイルを解決してロードできるローダーがあるかもしれないことを期待していました。これまで私は自分のニーズに正確に合致するものは見つけられませんでした。Webpackを使用して実行時にリソースをロードする方法はありますか?

例:私はmyconfig.jsonが解決し、実行時にロードしたいのですが、上記の例で

var jQuery = require('jQuery'); 
var sol = require('some-other-lib'); 
var myConfig = require('/real/production/url/myconfig.json'); 

console.log(myConfig.myFavoriteSetting); 

おそらく関連質問:

+1

動作します。最終的に私はjQuery getJSON関数を使っていました。 – VyvIT

+0

私は同じ回避策を現在行っています。おそらくこれは長期的に見るとより単純です。 – jpierson

+0

jquery getJSONを使用しても、これをどのように動作させることができたのか不思議です。私は404の設定ファイルは存在しないが、それはdistフォルダにあります。 –

答えて

5

私が何をしたいことは、WebPACKのコードの分割require.ensureだと思います。あなたが保証するモジュールは別々のバンドルに入れられ、実行時に '確実に'実行されると、webpackランタイムは自動的にajaxによってバンドルを取得します。確実にするためのコールバック構文に注意してください。バンドルのロードが完了したらコールバックが実行されます。その時点で必要なモジュールを要求する必要があります。 .ensureはそれらが利用可能であることを確かめます。

コード分割はwebpackの主な機能の1つで、いつでも必要なものだけを読み込むことができます。複数のバンドルを最適化するためのプラグインなどもあります。

+2

require.ensureの使用は近づいていますが、私が探していたのは、async/await *の分割方法の線に沿ったものです後半部分がコードの同期スタイルを変更せずに継続として実行されるように、関数は半分になります。このような機能がまだ存在しない場合、私はあなたの答えはおそらく私が得るつもりだと思う。 – jpierson

5

Webpack 2では、System.importを使用できます。プロミスAPIを使用します。 AFAIK、現在、ブラウザにasync/awaitコードを実行する方法はありません。私はBabelがES2015へのasync/transpaidしかできないので、Node(v6.x)の最新バージョンだけがそれを実行できると信じています。私は、翻訳されたコードがジェネレータを使用しているため、ブラウザーがそれをまだ理解できるとは思わない。

System.importの場合、一部の古いブラウザ(Internet Explorer 11以降)では、Promise APIをポリフィルする必要があります。そのためにpolyfill.ioをチェックしてください。

ブラウザで本当にasync/awaitを使用する場合は、ES2015用の完全なポリフィルを行うことができます。

+0

はい、コールバック、約束、ジェネレータ、または非同期のラップが可能なものを使用する非同期アプローチを探していたことを、より明確に述べておくべきでしょう。私の場合、これらのタイプの非同期処理機能の一部を管理するために、すでにBabelとTypeScriptを使用していました。 – jpierson

1

ファイル(config.json)と同じケースがありました。私はその後Copy-Webpack-Plugin

new CopyWebpackPlugin([ 
    // Copy directory contents to {output}/ 
    { from: 'config.json' } 
    ]) 

でそれをコピーすることを決めた

、私のファイルは、出力ビルドディレクトリにありました。私は私のwebpack.configファイルで私のファイルを参照するために '見た目' プロパティを使用:

externals: { 
    'config': "require('./config.json')" 
    } 

私のjsファイルでconfig.jsonをロードした:

import config from 'config' 

'設定' 負荷が「(必要。 /config.json)は出力ビルドディレクトリにあります。

私はそれが難しいと知っていますが、私は私の問題の別の解決策を見つけられませんでした。たぶん誰かを助けるだろう。

EDIT

私はimport config from 'config'はそれなしでは理解できなかったので、構築するためにWebPACKのを使用する必要がありました。私は交換する理由です:

externals: { 
    './config.json': "require('./config.json')" 
    } 

var config = require('./config.json') //replace import config from 'config' 

のWebPACKがなければ、それは正しい道だからJavascriptがvar config = require('./config.json')を理解しています。

そして、私はWebPACKのでビルドするとき、それは「./config.json」を見require('./config.json')によって変化するので、それは私が似たものを探してきましたが、どのローダーを発見していない

+0

私はこれが動作するように見えることはできません。開発中のビルド時にwebpack.config.jsと同じフォルダ内のconfig.jsonをWebpackで検索しないでください( './config.json'リファレンスのため)。私の場合は、devの設定ファイルにJSファイルがあるので、config.jsonで見つからないモジュールを投げてしまいます。 – Tru

+0

あなたが正しいです、私は私のサーバーを実行したい場合、私はそれをビルドフォルダで行う必要があります。 Webpackビルド/ index.jsの私のサーバーフォルダをビルドします。 私のフォルダは次のようになります: ビルドフォルダ - > config.jsonとindex.js(webpack後、index.js uglifiedに 'require( './ config.json')'があります)。 サーバフォルダ - > config.jsonとindex.js(ただし、index.jsには 'config 'からインポート設定があり、ノードはそれを理解できません..) –