2017-02-10 18 views
16

próbuję zaimportować materiał-ui do mojego React aplikacji wykorzystujące System.JSJak mapować ./[module] na /[module]/[module].js w System.JS?

W mojej aplikacji, to robię:

import {AppBar, Tabs, Tab, Card, CardTitle} from 'material-ui'; 

Oto mój System.JS config:

System.config({ 
    baseURL: '/node_modules', 
    packageConfigPaths: [ 
     '*/package.json' 
    ], 
    packages: { 
     '.': { 
      defaultExtension: 'js', 
      main: 'index.js' 
     }, 
    } 
}); 

ładuje node_modules/material-ui/index.js który ma kilka importu wewnątrz niego:

var _AppBar2 = require('./AppBar'); 

var _AppBar3 = _interopRequireDefault(_AppBar2); 

var _AutoComplete2 = require('./AutoComplete'); 

var _AutoComplete3 = _interopRequireDefault(_AutoComplete2); 

// ... etc, about 40 of them. 

exports.AppBar = _AppBar3.default; 
exports.AutoComplete = _AutoComplete3.default; 

// ... etc 

w drzewo struktury pakietu, każdy z tych modułów jest przechowywany pod własnym katalogu tak:

material-ui/ 
    index.js 
    AppBar/ 
    AppBar.js 
    index.js -- just reexports './AppBar' 
    AutoComplete/ 
    AutoComplete.js 
    index.js -- just reexports './AutoComplete' 

, itd., Więc w rzeczywistości importować material-ui/AppBar muszę System.JS załadować node_modules/material-ui/AppBar/AppBar.js lub node_modules/material-ui/AppBar/index.js.

Zamiast tego System.JS próbuje załadować node_modules/material-ui/AppBar.js, którego tam nie ma.

Jeśli dodać poszczególne wpisy dla każdego modułu pod packages:

'material-ui': { 
    map: { 
     './AppBar': './AppBar/AppBar.js' 
    } 
} 

to działa, jednak symbole wieloznaczne:

'material-ui': { 
    map: { 
     './*': './*/*.js' 
    } 
} 

nie.

Jak utworzyć Mapę System.JS ./* na ./*/*.js w ramach określonej paczki?


Na marginesie, browserify nie ma żadnych problemów z tego układu, więc kiedy połączą mojej aplikacji przy użyciu browserify prostu dzwoniąc browserify('./path/to/root/index.js'), wszystkie moduły materiałowe-ui dostać importowane bez żadnych problemów.

+0

Prawdziwym problemem jest to, że SystemJS nie obsługuje rozdzielczości modułu Node. Myślę, że planują dodać to, ale na razie takie rzeczy jak Browserify i Webpack mogą robić takie rzeczy po wyjęciu z pudełka. Czy jest jakiś powód, dla którego musisz użyć SystemJS? – Menello

+0

@Menello: nie ma żadnego powodu, z wyjątkiem tego, że znam tylko zdolność przeglądarki Browserify do tworzenia pakietów (tak naprawdę używam go w moim systemie) i wcale nie znam się na pakiecie Webpack. Byłem pod wrażeniem SystemJS mógł przetworzyć 'pakiet.json' w modułach. To, czego szukam, to móc używać pojedynczych pakietów z 'node_modules' i drzewa źródłowego bez konieczności pakowania ich w trakcie cyklu rozwoju, tak, żebym mógł zhackować pakiet w' node_modules' w miejscu, odświeżyć i natychmiast zobaczyć co dzieje się bez konieczności pakowania całości. Nie zamierzam używać System.JS w produkcji. – Quassnoi

+0

Jeśli obsługujesz folder modułów węzła, możesz dodać do niego znacznik skryptu: ''? Czy to wystarczy? – Menello

Odpowiedz

4

Ścieżki wieloznaczne nie są supported w pliku System.js. Będziesz musiał ręcznie dodać wpis dla każdego modułu:

'material-ui': { 
    map: { 
    './AppBar': './AppBar/AppBar.js', 
    './AppHeader': './AppHeader/AppHeader.js', 
    './AppFooter': './AppFooter/AppFooter.js', 
    //etc 
    } 
} 

Można również użyć jspm wygenerować ten wykaz dla Ciebie.

+1

Należy zauważyć, że komentarz, do którego prowadzi łącze, dotyczy ustawienia 'paths', a nie ustawienia' map'. – Louis

+0

ah dzięki - naprawiam – hackerrdave

+0

@hackerrdave: dzięki. Czy 'jspm' jest narzędziem do generowania konfiguracji System.JS? (wydaje się, że tak, to po prostu nie wynika z dokumentacji). Biorąc pod uwagę, że mam plik 'index.js', który rekurencyjnie ładuje kilka modułów i które mogę przekonwertować na pakiet poprzez uruchomienie' browserify' z zerową konfiguracją, jak wspomniano w OP, w jaki sposób powinienem użyć 'jspm' do wygenerować konfigurację? – Quassnoi

Powiązane problemy