2016-07-14 26 views
6

Próbuję uczynić aplikację React tematyczną. Na razie tematy składają się tylko z różnych zestawów zmiennych sass, które definiują różne kolory nagłówka, itp.Jak wyodrębnić wiele arkuszy stylów kompozycji za pomocą pakietu internetowego?

Z mojego obecnego rozumowania ExtractTextPlugin wydaje się być moim najlepszym zakładem, ponieważ nie chcę, aby moje style były wbudowane i mają raczej oddzielne pliki na temat.

Więc stworzyłem dwa tematy:

src/scss/themes/theme-a.scss 
src/scss/themes/theme-b.scss 

Tematyka importować podstawowy układ i wspólne style i zastąpić odpowiednie zmienne.

Ale jedynym sposobem udało mi się zrobić WebPack tworzyć oddzielne pliki CSS dla obu tematów było stworzenie odrębne punkty wejścia dla każdego tematu w mój webpack.prod.config:

entry: { 
    app: './src/js/init.js', 
    theme-a: './src/scss/themes/theme-a.scss', 
    theme-b: './src/scss/themes/theme-b.scss' 
}, 

Ale dodanie nowego punktu wejścia dla każdego nowy motyw, który zostanie dodany, czuje się źle i myślę, że musi być lepszy sposób?

+0

Hm, wierzę, trzeba odwołanie w 'plugins', podobny do' nowej ExtractTextPlugin ('css/bundle.css') '. Nie widziałem, żeby ludzie wprowadzali te "wstęp". Oddzielam tylko CSS w jednym pliku, ale sprawdź tutaj, wydaje się, że wypakowuje 2 pliki w przykładzie (css i mniej): https://github.com/webpack/extract-text-webpack-plugin#api – lux

+0

Hm, ale dodanie wielu instancji wtyczki zamiast wielu wpisów nie brzmi o wiele wygodniej. Co by było fajnego, gdyby ktoś mógł powiedzieć wtyczce, że wypluwa oddzielny plik css dla każdego pliku scss napotkanego w określonym źródle/folderze. – arie

Odpowiedz

7

oto rozwiązanie:

npm i --save-dev file-loader 

W sekcji loaders, dodać to:

{ 
    test: /themes\/.+\.scss$/, 
    loader: "file-loader?name=./compiled-themes/css/[name].css!css!sass" 
}, 

Nie mogą być plikami więcej SCSS, jeśli więc nie musi być inny fragment który grupuje je jak zwykle, ale pomija motywy:

{ 
    test: /\.scss$/, 
    exclude: /themes\/.+\.scss$/, 
    loader: "css!sass" 
}, 

Program ładujący zapisuje pliki według nazwy pliku, hash a Rozszerzenie nd, dzięki czemu możesz zachować nazwę.

Uwaga część name=./compiled-themes/css/[name].css, gdzie zastępuje się [] vars.

https://github.com/webpack/file-loader

+0

w celu wyjaśnienia, program ładujący pliki jest w rzeczywistości pisarzem plików, ale ma to przyrostek -loadera zgodnie z konwencją nazewnictwa wtyczek sieciowych –

+1

To wygląda na naprawdę fajne rozwiązanie! Próbowałem dostosować Twój przykład i skompilowane motywy zostały utworzone. Wspaniały! Ale jakoś pliki nie składają się z czystego css, ale są zapakowane w moduł 'exports = module.exports = require (" ./../../../ node_modules/css-loader/lib/css-base.js ")();' '// import' ' // module' 'exports.push ([module.id," .ReactModal__Overlay {z-index: 999; przepełnienie: auto; margin: 0! Important; padding: 0 ... ' Masz pojęcie o co może być problem? Moja linia programu ładującego dla motywów wygląda następująco: ' loader: "file-loader? Name =./Compiled -themes/css/[nazwa] .css! css! sass "' – arie

+0

'raw! saas' zrobiłoby lewę, po prostu spróbowałem, musisz' npm i raw-loader' –

2

Aby uniknąć konieczności ręcznego dodawania motywów, jednym z możliwych rozwiązań jest utworzenie funkcji, która odczytuje zawartość folderu motywów i programowo dodaje pozycję dla każdego pliku * .scss.

Coś wzdłuż linii to:

function getThemes(themePath) { 
    var themes = {}; 
    fs.readdirSync(themePath).forEach(function(fileName) { 
     var fileNameWithPath = path.join(themePath, fileName); 

     var stat = fs.lstatSync(fileNameWithPath); 
     if (stat.isDirectory()) return; 
     if (!/\.scss$/.test(fileName)) return; 

     var nameWithoutExt = path.basename(fileName, '.scss'); 
     themes[nameWithoutExt] = fileNameWithPath; 
    }); 

    return themes; 
} 

var themes = getThemes('./src/scss/themes'); 

var config= { 
    entry: _.merge({ app: './src/js/init.js' }, themes), 
    // rest of options 
}; 

To będzie wymagać ponownego uruchomienia dev-serwer lub ponownie uruchomić ty WebPack budowania podczas dodawania nowego motywu plikach chociaż, ale przynajmniej nie będzie miał dotknąć konfiguracji komputera.

+0

Ta konfiguracja powoduje, że plik JS jest wyprowadzany dla każdego pliku CSS, tak samo jak sam plik CSS. Czy istnieje sposób zatrzymania pliku JS przed wydrukowaniem? – Giuseppe

Powiązane problemy