Skip to content

Commit c938031

Browse files
committed
feature: webpack 5
1 parent ddc94ad commit c938031

File tree

13 files changed

+99
-90
lines changed

13 files changed

+99
-90
lines changed

.madrun.mjs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ const is20 = process.version.startsWith('v2');
1616
// https://stackoverflow.com/a/69746937/4536327
1717
const buildEnv = (is17 || is20) && {
1818
NODE_OPTIONS: '--openssl-legacy-provider',
19+
NODE_ENV: 'production',
1920
};
2021

2122
export default {
@@ -56,6 +57,7 @@ export default {
5657
'watch:test:server': async () => `nodemon -w client -w test/client -x ${await run('test:server')}`,
5758
'watch:coverage': async () => [testEnv, `nodemon -w server -w test -w common -x ${await cutEnv('coverage')}`],
5859
'build': async () => run('6to5:*'),
60+
'postbuild': () => 'node .webpack/cp.mjs',
5961
'build:dev': async () => run('build:client:dev'),
6062
'build:client': () => run('6to5:client'),
6163
'build:client:dev': () => run('6to5:client:dev'),

.webpack/cp.mjs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import {cpSync} from 'node:fs';
2+
3+
cpSync('./css/columns', './dist-dev/columns', {
4+
recursive: true,
5+
});
6+
7+
cpSync('./css/themes', './dist-dev/themes', {
8+
recursive: true,
9+
});
10+
11+
cpSync('./css/columns', './dist/columns', {
12+
recursive: true,
13+
});
14+
15+
cpSync('./css/themes', './dist/themes', {
16+
recursive: true,
17+
});

.webpack/css.js

Lines changed: 18 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,77 +1,39 @@
11
'use strict';
22

3-
const {env} = require('node:process');
4-
const fs = require('node:fs');
5-
const {
6-
basename,
7-
extname,
8-
join,
9-
} = require('node:path');
3+
const {env} = require('node:process')
104

11-
const ExtractTextPlugin = require('extract-text-webpack-plugin');
125
const OptimizeCssAssetsPlugin = require('optimize-css-assets-webpack-plugin');
6+
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
137

148
const isDev = env.NODE_ENV === 'development';
159

16-
const extractCSS = (a) => new ExtractTextPlugin(`${a}.css`);
17-
const extractMain = extractCSS('[name]');
18-
19-
const cssNames = [
20-
'nojs',
21-
'view',
22-
'config',
23-
'terminal',
24-
'user-menu',
25-
...getCSSList('columns'),
26-
...getCSSList('themes'),
27-
];
28-
29-
const cssPlugins = cssNames.map(extractCSS);
3010
const clean = (a) => a.filter(Boolean);
3111

3212
const plugins = clean([
33-
...cssPlugins,
34-
extractMain,
13+
new MiniCssExtractPlugin({
14+
filename: '[name].css',
15+
}),
3516
!isDev && new OptimizeCssAssetsPlugin(),
3617
]);
3718

3819
const rules = [{
39-
test: /\.css$/,
40-
exclude: /css\/(nojs|view|config|terminal|user-menu|columns.*|themes.*)\.css/,
41-
use: extractMain.extract(['css-loader']),
42-
}, ...cssPlugins.map(extract), {
43-
test: /\.(png|gif|svg|woff|woff2|eot|ttf)$/,
44-
use: {
45-
loader: 'url-loader',
20+
test: /\.css$/i,
21+
use: [MiniCssExtractPlugin.loader, {
22+
loader: "css-loader",
4623
options: {
47-
limit: 100_000,
24+
url: true,
4825
},
49-
},
50-
}];
26+
}],
27+
}, {
28+
test: /\.(png|gif|svg|woff|woff2|eot|ttf)$/,
29+
type: 'asset/inline',
30+
}]
31+
5132

5233
module.exports = {
5334
plugins,
54-
module: {
55-
rules,
56-
},
35+
module: {
36+
rules,
37+
},
5738
};
5839

59-
function getCSSList(dir) {
60-
const base = (a) => basename(a, extname(a));
61-
const addDir = (name) => `${dir}/${name}`;
62-
const rootDir = join(__dirname, '..');
63-
64-
return fs
65-
.readdirSync(`${rootDir}/css/${dir}`)
66-
.map(base)
67-
.map(addDir);
68-
}
69-
70-
function extract(extractPlugin) {
71-
const {filename} = extractPlugin;
72-
73-
return {
74-
test: RegExp(`css/${filename}`),
75-
use: extractPlugin.extract(['css-loader']),
76-
};
77-
}

.webpack/js.js

Lines changed: 51 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,17 @@ const {
77
} = require('node:path');
88

99
const {env} = require('node:process');
10-
const {EnvironmentPlugin} = require('webpack');
10+
const {
11+
EnvironmentPlugin,
12+
NormalModuleReplacementPlugin,
13+
} = require('webpack');
1114
const WebpackBar = require('webpackbar');
1215

13-
const ServiceWorkerWebpackPlugin = require('serviceworker-webpack-plugin');
14-
1516
const modules = './modules';
1617
const dirModules = './client/modules';
18+
const dirCss = './css';
19+
const dirThemes = `${dirCss}/themes`;
20+
const dirColumns = `${dirCss}/columns`;
1721
const dir = './client';
1822
const {NODE_ENV} = env;
1923
const isDev = NODE_ENV === 'development';
@@ -46,19 +50,43 @@ const rules = clean([
4650
]);
4751

4852
const plugins = [
53+
new NormalModuleReplacementPlugin(/^node:/, (resource) => {
54+
resource.request = resource.request.replace(/^node:/, '');
55+
}),
4956
new EnvironmentPlugin({
5057
NODE_ENV,
5158
}),
52-
new ServiceWorkerWebpackPlugin({
53-
entry: join(__dirname, '..', 'client', 'sw', 'sw.js'),
54-
excludes: ['*'],
55-
}),
5659
new WebpackBar(),
5760
];
5861

5962
const splitChunks = {
60-
name: 'cloudcmd.common',
6163
chunks: 'all',
64+
cacheGroups: {
65+
abcCommon: {
66+
name: 'cloudcmd.common',
67+
chunks: (chunk) => {
68+
const lazyChunks = [
69+
'nojs',
70+
'view',
71+
'edit',
72+
'terminal',
73+
'config',
74+
'user-menu',
75+
'help',
76+
'themes/dark',
77+
'themes/light',
78+
'columns/name-size',
79+
'columns/name-size-date',
80+
];
81+
82+
return !lazyChunks.includes(chunk.name);
83+
},
84+
minChunks: 1,
85+
enforce: true,
86+
priority: -1,
87+
reuseExistingChunk: true,
88+
},
89+
},
6290
};
6391

6492
module.exports = {
@@ -68,12 +96,27 @@ module.exports = {
6896
'node:process': 'process',
6997
'node:path': 'path',
7098
},
99+
fallback: {
100+
'path': require.resolve('path-browserify'),
101+
'process': require.resolve('process/browser'),
102+
},
71103
},
72104
devtool,
73105
optimization: {
74106
splitChunks,
75107
},
76108
entry: {
109+
'themes/dark': `${dirThemes}/dark.css`,
110+
'themes/light': `${dirThemes}/light.css`,
111+
'columns/name-size': `${dirColumns}/name-size.css`,
112+
'columns/name-size-date': `${dirColumns}/name-size-date.css`,
113+
'nojs': `${dirCss}/nojs.css`,
114+
help: `${dirCss}/help.css`,
115+
view: `${dirCss}/view.css`,
116+
config: `${dirCss}/config.css`,
117+
terminal: `${dirCss}/terminal.css`,
118+
'user-menu': `${dirCss}/user-menu.css`,
119+
sw: `${dir}/sw/sw.js`,
77120
cloudcmd: `${dir}/cloudcmd.js`,
78121
[`${modules}/edit`]: `${dirModules}/edit.js`,
79122
[`${modules}/edit-file`]: `${dirModules}/edit-file.js`,

client/client.js

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -138,17 +138,10 @@ function CloudCmdProto(DOM) {
138138

139139
await initModules();
140140
await baseInit();
141-
await loadStyle();
142141

143142
CloudCmd.route(location.hash);
144143
};
145144

146-
async function loadStyle() {
147-
const {prefix} = CloudCmd;
148-
const name = `${prefix}/dist/cloudcmd.common.css`;
149-
150-
await load.css(name);
151-
}
152145

153146
this.route = (path) => {
154147
const query = path.split('/');

client/cloudcmd.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
'use strict';
22

33
const process = require('node:process');
4-
require('./css');
4+
require('../css/main.css');
55

66
const wraptile = require('wraptile');
77
const load = require('load.js');

client/css.js

Lines changed: 0 additions & 8 deletions
This file was deleted.

client/modules/config/index.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,12 @@ module.exports.init = async () => {
5252

5353
showLoad();
5454

55-
const {prefix} = CloudCmd;
55+
const {DIR_DIST} = CloudCmd;
5656

5757
[Template] = await Promise.all([
5858
Files.get('config-tmpl'),
5959
loadSocket(),
60-
loadCSS(`${prefix}/dist/config.css`),
60+
loadCSS(`${DIR_DIST}/config.css`),
6161
CloudCmd.View(),
6262
]);
6363

css/main.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
@import url(./urls.css);
21
@import url(./reset.css);
2+
@import url(./urls.css);
33
@import url(./style.css);
44
@import url(./icons.css);
55
@import url(./help.css);

html/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
<meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
99
<link rel="icon" href="{{ prefix }}/favicon.ico">
1010

11-
<link rel=stylesheet href="{{ prefix }}/dist/cloudcmd.css">
11+
<link rel=stylesheet href="{{ prefix }}/dist/cloudcmd.common.css">
1212
<link rel="manifest" href="{{ prefix }}/public/manifest.json">
1313
<noscript>
1414
<link rel=stylesheet href="{{ prefix }}/dist/nojs.css">

0 commit comments

Comments
 (0)