-
Notifications
You must be signed in to change notification settings - Fork 1
/
webpack.config.js
140 lines (121 loc) · 4.29 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
131
132
133
134
135
136
137
138
139
140
const path = require("path");
const CopyPlugin = require("copy-webpack-plugin");
const HtmlPlugin = require("html-webpack-plugin");
const ConcatPlugin = require("webpack-concat-plugin");
const TerserPlugin = require('terser-webpack-plugin');
const PACKAGE = require("./package");
const webpack = require('webpack');
const VERSION = ("" + PACKAGE.version).toLowerCase();
const REPO_URL = (PACKAGE.repository).toLowerCase();
const VERSION_INFO = `game version ${VERSION}`;
const VERSION_PATH = VERSION;
const BUNDLE_SCRIPT = PACKAGE['bundleScript'];
const SRC = path.join(__dirname, "src");
/**
* помни!
* build раскладывается в DIST
* а webpack-dev-server показывает localhost c корнем в DIST
*/
const DIST = path.join(__dirname, 'dist', VERSION_PATH);
const DIR_NODE = path.join(__dirname, "node_modules");
/**
* Можно держать кучу мини-игр в одном репо,
* если в папке src создавать директории под каждый
*/
const projects = [
{
src: "wonder-format",
dist: "wonder", // папка выгрузки в dist
title: "Twine Wonder Format",
htmlTemplate: "index.html",
htmlDistrIndex: "index.html", // название html в папке дистрибутива
entry: "start.ts",
copy: [
"assets",
"icon.svg",
"wonderFormat.js",
"test-api.html"
]
}
];
const entries = {};
const copyData = [];
const plugins = [];
// одним плагином задаем общие константы в файлах из entry point
plugins.push(new webpack.DefinePlugin({
// передача происходит инлайнингом в исходники
// если убрать JSON.stringify - то вместо "game version 1"
// где-то в коде появится строка game version 1 без кавычек
// (c) If the value is a string it will be used as a code fragment
// и это ломает как минимум работу игры на webpack-dev-server
VERSION_INFO: JSON.stringify(VERSION_INFO),
REPO_URL: JSON.stringify(REPO_URL),
}));
projects.forEach((project) => {
const dirSrc = path.join(SRC, project.src);
// сборку старых игр осуществляем через склейку скриптов
// entry есть у всех, кроме shared
if (project.entry) {
entries[project.dist] = path.join(dirSrc, project.entry);
}
/**
* Если есть htmlTemplate - используем ее
*/
if (project.htmlTemplate && project.htmlTemplate.length > 0) {
plugins.push(new HtmlPlugin({ // витально!
template: path.join(dirSrc, project.htmlTemplate),
filename: path.join(project.dist, project.htmlDistrIndex),
// кастомные строки, которую можно передать в шаблон :
title: project.title,
}));
}
/**
* копирование директорие
*/
project.copy.forEach((copyPath) => {
copyData.push({from: `${project.src}/${copyPath}`, to: `${project.dist}/${copyPath}`});
});
});
plugins.push(new CopyPlugin(copyData));
module.exports = (env, argv) => {
return {
context: SRC,
entry: entries,
mode: argv.mode || "development",
target: "web",
output: {
path: DIST,
filename: `[name]/${BUNDLE_SCRIPT}`
},
devServer: {
contentBase: path.resolve(DIST, 'wonder'),
disableHostCheck: true
},
resolve: {
extensions: ['.ts', '.js'],
modules: [
SRC,
DIR_NODE
]
},
module: {
rules: [
{test: /\.tsx?$/, loader: "ts-loader"},
],
},
optimization: {
minimize: true,
minimizer: [
new TerserPlugin({
terserOptions: {
compress: {
drop_console: true
}
}
})
]
},
plugins: plugins,
// watch: false,
};
};