2016-01-13 22 views
19

Mam jeden plik .json, który zawiera elementy konfiguracji, które chciałbym odwołać z innego pliku skryptu przy użyciu typowej składni importu/wymagania. Obecnie używam WebPacka do rozwiązywania tych zależności i pakowania ich dla mnie. Ten plik jednak powinien być załadowany w czasie wykonywania i miał nadzieję, że może istnieć jakiś typ programu ładującego, który mógłby rozwiązać ten plik w czasie wykonywania. Do tej pory nie znalazłem niczego, co pasowałoby dokładnie do moich potrzeb.Jakikolwiek sposób wykorzystania pakietu internetowego do załadowania zasobu w czasie wykonywania?

przykład:

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

console.log(myConfig.myFavoriteSetting); 

W powyższym przykładzie ja jak do myconfig.json rozwiązany i ładowane w czasie pracy.

Ewentualnie pokrewnych pytania:

+1

Rozglądałem podobnych rzeczy, ale nie znaleziono żadnych ładowarki. W końcu użyłem do tego funkcji jQuery getJSON. – VyvIT

+0

Mam obecnie to samo obejście. Być może na dłuższą metę jest to bardziej uproszczone. – jpierson

+0

Jestem ciekawy, w jaki sposób udało się uzyskać to działa nawet z jquery getJSON? Wydaje mi się, że otrzymałem plik 404, że plik konfiguracyjny nie istnieje, chociaż znajduje się w folderze dist. –

Odpowiedz

5

myślę co chcesz to require.ensure, kod łupania WebPACK użytkownika. Moduły, które "zapewniasz", są umieszczane w oddzielnym pakiecie, a kiedy "zapewnią" wykonanie w czasie wykonywania, środowisko uruchomieniowe sieci Web automatycznie pobiera pakiet za pośrednictwem ajax. Zapamiętaj składnię wywołania zwrotnego, aby upewnić się, że wywołanie zwrotne jest uruchamiane po zakończeniu ładowania pakietu. Nadal musisz wymagać wymaganych modułów w tym momencie; .ensure po prostu zapewnia, że ​​są one dostępne.

Podział kodu jest jedną z głównych funkcji webpacka, pozwala ładować tylko to, czego potrzebujesz w danym momencie. Istnieją wtyczki itp., Aby zoptymalizować wiele pakietów.

+2

Korzystanie z require.ensure jest bliskie, ale przypuszczam, że to, czego szukałem, było czymś bardziej zbliżonym do tego, w jaki sposób * async/wait * może się dzielić funkcja na pół tak, że druga połowa działa jako kontynuacja bez konieczności zmiany stylu synchronicznego kodu. Jeśli taka funkcja jeszcze nie istnieje, myślę, że twoja odpowiedź jest prawdopodobnie najlepsza, jaką dostanę. – jpierson

5

Za pomocą Webpack 2 można użyć System.import. Korzysta z Promise API. AFAIK, obecnie nie ma sposobu na uruchomienie asynchronicznego/czekania na kod w przeglądarce. Wierzę, że Babel może przenosić tylko asynchroniczne/oczekujące na ES2015, więc może go uruchomić tylko najnowsza wersja Node (v6.x). Myślę, że przeglądarki nie są w stanie tego zrozumieć, ponieważ transpiled kod używa generatorów.

Dla System.import pamiętaj, że niektóre starsze przeglądarki (IE 11 i poniżej, jak sądzę) będą wymagały dopracowania interfejsu API Promise. Sprawdź do tego polyfill.io.

Jeśli NAPRAWDĘ chcesz używać async/await w przeglądarce, możesz być w stanie wykonać pełny polyfill dla ES2015.

+0

Tak, prawdopodobnie powinienem był bardziej wyraźnie stwierdzić, że szukałem asynchronicznego podejścia, które używa callbacków, obietnic, generatorów lub czegoś, co mógłbym owinąć wokół asynchronicznego oczekiwania. W moim przypadku już używałem Babel oraz TypeScript do zarządzania niektórymi typami funkcji asynchronicznych. – jpierson

1

Miałem ten sam przypadek z plikiem (config.json).

postanowiłem skopiować go Copy-Webpack-Plugin

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

Po tym, mój plik był w katalogu build wyjście. Kiedyś własności 'zewnętrznymi' odwołać mój plik w moim pliku webpack.config:

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

W moim pliku js, który załadować config.json:

import config from 'config' 

require 'config' load (”. /config.json), który jest tym z wyjściowego katalogu kompilacji.

Wiem, że to trudne, ale nie znalazłem innego rozwiązania mojego problemu.Może to pomoże komuś.

EDIT

musiałem użyć WebPACK w celu zbudowania ponieważ import config from 'config' nie było zrozumiałe bez niego. Dlatego wymienić:

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

i

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

Bez WebPacka, Javascript zrozumieć var config = require('./config.json') bo to właściwa droga.

I kiedy budować z WebPack to zmienić przez require('./config.json') gdy widzi „./config.json”, tak to działa

+0

Nie mogę sprawić, żeby to działało. Czy Webpack nie szukałby pliku config.json w tym samym folderze co plik webpack.config.js (z powodu odniesienia "./config.json") podczas budowania? Mój rzuca tylko moduł nie znaleziony dla config.json, ponieważ jest gdzieś indziej z plikami JS w konfiguracji dev. – Tru

+0

Masz rację, jeśli chcę uruchomić mój serwer, muszę to zrobić w folderze kompilacji. Webpack zbuduj mój folder na serwerze w katalogu build/index.js. Mój folder wygląda następująco: Folder kompilacji -> config.json i index.js (po pakiecie sieci Web istnieje plik 'require ('./ config.json')' w pliku index.js). Folder serwera -> config.json i index.js (ale w pliku index.js mam 'import config from 'config'', a węzeł nie rozumie tego ..) –