2016-01-13 9 views
19

Ho un singolo file .json che contiene elementi di configurazione a cui vorrei fare riferimento da un altro file di script usando la tipica sintassi import/require. Attualmente sto usando il webpack per risolvere queste dipendenze e raggrupparle per me. Questo file però voglio essere caricato in fase di runtime e speravo che ci potesse essere qualche tipo di caricatore che potesse risolversi e caricare questo file per me in fase di runtime. Finora non ho trovato nulla che corrisponda esattamente alle mie esigenze.Un modo per usare il webpack per caricare una risorsa in fase di runtime?

Esempio:

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

console.log(myConfig.myFavoriteSetting); 

Nell'esempio di cui sopra mi piacerebbe avere myconfig.json risolto e caricati in fase di esecuzione.

domande Forse Related:

+1

ho cercato roba simile, ma non ho trovato alcun caricatore. Alla fine ho usato la funzione getJSON di jquery per quello. – VyvIT

+0

Attualmente ho risolto la stessa soluzione. Forse questo è più semplicistico a lungo termine. – jpierson

+0

Sono curioso di sapere come sei riuscito a farlo funzionare anche con il jQuery getJSON? Mi sembra di ottenere un 404 che il file di configurazione non esiste anche se è nella cartella dist. –

risposta

5

penso che quello che vuoi è require.ensure, il codice di divisione webpack. I moduli che "assicurate" vengono messi in un bundle separato e quando il vostro "assicuratevi" viene eseguito in fase di esecuzione, il runtime del pacchetto Web recupera automaticamente il pacchetto tramite ajax. Notare la sintassi di callback per assicurarsi che la callback venga eseguita al termine del caricamento del pacchetto. Hai ancora bisogno di richiedere i moduli desiderati in quel punto; . L'assicurazione si limita a garantire che siano disponibili.

La suddivisione del codice è una delle principali funzionalità del pacchetto Web, consente di caricare solo ciò che è necessario in un dato momento. Esistono plug-in, ecc. Per ottimizzare anche i bundle multipli.

+2

L'uso di require.ensure si avvicina ma suppongo che quello che stavo cercando fosse qualcosa di più lungo la linea di come * async/await * può dividere una funzione a metà in modo che la seconda metà funzioni come una continuazione senza dover cambiare lo stile sincrono del codice. Se una funzione come questa non esiste ancora, penso che la tua risposta sia probabilmente la migliore che otterrò. – jpierson

5

Con Webpack 2, è possibile utilizzare System.import. Usa l'API Promise. AFAIK, al momento non è possibile eseguire il codice di attesa/attesa nel browser. Credo che Babel possa solo traspondere async/attendere fino a ES2015 in modo che solo l'ultima versione di Node (v6.x) possa eseguirlo. Non penso che i browser siano in grado di capirlo ancora perché il codice transpiled usa i generatori.

Per System.import, si noti che alcuni browser meno recenti (IE 11 e versioni precedenti) richiedono che venga eseguito il polyfill dell'API Promise. Dai un'occhiata a polyfill.io per questo.

Se si desidera VERAMENTE utilizzare async/await nel browser, è possibile eseguire un polyfill completo per ES2015.

+0

Sì, probabilmente avrei dovuto affermare più chiaramente che stavo cercando un approccio asincrono che utilizzasse callback, promesse, generatori o qualcosa che potrei avvolgere asincrono. Nel mio caso stavo già usando Babel oltre a TypeScript per gestire alcuni di questi tipi di funzionalità di gestione asincrona. – jpierson

1

Ho avuto lo stesso caso con un file (config.json).

ho deciso di copiarlo con Copy-Webpack-Plugin

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

Dopo di che, il mio file è nella directory di output di generazione. Ho usato immobili 'esterni' per fare riferimento a mio file nel mio file webpack.config:

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

Nel mio file js che caricare il config.json:

import config from 'config' 

'config' carico require ('. /config.json) che è quello nella directory di generazione dell'output.

So che è difficile ma non ho trovato un'altra soluzione al mio problema.Forse aiuterà qualcuno.

EDIT

ho dovuto usare webpack al fine di costruire perché import config from 'config' non era comprensibile senza di essa. Ecco perché sostituisco:

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

e

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

Senza webpack, Javascript capire var config = require('./config.json') perché è la strada giusta.

E quando costruisco con webpack, cambia da require('./config.json') quando vede './config.json', quindi funziona

+0

Non riesco a farlo funzionare. Webpack non cerca config.json nella stessa cartella di webpack.config.js (a causa del riferimento "./config.json") durante la fase di sviluppo? Il mio getta solo un modulo non trovato per config.json poiché è da qualche altra parte con i file JS nella configurazione di sviluppo. – Tru

+0

Hai ragione, se voglio eseguire il mio server, devo farlo nella cartella build. Webpack crea la cartella del mio server in build/index.js. La mia cartella è simile a questa: cartella di compilazione -> config.json e index.js (dopo il webpack, c'è un 'require ('./ config.json') in index.js uglified). cartella server -> config.json e index.js (ma nel file index.js, ho 'import config da 'config'' e il nodo non lo capisce ..) –