huan-simple-html 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/.eslintignore +30 -0
  2. package/.eslintrc.cjs +127 -0
  3. package/.npmignore +65 -0
  4. package/.prettierrc.cjs +14 -0
  5. package/LICENSE +8 -0
  6. package/LICENSE_CN +8 -0
  7. package/README +19 -0
  8. package/README_EN +19 -0
  9. package/REEPORT +15 -0
  10. package/REPORT_EN +15 -0
  11. package/config.json +5 -0
  12. package/package.json +65 -0
  13. package/public/.__ignore__ +1 -0
  14. package/src/404.js +1 -0
  15. package/src/4xx.js +1 -0
  16. package/src/5xx.js +1 -0
  17. package/src/assets/image/logo.png +0 -0
  18. package/src/assets/image/logo_big.png +0 -0
  19. package/src/assets/image/songzihuan.jpg +0 -0
  20. package/src/assets/image/wangan.png +0 -0
  21. package/src/common.js +24 -0
  22. package/src/html/LICENSE_CN.html +48 -0
  23. package/src/html/LICENSE_US.html +46 -0
  24. package/src/html/error/4xx/400.html +12 -0
  25. package/src/html/error/4xx/403.html +13 -0
  26. package/src/html/error/4xx/404.html +19 -0
  27. package/src/html/error/4xx/404.signal.html +57 -0
  28. package/src/html/error/4xx/404.songzihuan.signal.html +58 -0
  29. package/src/html/error/4xx/405.html +13 -0
  30. package/src/html/error/4xx/4xx.html +13 -0
  31. package/src/html/error/5xx/500.html +13 -0
  32. package/src/html/error/5xx/500.signal.html +30 -0
  33. package/src/html/error/5xx/500.songzihuan.signal.html +31 -0
  34. package/src/html/error/5xx/501.html +13 -0
  35. package/src/html/error/5xx/502.html +12 -0
  36. package/src/html/error/5xx/503.html +13 -0
  37. package/src/html/error/5xx/504.html +12 -0
  38. package/src/html/error/5xx/505.html +13 -0
  39. package/src/html/error/5xx/506.html +12 -0
  40. package/src/html/error/5xx/507.html +13 -0
  41. package/src/html/error/5xx/508.html +13 -0
  42. package/src/html/error/5xx/509.html +13 -0
  43. package/src/html/error/5xx/510.html +12 -0
  44. package/src/html/error/5xx/511.html +15 -0
  45. package/src/html/error/5xx/5xx.html +13 -0
  46. package/src/html/index.html +85 -0
  47. package/src/html/index.new.html +16 -0
  48. package/src/html/index.new.signal.html +43 -0
  49. package/src/html/mitorg.html +5073 -0
  50. package/src/index.js +1 -0
  51. package/src/license.js +1 -0
  52. package/src/main.js +0 -0
  53. package/src/mitorg.js +1 -0
  54. package/src/new.js +1 -0
  55. package/src/signal.js +1 -0
  56. package/src/style/error/404.css +31 -0
  57. package/src/style/error/4xx.css +17 -0
  58. package/src/style/error/5xx.css +15 -0
  59. package/src/style/index/index.css +26 -0
  60. package/src/style/index/license.css +4 -0
  61. package/src/style/index/mitorg.css +106 -0
  62. package/src/style/index/new.css +22 -0
  63. package/src/utils/file.js +45 -0
  64. package/webpack_config_dev.js +258 -0
  65. package/webpack_config_github.js +293 -0
  66. package/webpack_config_prod.js +278 -0
@@ -0,0 +1,293 @@
1
+ import path from "path"
2
+ import HtmlWebpackPlugin from "html-webpack-plugin";
3
+ import MiniCssExtractPlugin from 'mini-css-extract-plugin';
4
+ import CopyWebpackPlugin from "copy-webpack-plugin"
5
+ import TerserPlugin from 'terser-webpack-plugin';
6
+ import filetool from './src/utils/file.js'
7
+ import { fileURLToPath } from 'url';
8
+
9
+ const __filename = fileURLToPath(import.meta.url);
10
+ const __dirname = path.dirname(__filename);
11
+
12
+ const mode = 'production'
13
+ const dist_name = 'docs'
14
+
15
+ const html_minify = {
16
+ collapseWhitespace: true,
17
+ removeComments: true,
18
+ removeRedundantAttributes: true,
19
+ useShortDoctype: true,
20
+ removeEmptyAttributes: true,
21
+ removeStyleLinkTypeAttributes: true,
22
+ keepClosingSlash: true,
23
+ minifyJS: true,
24
+ minifyCSS: true,
25
+ minifyURLs: true
26
+ }
27
+
28
+ const HTMMLPlugin = []
29
+
30
+ const { localPathResult: AllHTMLLocalFile4xx } = filetool.getAllFilePaths(path.resolve(__dirname, 'src/html/error/4xx'))
31
+ AllHTMLLocalFile4xx.forEach((filePath) => {
32
+ if (!filePath.endsWith('.html')) {
33
+ return
34
+ }
35
+
36
+ if (filePath.includes('signal')) {
37
+ HTMMLPlugin.push(
38
+ new HtmlWebpackPlugin({
39
+ inject: 'body',
40
+ template: path.resolve(__dirname, 'src/html/error/4xx', filePath), //指定模板文件
41
+ filename: path.join('error/4xx', filePath),
42
+ chunks: ['signal'],
43
+ publicPath: '../../'
44
+ })
45
+ )
46
+ return
47
+ }
48
+
49
+ if (filePath.includes('404')) {
50
+ HTMMLPlugin.push(
51
+ new HtmlWebpackPlugin({
52
+ inject: 'body',
53
+ template: path.resolve(__dirname, 'src/html/error/4xx', filePath), //指定模板文件
54
+ filename: path.join('error/4xx', filePath),
55
+ chunks: ['common', 'err404'],
56
+ publicPath: '../../'
57
+ })
58
+ )
59
+ return
60
+ }
61
+
62
+ HTMMLPlugin.push(
63
+ new HtmlWebpackPlugin({
64
+ inject: 'body',
65
+ template: path.resolve(__dirname, 'src/html/error/4xx', filePath), //指定模板文件
66
+ filename: path.join('error/4xx', filePath),
67
+ chunks: ['common', 'err4xx'],
68
+ publicPath: '../../'
69
+ })
70
+ )
71
+ })
72
+
73
+ const { localPathResult: AllHTMLLocalFile5xx } = filetool.getAllFilePaths(path.resolve(__dirname, 'src/html/error/5xx'))
74
+ AllHTMLLocalFile5xx.forEach((filePath) => {
75
+ if (!filePath.endsWith('.html')) {
76
+ return
77
+ }
78
+
79
+ if (filePath.includes('signal')) {
80
+ HTMMLPlugin.push(
81
+ new HtmlWebpackPlugin({
82
+ inject: 'body',
83
+ template: path.resolve(__dirname, 'src/html/error/5xx', filePath), //指定模板文件
84
+ filename: path.join('error/5xx', filePath),
85
+ chunks: ['signal'],
86
+ publicPath: '../../'
87
+ })
88
+ )
89
+ return
90
+ }
91
+
92
+ HTMMLPlugin.push(
93
+ new HtmlWebpackPlugin({
94
+ inject: 'body',
95
+ template: path.resolve(__dirname, 'src/html/error/5xx', filePath), //指定模板文件
96
+ filename: path.join('error/5xx', filePath),
97
+ chunks: ['common', 'err5xx'],
98
+ publicPath: '../../'
99
+ })
100
+ )
101
+ })
102
+
103
+ const config = {
104
+ mode: mode,
105
+
106
+ context: __dirname,
107
+
108
+ performance: {
109
+ hints: 'warning', // 或者 'error',取决于你希望如何处理超出限制的情况
110
+ maxAssetSize: 5000000, // 设置单个资源的最大尺寸,例如5MB
111
+ maxEntrypointSize: 10000000 // 设置入口起点的最大尺寸,例如10MB
112
+ },
113
+
114
+ entry: {
115
+ common: path.resolve(__dirname, 'src/common.js'),
116
+ index: path.resolve(__dirname, 'src/index.js'),
117
+ signal: path.resolve(__dirname, 'src/signal.js'),
118
+ new: path.resolve(__dirname, 'src/new.js'),
119
+ license: path.resolve(__dirname, 'src/license.js'),
120
+ mitorg: path.resolve(__dirname, 'src/mitorg.js'),
121
+ err4xx: path.resolve(__dirname, 'src/4xx.js'),
122
+ err404: path.resolve(__dirname, 'src/404.js'),
123
+ err5xx: path.resolve(__dirname, 'src/5xx.js')
124
+ },
125
+
126
+ output: {
127
+ path: path.resolve(__dirname, dist_name), //打包后的文件存放的地方
128
+ filename: 'js/[name].[fullhash].bundle.js', //打包后输出文件的文件名
129
+ chunkFilename: '[name].bundle.js',
130
+ clean: true,
131
+ charset: true,
132
+ publicPath: '/'
133
+ },
134
+
135
+ resolve: {
136
+ alias: {
137
+ '@': path.join(__dirname, 'src')
138
+ }
139
+ },
140
+
141
+ optimization: {
142
+ minimize: true,
143
+ minimizer: [
144
+ new TerserPlugin({
145
+ terserOptions: {
146
+ compress: {
147
+ drop_console: true, // 移除console.log (Github/发布版专属)
148
+ drop_debugger: true // 移除debugger (Github/发布版专属)
149
+ }
150
+ }
151
+ })
152
+ ]
153
+ },
154
+
155
+ module: {
156
+ rules: [
157
+ {
158
+ test: /\.(css|scss|sass)$/,
159
+ use: [MiniCssExtractPlugin.loader, 'css-loader', 'postcss-loader', 'sass-loader']
160
+ },
161
+ {
162
+ test: /\.(png|jpg|jpeg|svg|gif)$/i,
163
+ use: [
164
+ {
165
+ loader: 'url-loader',
166
+ options: {
167
+ limit: 8192, // 8KB 以下的文件将被转换为 Data URL
168
+ fallback: 'file-loader',
169
+ outputPath: 'images', // 类似于 file-loader 的配置
170
+ name: '[name].[fullhash].[ext]'
171
+ }
172
+ }
173
+ ]
174
+ },
175
+ {
176
+ test: /\.(mp4|m4v|avi|mov|qt|wmv|mkv|flv|webm|mpeg|mpg|3gp|3g2)$/i,
177
+ use: [
178
+ {
179
+ loader: 'url-loader',
180
+ options: {
181
+ limit: 8192, // 8KB 以下的文件将被转换为 Data URL
182
+ fallback: 'file-loader',
183
+ outputPath: 'videos', // 类似于 file-loader 的配置
184
+ name: '[name].[fullhash].[ext]'
185
+ }
186
+ }
187
+ ]
188
+ },
189
+ {
190
+ test: /\.(woff|woff2|eot|ttf|otf)$/i,
191
+ use: [
192
+ {
193
+ loader: 'url-loader',
194
+ options: {
195
+ limit: 8192, // 8KB 以下的文件将被转换为 Data URL
196
+ fallback: 'file-loader',
197
+ outputPath: 'fonts', // 类似于 file-loader 的配置
198
+ name: '[name].[fullhash].[ext]'
199
+ }
200
+ }
201
+ ]
202
+ },
203
+ {
204
+ test: /\.html$/i,
205
+ loader: 'html-loader'
206
+ },
207
+ ]
208
+ },
209
+
210
+ plugins: [
211
+ new CopyWebpackPlugin({
212
+ patterns: [
213
+ { from: 'public', to: './' },
214
+ { from: './config.json', to: './SH_CONFIG.json' },
215
+ { from: './LICENSE', to: './' },
216
+ { from: './LICENSE_CN', to: './' }
217
+ ]
218
+ }),
219
+ ...HTMMLPlugin,
220
+ new HtmlWebpackPlugin({
221
+ inject: 'body',
222
+ template: path.resolve(__dirname, 'src', 'html', 'index.html'), //指定模板文件
223
+ filename: 'index.html',
224
+ chunks: ['common', 'index'],
225
+ minify: html_minify,
226
+ publicPath: './'
227
+ }),
228
+ new HtmlWebpackPlugin({
229
+ inject: 'body',
230
+ template: path.resolve(__dirname, 'src', 'html', 'LICENSE_US.html'), //指定模板文件
231
+ filename: 'LICENSE_US.html',
232
+ chunks: ['common', 'license'],
233
+ minify: html_minify,
234
+ publicPath: './'
235
+ }),
236
+ new HtmlWebpackPlugin({
237
+ inject: 'body',
238
+ template: path.resolve(__dirname, 'src', 'html', 'LICENSE_CN.html'), //指定模板文件
239
+ filename: 'LICENSE_CN.html',
240
+ chunks: ['common', 'license'],
241
+ minify: html_minify,
242
+ publicPath: './'
243
+ }),
244
+ new HtmlWebpackPlugin({
245
+ inject: 'body',
246
+ template: path.resolve(__dirname, 'src', 'html', 'mitorg.html'), //指定模板文件
247
+ filename: 'mitorg.html',
248
+ chunks: ['common', 'mitorg'],
249
+ minify: html_minify,
250
+ publicPath: './'
251
+ }),
252
+ new HtmlWebpackPlugin({
253
+ inject: 'body',
254
+ template: path.resolve(__dirname, 'src', 'html', 'index.new.signal.html'), //指定模板文件
255
+ filename: 'index.new.signal.html',
256
+ chunks: ['common', 'new', 'signal'], // 此signal要设置common
257
+ minify: html_minify,
258
+ publicPath: './'
259
+ }),
260
+ new HtmlWebpackPlugin({
261
+ inject: 'body',
262
+ template: path.resolve(__dirname, 'src', 'html', 'index.new.html'), //指定模板文件
263
+ filename: 'index.new.html',
264
+ chunks: ['common', 'new'],
265
+ minify: html_minify,
266
+ publicPath: './'
267
+ }),
268
+ new HtmlWebpackPlugin({
269
+ inject: 'body',
270
+ template: path.resolve(__dirname, 'src/html/error/4xx/404.signal.html'), //指定模板文件
271
+ filename: '404.html',
272
+ chunks: ['common', 'signal'], // 此signal要设置common
273
+ minify: html_minify,
274
+ publicPath: './'
275
+ }),
276
+ new MiniCssExtractPlugin({
277
+ filename: 'style/[name].[hash].bundle.css',
278
+ chunkFilename: 'css/[id].bundle.css'
279
+ })
280
+ ],
281
+
282
+ devServer: {
283
+ static: {
284
+ directory: path.join(__dirname, dist_name)
285
+ },
286
+ compress: true,
287
+ port: 1001,
288
+ open: true,
289
+ hot: false
290
+ }
291
+ }
292
+
293
+ export default config
@@ -0,0 +1,278 @@
1
+ import path from "path"
2
+ import HtmlWebpackPlugin from "html-webpack-plugin";
3
+ import MiniCssExtractPlugin from 'mini-css-extract-plugin';
4
+ import CopyWebpackPlugin from "copy-webpack-plugin"
5
+ import filetool from './src/utils/file.js'
6
+ import { fileURLToPath } from 'url';
7
+
8
+ const __filename = fileURLToPath(import.meta.url);
9
+ const __dirname = path.dirname(__filename);
10
+
11
+ const mode = 'production'
12
+ const dist_name = 'dist-prod'
13
+
14
+ const html_minify = {
15
+ collapseWhitespace: true,
16
+ removeComments: true,
17
+ removeRedundantAttributes: true,
18
+ useShortDoctype: true,
19
+ removeEmptyAttributes: true,
20
+ removeStyleLinkTypeAttributes: true,
21
+ keepClosingSlash: true,
22
+ minifyJS: true,
23
+ minifyCSS: true,
24
+ minifyURLs: true
25
+ }
26
+
27
+ const HTMMLPlugin = []
28
+
29
+ const { localPathResult: AllHTMLLocalFile4xx } = filetool.getAllFilePaths(path.resolve(__dirname, 'src/html/error/4xx'))
30
+ AllHTMLLocalFile4xx.forEach((filePath) => {
31
+ if (!filePath.endsWith('.html')) {
32
+ return
33
+ }
34
+
35
+ if (filePath.includes('signal.html')) {
36
+ HTMMLPlugin.push(
37
+ new HtmlWebpackPlugin({
38
+ inject: 'body',
39
+ template: path.resolve(__dirname, 'src/html/error/4xx', filePath), //指定模板文件
40
+ filename: path.join('error/4xx', filePath),
41
+ chunks: ['signal'],
42
+ publicPath: '../../'
43
+ })
44
+ )
45
+ return
46
+ }
47
+
48
+ if (filePath.includes('400.html')) {
49
+ HTMMLPlugin.push(
50
+ new HtmlWebpackPlugin({
51
+ inject: 'body',
52
+ template: path.resolve(__dirname, 'src/html/error/4xx', filePath), //指定模板文件
53
+ filename: path.join('error/4xx', filePath),
54
+ chunks: ['common', 'err404'],
55
+ publicPath: '../../'
56
+ })
57
+ )
58
+ return
59
+ }
60
+
61
+ HTMMLPlugin.push(
62
+ new HtmlWebpackPlugin({
63
+ inject: 'body',
64
+ template: path.resolve(__dirname, 'src/html/error/4xx', filePath), //指定模板文件
65
+ filename: path.join('error/4xx', filePath),
66
+ chunks: ['common', 'err4xx'],
67
+ publicPath: '../../'
68
+ })
69
+ )
70
+ })
71
+
72
+ const { localPathResult: AllHTMLLocalFile5xx } = filetool.getAllFilePaths(path.resolve(__dirname, 'src/html/error/5xx'))
73
+ AllHTMLLocalFile5xx.forEach((filePath) => {
74
+ if (!filePath.endsWith('.html')) {
75
+ return
76
+ }
77
+
78
+ if (filePath.includes('signal.html')) {
79
+ HTMMLPlugin.push(
80
+ new HtmlWebpackPlugin({
81
+ inject: 'body',
82
+ template: path.resolve(__dirname, 'src/html/error/5xx', filePath), //指定模板文件
83
+ filename: path.join('error/5xx', filePath),
84
+ chunks: ['signal'],
85
+ publicPath: '../../'
86
+ })
87
+ )
88
+ return
89
+ }
90
+
91
+ HTMMLPlugin.push(
92
+ new HtmlWebpackPlugin({
93
+ inject: 'body',
94
+ template: path.resolve(__dirname, 'src/html/error/5xx', filePath), //指定模板文件
95
+ filename: path.join('error/5xx', filePath),
96
+ chunks: ['common', 'err5xx'],
97
+ publicPath: '../../'
98
+ })
99
+ )
100
+ })
101
+
102
+ const config = {
103
+ mode: mode,
104
+
105
+ context: __dirname,
106
+
107
+ performance: {
108
+ hints: 'warning', // 或者 'error',取决于你希望如何处理超出限制的情况
109
+ maxAssetSize: 5000000, // 设置单个资源的最大尺寸,例如5MB
110
+ maxEntrypointSize: 10000000 // 设置入口起点的最大尺寸,例如10MB
111
+ },
112
+
113
+ entry: {
114
+ common: path.resolve(__dirname, 'src/common.js'),
115
+ index: path.resolve(__dirname, 'src/index.js'),
116
+ signal: path.resolve(__dirname, 'src/signal.js'),
117
+ new: path.resolve(__dirname, 'src/new.js'),
118
+ license: path.resolve(__dirname, 'src/license.js'),
119
+ mitorg: path.resolve(__dirname, 'src/mitorg.js'),
120
+ err4xx: path.resolve(__dirname, 'src/4xx.js'),
121
+ err404: path.resolve(__dirname, 'src/404.js'),
122
+ err5xx: path.resolve(__dirname, 'src/5xx.js')
123
+ },
124
+
125
+ output: {
126
+ path: path.resolve(__dirname, dist_name), //打包后的文件存放的地方
127
+ filename: 'js/[name].[fullhash].bundle.js', //打包后输出文件的文件名
128
+ chunkFilename: '[name].bundle.js',
129
+ clean: true,
130
+ charset: true,
131
+ publicPath: '/'
132
+ },
133
+
134
+ resolve: {
135
+ alias: {
136
+ '@': path.join(__dirname, 'src')
137
+ }
138
+ },
139
+
140
+ module: {
141
+ rules: [
142
+ {
143
+ test: /\.(css|scss|sass)$/,
144
+ use: [MiniCssExtractPlugin.loader, 'css-loader', 'postcss-loader', 'sass-loader']
145
+ },
146
+ {
147
+ test: /\.(png|jpg|jpeg|svg|gif)$/i,
148
+ use: [
149
+ {
150
+ loader: 'url-loader',
151
+ options: {
152
+ limit: 8192, // 8KB 以下的文件将被转换为 Data URL
153
+ fallback: 'file-loader',
154
+ outputPath: 'images', // 类似于 file-loader 的配置
155
+ name: '[name].[fullhash].[ext]'
156
+ }
157
+ }
158
+ ]
159
+ },
160
+ {
161
+ test: /\.(mp4|m4v|avi|mov|qt|wmv|mkv|flv|webm|mpeg|mpg|3gp|3g2)$/i,
162
+ use: [
163
+ {
164
+ loader: 'url-loader',
165
+ options: {
166
+ limit: 8192, // 8KB 以下的文件将被转换为 Data URL
167
+ fallback: 'file-loader',
168
+ outputPath: 'videos', // 类似于 file-loader 的配置
169
+ name: '[name].[fullhash].[ext]'
170
+ }
171
+ }
172
+ ]
173
+ },
174
+ {
175
+ test: /\.(woff|woff2|eot|ttf|otf)$/i,
176
+ use: [
177
+ {
178
+ loader: 'url-loader',
179
+ options: {
180
+ limit: 8192, // 8KB 以下的文件将被转换为 Data URL
181
+ fallback: 'file-loader',
182
+ outputPath: 'fonts', // 类似于 file-loader 的配置
183
+ name: '[name].[fullhash].[ext]'
184
+ }
185
+ }
186
+ ]
187
+ },
188
+ {
189
+ test: /\.html$/i,
190
+ loader: 'html-loader'
191
+ }
192
+ ]
193
+ },
194
+
195
+ plugins: [
196
+ new CopyWebpackPlugin({
197
+ patterns: [
198
+ { from: 'public', to: './' },
199
+ { from: './config.json', to: './SH_CONFIG.json' },
200
+ { from: './LICENSE', to: './' },
201
+ { from: './LICENSE_CN', to: './' }
202
+ ]
203
+ }),
204
+ ...HTMMLPlugin,
205
+ new HtmlWebpackPlugin({
206
+ inject: 'body',
207
+ template: path.resolve(__dirname, 'src', 'html', 'index.html'), //指定模板文件
208
+ filename: 'index.html',
209
+ chunks: ['common', 'index'],
210
+ minify: html_minify,
211
+ publicPath: './'
212
+ }),
213
+ new HtmlWebpackPlugin({
214
+ inject: 'body',
215
+ template: path.resolve(__dirname, 'src', 'html', 'LICENSE_US.html'), //指定模板文件
216
+ filename: 'LICENSE_US.html',
217
+ chunks: ['common', 'license'],
218
+ minify: html_minify,
219
+ publicPath: './'
220
+ }),
221
+ new HtmlWebpackPlugin({
222
+ inject: 'body',
223
+ template: path.resolve(__dirname, 'src/html/LICENSE_CN.html'), //指定模板文件
224
+ filename: 'LICENSE_CN.html',
225
+ chunks: ['common', 'license'],
226
+ minify: html_minify,
227
+ publicPath: './'
228
+ }),
229
+ new HtmlWebpackPlugin({
230
+ inject: 'body',
231
+ template: path.resolve(__dirname, 'src', 'html', 'mitorg.html'), //指定模板文件
232
+ filename: 'mitorg.html',
233
+ chunks: ['common', 'mitorg'],
234
+ minify: html_minify,
235
+ publicPath: './'
236
+ }),
237
+ new HtmlWebpackPlugin({
238
+ inject: 'body',
239
+ template: path.resolve(__dirname, 'src', 'html', 'index.new.signal.html'), //指定模板文件
240
+ filename: 'index.new.signal.html',
241
+ chunks: ['common', 'new', 'signal'], // 此signal要设置common
242
+ minify: html_minify,
243
+ publicPath: './'
244
+ }),
245
+ new HtmlWebpackPlugin({
246
+ inject: 'body',
247
+ template: path.resolve(__dirname, 'src', 'html', 'index.new.html'), //指定模板文件
248
+ filename: 'index.new.html',
249
+ chunks: ['common', 'new'],
250
+ minify: html_minify,
251
+ publicPath: './'
252
+ }),
253
+ new HtmlWebpackPlugin({
254
+ inject: 'body',
255
+ template: path.resolve(__dirname, 'src/html/error/4xx/404.signal.html'), //指定模板文件
256
+ filename: '404.html',
257
+ chunks: ['common', 'signal'], // 此signal要设置common
258
+ minify: html_minify,
259
+ publicPath: './'
260
+ }),
261
+ new MiniCssExtractPlugin({
262
+ filename: 'style/[name].[hash].bundle.css',
263
+ chunkFilename: 'css/[id].bundle.css'
264
+ })
265
+ ],
266
+
267
+ devServer: {
268
+ static: {
269
+ directory: path.join(__dirname, dist_name)
270
+ },
271
+ compress: true,
272
+ port: 1001,
273
+ open: true,
274
+ hot: true
275
+ }
276
+ }
277
+
278
+ export default config