2015-05-12 11 views
6

Rozwijam trochę static site generator na górze Webpack i React. Obecnie robię to bardziej dynamicznie. Jedną z części jest to, że jest bardziej konfigurowalny.Jak starannie dopasować Webpack `require.context`?

Biorąc pod uwagę strukturę witryny jak to

. 
├── _book 
├── assets 
├── build 
├── drafts 
├── manuscript 
├── node_modules 
├── pages 
├── project_source 
└── styles 

chciałbym wymagają tylko pliki z określonym katalogu lub katalogów. W tym przypadku wystarczy wymagać plików Markdown z manuscript. Naiwny var req = require.context('manuscript', true, /^\.\/.*\.md$/) zadziałałby.

Problem polega na tym, że musi to stać się dynamiczne, gdy przechodzę przez katalog poprzez konfigurację generatora witryn. Ponieważ require.context opiera się na ustalonych wartościach, uważam, że muszę zmienić kontekst na katalog główny strony, używając czegoś takiego jak var req = require.context('.', true, /^.*\.md$/), a następnie sprawdzić pod kątem req.keys(), aby dopasować się do mojej konfiguracji.

W praktyce jest to bardzo powolne, ponieważ będzie przemierzać całe drzewo! Szczególnie node_modules może zawierać wiele plików i jest to coś, czego należy unikać za wszelką cenę.

Czy istnieje sposób na wyłączenie node_modules z require.context? Przypuszczam, że jakaś forma Regexa może działać, chociaż jestem otwarty na inne pomysły.

+0

Czy wywołanie 'require.context' powoduje zastąpienie poprzedniego kontekstu? –

+0

@OlimSaidov Magia powinna się wydarzyć pod adresem [paths.js] (https://github.com/antwarjs/antwar/blob/f8e4061fa10494e40a7fbd12125ec8bd1fc645fd/paths.js). 'config' mapuje do konfiguracji strony (podaję tam ścieżki). Powinienem móc ustawić kontekst w funkcji 'allPosts'. Mam nadzieję, że to wyjaśni sytuację. –

+0

Czy możesz przeglądać katalogi za pomocą 'fs.readdirSync' i wywoływać' require.context' ignorując folder 'node_modules'? –

Odpowiedz

0

Skończyło się na rozwiązaniu problemu przez wypchnięcie require.context poza generator statycznych stron oraz w zewnętrznej konfiguracji. Mam takie małe fragmenty:

paths: { 
    demo: { 
     path: function() { 
      return require.context('./demo', true, /^\.\/.*\.md$/); 
     }, 
    } 
} 

Następnie po stronie generatora po prostu zajmuję się tymi kontekstami.

To nie jest rozwiązanie, na które miałem nadzieję, ale działa.

+0

nie jestem pewien, czy to jest to, czego szukasz https://github.com/webpack/webpack/issues/118 – bsr

+0

Dzięki. require.context do tej pory działało tak świetnie.:) –

7

można spróbować:

var req = require.context('.', true, /^((?![\\/]node_modules|vendor[\\/]).)*\.md$/); 

wykluczyć ścieżki zawierające node_modules i vendor foldery z meczu.

+0

Dzięki! To świetny pomysł. Być może będę musiała to zrobić później, ponieważ to znacznie uprościłoby moją obecną konfigurację i ukryłoby te rzeczy przed użytkownikiem końcowym. –

+0

Jest to wciąż powolne, ponieważ regex musi być porównywany do każdego znalezionego pliku. – vaughan