-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathwebpack.config.js
130 lines (109 loc) · 3.57 KB
/
webpack.config.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
// Narzędzia do manipulowania ścieżkami do plików
const path = require('path');
// Narzędzia dostępu do plików na dysku
const fs = require('fs');
// Plugin budujący pliki HTML
const HtmlWebpackPlugin = require('html-webpack-plugin');
// Plugin zapisujący dane jako oddzielne pliki
const ExtractTextPlugin = require("extract-text-webpack-plugin");
// Plugin czyszczący katalog `dist` przed budową paczki
const CleanWebpackPlugin = require('clean-webpack-plugin');
// Instancja ExtractTextPlugin odpowiedzialna za stworzenie pliku CSS
const extractSCSS = new ExtractTextPlugin("styles.css");
// Katalog z plikami źródłowymi
const SOURCE_DIR = path.join(__dirname, '/src');
// Katalog z gotową stroną
const DIST_DIR = path.join(__dirname, '/dist');
// Główny plik JavaScript (w nim MUSI być import pliku SCSS)!
const MAIN_JS_FILE = path.join(SOURCE_DIR, 'scripts/app.js');
// list pluginów
let plugins = [];
let pages = findPagesFiles();
pages.forEach((pageName) => {
plugins.push(new HtmlWebpackPlugin({
filename: `${pageName}.html`,
template: path.join(SOURCE_DIR, `${pageName}.hbs`)
}));
});
// Zapisanie pliku CSS
plugins.push(extractSCSS);
// Wyczyść katalog 'dist' przed budową paczki
plugins.push(new CleanWebpackPlugin(DIST_DIR));
module.exports = {
// Główny plik JS jest punktem wejścia dla WebPacka
entry: MAIN_JS_FILE,
// Katalog z gotową paczką
output: {
path: DIST_DIR,
filename: 'scripts/main.js'
},
module: {
rules: [
// Obsługa plików szablonów HandlebarsJS
{
test: /\.hbs/,
use: {
loader: "handlebars-loader",
query: {
inlineRequires: '/img/'
}
}
},
// Obsługa plików SCSS i CSS
{
test: /\.s?css$/,
use: extractSCSS.extract([
{
loader: "css-loader"
},{
loader: 'sass-loader'
}
])
},
// Obsługa fontów
{
test: /\.(eot|svg|ttf|woff|woff2)$/,
// Ponieważ pliki SVG mogą być fontami i obrazkami
// ignorujemy pliki w katalogi `img`
exclude: [/img/],
use: {
loader: 'file-loader',
options: {
name: '[name].[ext]?[hash]',
outputPath: 'fonts/',
}
}
},
// Obsługa obrazków
{
test: /\.(jpg|png|gif|svg)$/,
exclude: [/fonts/],
// Ponieważ pliki SVG mogą być fontami i obrazkami
// ignorujemy pliki w katalogi `fonts`
use: {
loader: 'file-loader',
options: {
name: '[name].[ext]?[hash]',
outputPath: 'img/',
}
}
}
]
},
plugins
}
/**
* Funkcja zwracająca nazwy wszystkich plików `*.hbs` z katalogu `/src`
*/
function findPagesFiles(dir = SOURCE_DIR) {
let result = [];
let list = fs.readdirSync(dir);
list.forEach(f => {
file = path.join(dir, f);
let stat = fs.statSync(file);
if (stat && !stat.isDirectory() && /\.hbs$/.test(f)) {
result.push(/(.*)\.hbs$/.exec(f)[1]);
}
});
return result;
}