@modern-js/server 1.17.0 → 1.18.1-alpha.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.
- package/CHANGELOG.md +55 -0
- package/dist/js/modern/dev-tools/{dev-server-plugin.js → dev-middleware/dev-server-plugin.js} +1 -1
- package/dist/js/modern/{hmr-client → dev-tools/dev-middleware/hmr-client}/createSocketUrl.js +0 -0
- package/dist/js/modern/{hmr-client → dev-tools/dev-middleware/hmr-client}/index.js +0 -0
- package/dist/js/modern/dev-tools/dev-middleware/index.js +138 -0
- package/dist/js/modern/dev-tools/{socket-server.js → dev-middleware/socket-server.js} +0 -0
- package/dist/js/modern/dev-tools/https/index.js +1 -1
- package/dist/js/modern/dev-tools/register/index.js +103 -0
- package/dist/js/modern/server/dev-server.js +45 -142
- package/dist/js/modern/server/index.js +1 -8
- package/dist/js/node/dev-tools/{dev-server-plugin.js → dev-middleware/dev-server-plugin.js} +1 -1
- package/dist/js/node/{hmr-client → dev-tools/dev-middleware/hmr-client}/createSocketUrl.js +0 -0
- package/dist/js/node/{hmr-client → dev-tools/dev-middleware/hmr-client}/index.js +0 -0
- package/dist/js/node/dev-tools/dev-middleware/index.js +152 -0
- package/dist/js/node/dev-tools/{socket-server.js → dev-middleware/socket-server.js} +0 -0
- package/dist/js/node/dev-tools/https/index.js +1 -1
- package/dist/js/node/dev-tools/register/index.js +120 -0
- package/dist/js/node/server/dev-server.js +46 -145
- package/dist/js/node/server/index.js +1 -9
- package/dist/types/dev-tools/{dev-server-plugin.d.ts → dev-middleware/dev-server-plugin.d.ts} +1 -1
- package/dist/types/{hmr-client → dev-tools/dev-middleware/hmr-client}/createSocketUrl.d.ts +0 -0
- package/dist/types/{hmr-client → dev-tools/dev-middleware/hmr-client}/index.d.ts +0 -0
- package/dist/types/dev-tools/dev-middleware/index.d.ts +31 -0
- package/dist/types/dev-tools/{socket-server.d.ts → dev-middleware/socket-server.d.ts} +1 -1
- package/dist/types/dev-tools/https/index.d.ts +6 -1
- package/dist/types/dev-tools/mock/getMockData.d.ts +1 -1
- package/dist/types/dev-tools/mock/index.d.ts +1 -1
- package/dist/types/dev-tools/{babel/register.d.ts → register/index.d.ts} +0 -0
- package/dist/types/index.d.ts +2 -2
- package/dist/types/server/dev-server.d.ts +6 -14
- package/dist/types/server/index.d.ts +1 -1
- package/dist/types/types.d.ts +7 -6
- package/package.json +17 -11
- package/dist/js/modern/dev-tools/babel/register.js +0 -33
- package/dist/js/modern/server/dev-server-split.js +0 -43
- package/dist/js/node/dev-tools/babel/register.js +0 -49
- package/dist/js/node/server/dev-server-split.js +0 -57
- package/dist/types/server/dev-server-split.d.ts +0 -16
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,60 @@
|
|
|
1
1
|
# @modern-js/server
|
|
2
2
|
|
|
3
|
+
## 1.18.1-alpha.0
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 8016a8a: fix: invoke next() in dev-middleware directly if only api
|
|
8
|
+
fix: 在 api 服务的情况下,直接调用 next(),不执行 dev-middleware
|
|
9
|
+
- f6a3aa1: feat: support etag in dev server by default
|
|
10
|
+
feat: 开发环境默认支持 etag 功能
|
|
11
|
+
- 23fa468: fix: ssr bundle should not be compiled by ts-node
|
|
12
|
+
|
|
13
|
+
fix: ts-node 不应该编译 ssr bundle
|
|
14
|
+
|
|
15
|
+
- 55988fa: fix: fix dev server type error
|
|
16
|
+
fix: 修复 dev server 中的类型错误
|
|
17
|
+
- bc3bbd8: fix: use output.publicPath(default) as webpack-dev-middleware publicPath
|
|
18
|
+
|
|
19
|
+
fix: 使用 output.publicPath 作为 webpack-dev-middleware publicPath
|
|
20
|
+
|
|
21
|
+
- Updated dependencies [3586707]
|
|
22
|
+
- Updated dependencies [f6a3aa1]
|
|
23
|
+
- Updated dependencies [fb02c81]
|
|
24
|
+
- Updated dependencies [9f7bfa6]
|
|
25
|
+
- Updated dependencies [9fcfbd4]
|
|
26
|
+
- Updated dependencies [6c2c745]
|
|
27
|
+
- @modern-js/prod-server@1.18.1-alpha.0
|
|
28
|
+
- @modern-js/server-utils@1.18.1-alpha.0
|
|
29
|
+
- @modern-js/utils@1.18.1-alpha.0
|
|
30
|
+
|
|
31
|
+
## 1.18.0
|
|
32
|
+
|
|
33
|
+
### Patch Changes
|
|
34
|
+
|
|
35
|
+
- 3d5e3a5: chore: get api mode from bff core
|
|
36
|
+
chore: 从 bff core 中获取 api mode
|
|
37
|
+
- 8280920: chore(server): export DevServerOptions type
|
|
38
|
+
|
|
39
|
+
chore(server): 导出 DevServerOptions 类型
|
|
40
|
+
|
|
41
|
+
- 2b7406d: feat: use typescript instead of babel as typescript compiler in server
|
|
42
|
+
feat: 服务端,增加 typescript 作为 typescipt 编译器
|
|
43
|
+
- fc7214d: feat(server): export DevServerHttpsOptions type
|
|
44
|
+
|
|
45
|
+
feat(server): 导出 DevServerHttpsOptions 类型
|
|
46
|
+
|
|
47
|
+
- Updated dependencies [8280920]
|
|
48
|
+
- Updated dependencies [3d5e3a5]
|
|
49
|
+
- Updated dependencies [2b7406d]
|
|
50
|
+
- Updated dependencies [0a4d622]
|
|
51
|
+
- Updated dependencies [60a2e3a]
|
|
52
|
+
- Updated dependencies [5227370]
|
|
53
|
+
- Updated dependencies [7928bae]
|
|
54
|
+
- @modern-js/utils@1.18.0
|
|
55
|
+
- @modern-js/prod-server@1.18.0
|
|
56
|
+
- @modern-js/server-utils@1.18.0
|
|
57
|
+
|
|
3
58
|
## 1.17.0
|
|
4
59
|
|
|
5
60
|
### Patch Changes
|
package/dist/js/modern/dev-tools/{dev-server-plugin.js → dev-middleware/dev-server-plugin.js}
RENAMED
|
@@ -14,7 +14,7 @@ export default class DevServerPlugin {
|
|
|
14
14
|
const host = client.host ? `&host=${client.host}` : '';
|
|
15
15
|
const path = client.path ? `&path=${client.path}` : '';
|
|
16
16
|
const port = client.port ? `&port=${client.port}` : '';
|
|
17
|
-
const clientEntry = `${require.resolve("
|
|
17
|
+
const clientEntry = `${require.resolve("./hmr-client")}?${host}${path}${port}`; // use a hook to add entries if available
|
|
18
18
|
|
|
19
19
|
new compiler.webpack.EntryPlugin(compiler.context, clientEntry, {
|
|
20
20
|
name: undefined
|
package/dist/js/modern/{hmr-client → dev-tools/dev-middleware/hmr-client}/createSocketUrl.js
RENAMED
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
2
|
+
|
|
3
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
4
|
+
|
|
5
|
+
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
6
|
+
|
|
7
|
+
import { EventEmitter } from 'events';
|
|
8
|
+
import webpackDevMiddleware from '@modern-js/utils/webpack-dev-middleware';
|
|
9
|
+
import DevServerPlugin from "./dev-server-plugin";
|
|
10
|
+
import SocketServer from "./socket-server";
|
|
11
|
+
|
|
12
|
+
const noop = () => {// noop
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export default class DevMiddleware extends EventEmitter {
|
|
16
|
+
constructor({
|
|
17
|
+
compiler,
|
|
18
|
+
dev,
|
|
19
|
+
config
|
|
20
|
+
}) {
|
|
21
|
+
super();
|
|
22
|
+
|
|
23
|
+
_defineProperty(this, "middleware", void 0);
|
|
24
|
+
|
|
25
|
+
_defineProperty(this, "compiler", void 0);
|
|
26
|
+
|
|
27
|
+
_defineProperty(this, "devOptions", void 0);
|
|
28
|
+
|
|
29
|
+
_defineProperty(this, "socketServer", void 0);
|
|
30
|
+
|
|
31
|
+
_defineProperty(this, "config", void 0);
|
|
32
|
+
|
|
33
|
+
this.compiler = compiler;
|
|
34
|
+
this.devOptions = dev;
|
|
35
|
+
this.config = config; // init socket server
|
|
36
|
+
|
|
37
|
+
this.socketServer = new SocketServer(dev); // Todo: should remove after abstract dev middleware
|
|
38
|
+
|
|
39
|
+
if (this.compiler) {
|
|
40
|
+
// setup compiler in server, also add dev-middleware to handler static file in memory
|
|
41
|
+
// set up plugin to each compiler
|
|
42
|
+
this.setupDevServerPlugin(); // register hooks for each compilation, update socket stats if recompiled
|
|
43
|
+
|
|
44
|
+
this.setupHooks(); // start dev middleware
|
|
45
|
+
|
|
46
|
+
this.middleware = this.setupDevMiddleware();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
init(app) {
|
|
51
|
+
app.on('listening', () => {
|
|
52
|
+
this.socketServer.prepare(app);
|
|
53
|
+
});
|
|
54
|
+
app.on('close', async () => {
|
|
55
|
+
var _this$middleware;
|
|
56
|
+
|
|
57
|
+
(_this$middleware = this.middleware) === null || _this$middleware === void 0 ? void 0 : _this$middleware.close(noop);
|
|
58
|
+
this.socketServer.close();
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
setupDevServerPlugin() {
|
|
63
|
+
const {
|
|
64
|
+
devOptions
|
|
65
|
+
} = this; // apply dev server to client compiler, add hmr client to entry.
|
|
66
|
+
|
|
67
|
+
if (this.compiler.compilers) {
|
|
68
|
+
this.compiler.compilers.forEach(target => {
|
|
69
|
+
if (this.isClientCompiler(target)) {
|
|
70
|
+
new DevServerPlugin(devOptions).apply(target);
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
} else {
|
|
74
|
+
new DevServerPlugin(devOptions).apply(this.compiler);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
setupHooks() {
|
|
79
|
+
const invalidPlugin = () => {
|
|
80
|
+
this.socketServer.sockWrite('invalid');
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
const addHooks = compiler => {
|
|
84
|
+
if (compiler.name === 'server') {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const {
|
|
89
|
+
compile,
|
|
90
|
+
invalid,
|
|
91
|
+
done
|
|
92
|
+
} = compiler.hooks;
|
|
93
|
+
compile.tap('modern-dev-server', invalidPlugin);
|
|
94
|
+
invalid.tap('modern-dev-server', invalidPlugin);
|
|
95
|
+
done.tap('modern-dev-server', stats => {
|
|
96
|
+
this.socketServer.updateStats(stats);
|
|
97
|
+
this.emit('change', stats);
|
|
98
|
+
});
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
if (this.compiler.compilers) {
|
|
102
|
+
this.compiler.compilers.forEach(addHooks);
|
|
103
|
+
} else {
|
|
104
|
+
addHooks(this.compiler);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
setupDevMiddleware() {
|
|
109
|
+
var _config$tools, _config$tools$devServ;
|
|
110
|
+
|
|
111
|
+
const {
|
|
112
|
+
config,
|
|
113
|
+
devOptions
|
|
114
|
+
} = this;
|
|
115
|
+
const middleware = webpackDevMiddleware(this.compiler, _objectSpread({
|
|
116
|
+
headers: (_config$tools = config.tools) === null || _config$tools === void 0 ? void 0 : (_config$tools$devServ = _config$tools.devServer) === null || _config$tools$devServ === void 0 ? void 0 : _config$tools$devServ.headers,
|
|
117
|
+
stats: false
|
|
118
|
+
}, devOptions.devMiddleware));
|
|
119
|
+
return middleware;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
isClientCompiler(compiler) {
|
|
123
|
+
const {
|
|
124
|
+
target
|
|
125
|
+
} = compiler.options; // if target not contains `node`, it's a client compiler
|
|
126
|
+
|
|
127
|
+
if (target) {
|
|
128
|
+
if (Array.isArray(target)) {
|
|
129
|
+
return !target.includes('node');
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
return target !== 'node';
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
return compiler.name === 'client';
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
}
|
|
File without changes
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as devcert from 'devcert';
|
|
2
2
|
export const genHttpsOptions = async userOptions => {
|
|
3
|
-
const httpsOptions = userOptions ===
|
|
3
|
+
const httpsOptions = typeof userOptions === 'boolean' ? {} : userOptions;
|
|
4
4
|
|
|
5
5
|
if (!httpsOptions.key || !httpsOptions.cert) {
|
|
6
6
|
const selfsign = await devcert.certificateFor(['localhost']);
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
2
|
+
|
|
3
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
4
|
+
|
|
5
|
+
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
6
|
+
|
|
7
|
+
import path from 'path';
|
|
8
|
+
import { resolveBabelConfig } from '@modern-js/server-utils';
|
|
9
|
+
import { fs, getAlias, createDebugger } from '@modern-js/utils';
|
|
10
|
+
const debug = createDebugger('server');
|
|
11
|
+
|
|
12
|
+
const checkDep = (depName, paths) => {
|
|
13
|
+
let packagePath = '';
|
|
14
|
+
|
|
15
|
+
try {
|
|
16
|
+
packagePath = require.resolve(depName, {
|
|
17
|
+
paths
|
|
18
|
+
});
|
|
19
|
+
} catch (error) {}
|
|
20
|
+
|
|
21
|
+
return Boolean(packagePath);
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export const enableRegister = (projectRoot, config // eslint-disable-next-line consistent-return
|
|
25
|
+
) => {
|
|
26
|
+
const registerDirs = ['./api', './server', './config/mock', './shared'];
|
|
27
|
+
const TS_CONFIG_FILENAME = `tsconfig.json`;
|
|
28
|
+
const tsconfigPath = path.resolve(projectRoot, TS_CONFIG_FILENAME);
|
|
29
|
+
const isTsProject = fs.existsSync(tsconfigPath);
|
|
30
|
+
const existTsNode = checkDep('ts-node', [projectRoot]);
|
|
31
|
+
const existTsConfigPaths = checkDep('tsconfig-paths', [projectRoot]);
|
|
32
|
+
|
|
33
|
+
if (isTsProject && existTsNode && existTsConfigPaths) {
|
|
34
|
+
var _config$output;
|
|
35
|
+
|
|
36
|
+
debug('use ts-node');
|
|
37
|
+
const distPath = (config === null || config === void 0 ? void 0 : (_config$output = config.output) === null || _config$output === void 0 ? void 0 : _config$output.path) || 'dist';
|
|
38
|
+
|
|
39
|
+
const tsNode = require('ts-node');
|
|
40
|
+
|
|
41
|
+
const tsConfigPaths = require('tsconfig-paths');
|
|
42
|
+
|
|
43
|
+
const {
|
|
44
|
+
alias
|
|
45
|
+
} = config.source;
|
|
46
|
+
const aliasOption = getAlias(alias || {}, {
|
|
47
|
+
appDirectory: projectRoot,
|
|
48
|
+
tsconfigPath
|
|
49
|
+
});
|
|
50
|
+
const {
|
|
51
|
+
paths = {},
|
|
52
|
+
absoluteBaseUrl = './'
|
|
53
|
+
} = aliasOption;
|
|
54
|
+
const tsPaths = Object.keys(paths).reduce((o, key) => {
|
|
55
|
+
let tsPath = paths[key];
|
|
56
|
+
|
|
57
|
+
if (typeof tsPath === 'string' && path.isAbsolute(tsPath)) {
|
|
58
|
+
tsPath = path.relative(absoluteBaseUrl, tsPath);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
if (typeof tsPath === 'string') {
|
|
62
|
+
tsPath = [tsPath];
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return _objectSpread(_objectSpread({}, o), {}, {
|
|
66
|
+
[`${key}`]: tsPath
|
|
67
|
+
});
|
|
68
|
+
}, {});
|
|
69
|
+
tsConfigPaths.register({
|
|
70
|
+
baseUrl: absoluteBaseUrl || './',
|
|
71
|
+
paths: tsPaths
|
|
72
|
+
});
|
|
73
|
+
tsNode.register({
|
|
74
|
+
project: tsconfigPath,
|
|
75
|
+
// for env.d.ts, https://www.npmjs.com/package/ts-node#missing-types
|
|
76
|
+
files: true,
|
|
77
|
+
transpileOnly: true,
|
|
78
|
+
ignore: ['(?:^|/)node_modules/', `(?:^|/)${distPath}/bundles/`]
|
|
79
|
+
});
|
|
80
|
+
} else {
|
|
81
|
+
debug('use @babel/register');
|
|
82
|
+
const babelConfig = resolveBabelConfig(projectRoot, config, {
|
|
83
|
+
tsconfigPath,
|
|
84
|
+
syntax: 'es6+',
|
|
85
|
+
type: 'commonjs'
|
|
86
|
+
});
|
|
87
|
+
return require('@babel/register')(_objectSpread(_objectSpread({}, babelConfig), {}, {
|
|
88
|
+
only: [function (filePath) {
|
|
89
|
+
// TODO: wait params
|
|
90
|
+
// FIXME: 删除hardcode,根据 AppContext 中的 metaName 设置路径
|
|
91
|
+
if (filePath.includes(`node_modules${path.sep}.modern-js`)) {
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return registerDirs.some(registerDir => filePath.startsWith(path.join(projectRoot, registerDir)));
|
|
96
|
+
}],
|
|
97
|
+
extensions: ['.js', '.ts'],
|
|
98
|
+
babelrc: false,
|
|
99
|
+
configFile: false,
|
|
100
|
+
root: projectRoot
|
|
101
|
+
}));
|
|
102
|
+
}
|
|
103
|
+
};
|
|
@@ -8,14 +8,12 @@ import { createServer } from 'http';
|
|
|
8
8
|
import path from 'path';
|
|
9
9
|
import { createServer as createHttpsServer } from 'https';
|
|
10
10
|
import { API_DIR, SERVER_DIR, SHARED_DIR } from '@modern-js/utils';
|
|
11
|
-
import webpackDevMiddleware from '@modern-js/utils/webpack-dev-middleware';
|
|
12
11
|
import { createProxyHandler, ModernServer, AGGRED_DIR } from '@modern-js/prod-server';
|
|
13
12
|
import { getDefaultDevOptions } from "../constants";
|
|
14
13
|
import { createMockHandler } from "../dev-tools/mock";
|
|
15
|
-
import
|
|
16
|
-
import DevServerPlugin from "../dev-tools/dev-server-plugin";
|
|
17
|
-
import { enableRegister } from "../dev-tools/babel/register";
|
|
14
|
+
import { enableRegister } from "../dev-tools/register";
|
|
18
15
|
import Watcher, { mergeWatchOptions } from "../dev-tools/watcher";
|
|
16
|
+
import DevMiddleware from "../dev-tools/dev-middleware";
|
|
19
17
|
export class ModernDevServer extends ModernServer {
|
|
20
18
|
constructor(options) {
|
|
21
19
|
super(options); // dev server should work in pwd
|
|
@@ -24,19 +22,19 @@ export class ModernDevServer extends ModernServer {
|
|
|
24
22
|
|
|
25
23
|
_defineProperty(this, "dev", void 0);
|
|
26
24
|
|
|
27
|
-
_defineProperty(this, "
|
|
28
|
-
|
|
29
|
-
_defineProperty(this, "socketServer", void 0);
|
|
25
|
+
_defineProperty(this, "devMiddleware", void 0);
|
|
30
26
|
|
|
31
27
|
_defineProperty(this, "watcher", void 0);
|
|
32
28
|
|
|
33
|
-
|
|
29
|
+
this.workDir = this.pwd; // set dev server options, like webpack-dev-server
|
|
34
30
|
|
|
35
|
-
this.
|
|
31
|
+
this.dev = this.getDevOptions(options); // create dev middleware instance
|
|
36
32
|
|
|
37
|
-
this.
|
|
38
|
-
|
|
39
|
-
|
|
33
|
+
this.devMiddleware = new DevMiddleware({
|
|
34
|
+
dev: this.dev,
|
|
35
|
+
compiler: options.compiler,
|
|
36
|
+
config: this.conf
|
|
37
|
+
});
|
|
40
38
|
enableRegister(this.pwd, this.conf);
|
|
41
39
|
}
|
|
42
40
|
|
|
@@ -49,15 +47,15 @@ export class ModernDevServer extends ModernServer {
|
|
|
49
47
|
} // Complete the preparation of services
|
|
50
48
|
|
|
51
49
|
|
|
52
|
-
async onInit(runner) {
|
|
50
|
+
async onInit(runner, app) {
|
|
53
51
|
var _conf$tools, _conf$tools$devServer;
|
|
54
52
|
|
|
55
53
|
this.runner = runner;
|
|
56
54
|
const {
|
|
57
55
|
conf,
|
|
58
56
|
pwd,
|
|
59
|
-
|
|
60
|
-
|
|
57
|
+
dev,
|
|
58
|
+
devMiddleware
|
|
61
59
|
} = this; // before dev handler
|
|
62
60
|
|
|
63
61
|
const beforeHandlers = await this.setupBeforeDevMiddleware();
|
|
@@ -111,14 +109,29 @@ export class ModernDevServer extends ModernServer {
|
|
|
111
109
|
} // do webpack build / plugin apply / socket server when pass compiler instance
|
|
112
110
|
|
|
113
111
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
112
|
+
devMiddleware.init(app);
|
|
113
|
+
devMiddleware.on('change', stats => {
|
|
114
|
+
// Reset only when client compile done
|
|
115
|
+
if (stats.toJson({
|
|
116
|
+
all: false
|
|
117
|
+
}).name === 'client') {
|
|
118
|
+
this.onRepack({
|
|
119
|
+
routes: this.getRoutes()
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
this.addHandler((ctx, next) => {
|
|
124
|
+
const {
|
|
125
|
+
req,
|
|
126
|
+
res
|
|
127
|
+
} = ctx;
|
|
121
128
|
|
|
129
|
+
if (devMiddleware.middleware) {
|
|
130
|
+
devMiddleware.middleware(req, res, next);
|
|
131
|
+
} else {
|
|
132
|
+
next();
|
|
133
|
+
}
|
|
134
|
+
}); // after dev handler
|
|
122
135
|
|
|
123
136
|
const afterHandlers = await this.setupAfterDevMiddleware();
|
|
124
137
|
afterHandlers.forEach(handler => {
|
|
@@ -130,28 +143,16 @@ export class ModernDevServer extends ModernServer {
|
|
|
130
143
|
return handler(req, res, next);
|
|
131
144
|
});
|
|
132
145
|
});
|
|
133
|
-
await super.onInit(runner); // watch mock/ server/ api/ dir file change
|
|
146
|
+
await super.onInit(runner, app); // watch mock/ server/ api/ dir file change
|
|
134
147
|
|
|
135
148
|
if (dev.watch) {
|
|
136
149
|
this.startWatcher();
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
async onClose() {
|
|
141
|
-
var _this$watcher, _this$socketServer;
|
|
150
|
+
app.on('close', async () => {
|
|
151
|
+
var _this$watcher;
|
|
142
152
|
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
if (this.devMiddleware) {
|
|
147
|
-
this.devMiddleware.close(() => {
|
|
148
|
-
resolve();
|
|
149
|
-
});
|
|
150
|
-
} else {
|
|
151
|
-
resolve();
|
|
152
|
-
}
|
|
153
|
-
});
|
|
154
|
-
(_this$socketServer = this.socketServer) === null || _this$socketServer === void 0 ? void 0 : _this$socketServer.close();
|
|
153
|
+
await ((_this$watcher = this.watcher) === null || _this$watcher === void 0 ? void 0 : _this$watcher.close());
|
|
154
|
+
});
|
|
155
|
+
}
|
|
155
156
|
}
|
|
156
157
|
|
|
157
158
|
onRepack(options = {}) {
|
|
@@ -167,12 +168,6 @@ export class ModernDevServer extends ModernServer {
|
|
|
167
168
|
super.onRepack(options);
|
|
168
169
|
}
|
|
169
170
|
|
|
170
|
-
onListening(app) {
|
|
171
|
-
var _this$socketServer2;
|
|
172
|
-
|
|
173
|
-
(_this$socketServer2 = this.socketServer) === null || _this$socketServer2 === void 0 ? void 0 : _this$socketServer2.prepare(app);
|
|
174
|
-
}
|
|
175
|
-
|
|
176
171
|
async createHTTPServer(handler) {
|
|
177
172
|
const {
|
|
178
173
|
dev
|
|
@@ -230,104 +225,12 @@ export class ModernDevServer extends ModernServer {
|
|
|
230
225
|
this.logger.error(e);
|
|
231
226
|
}
|
|
232
227
|
}
|
|
233
|
-
} // set up plugin to each compiler
|
|
234
|
-
// register hooks for each compilation, update socket stats if recompiled
|
|
235
|
-
// start dev middleware
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
setupCompiler(compiler) {
|
|
239
|
-
this.setupDevServerPlugin(compiler);
|
|
240
|
-
this.setupHooks();
|
|
241
|
-
return this.setupDevMiddleware(compiler);
|
|
242
228
|
}
|
|
243
229
|
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
if (target) {
|
|
250
|
-
if (Array.isArray(target)) {
|
|
251
|
-
return !target.includes('node');
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
return target !== 'node';
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
return compiler.name === 'client';
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
setupDevServerPlugin(compiler) {
|
|
261
|
-
const {
|
|
262
|
-
dev: devConf
|
|
263
|
-
} = this; // apply dev server to client compiler, add hmr client to entry.
|
|
264
|
-
|
|
265
|
-
if (compiler.compilers) {
|
|
266
|
-
compiler.compilers.forEach(target => {
|
|
267
|
-
if (this.isClientCompiler(target)) {
|
|
268
|
-
new DevServerPlugin(devConf).apply(target);
|
|
269
|
-
}
|
|
270
|
-
});
|
|
271
|
-
} else {
|
|
272
|
-
new DevServerPlugin(devConf).apply(compiler);
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
setupHooks() {
|
|
277
|
-
const invalidPlugin = () => {
|
|
278
|
-
this.socketServer.sockWrite('invalid');
|
|
279
|
-
};
|
|
280
|
-
|
|
281
|
-
const addHooks = compiler => {
|
|
282
|
-
if (compiler.name === 'server') {
|
|
283
|
-
return;
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
const {
|
|
287
|
-
compile,
|
|
288
|
-
invalid,
|
|
289
|
-
done
|
|
290
|
-
} = compiler.hooks;
|
|
291
|
-
compile.tap('modern-dev-server', invalidPlugin);
|
|
292
|
-
invalid.tap('modern-dev-server', invalidPlugin);
|
|
293
|
-
done.tap('modern-dev-server', stats => {
|
|
294
|
-
this.socketServer.updateStats(stats); // Reset only when client compile done
|
|
295
|
-
|
|
296
|
-
if (stats.toJson({
|
|
297
|
-
all: false
|
|
298
|
-
}).name === 'client') {
|
|
299
|
-
this.onRepack({
|
|
300
|
-
routes: this.getRoutes()
|
|
301
|
-
});
|
|
302
|
-
}
|
|
303
|
-
});
|
|
304
|
-
};
|
|
305
|
-
|
|
306
|
-
if (this.compiler.compilers) {
|
|
307
|
-
this.compiler.compilers.forEach(addHooks);
|
|
308
|
-
} else {
|
|
309
|
-
addHooks(this.compiler);
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
setupDevMiddleware(compiler) {
|
|
314
|
-
var _conf$tools2, _conf$tools2$devServe;
|
|
315
|
-
|
|
316
|
-
const {
|
|
317
|
-
conf
|
|
318
|
-
} = this;
|
|
319
|
-
this.devMiddleware = webpackDevMiddleware(compiler, _objectSpread({
|
|
320
|
-
headers: (_conf$tools2 = conf.tools) === null || _conf$tools2 === void 0 ? void 0 : (_conf$tools2$devServe = _conf$tools2.devServer) === null || _conf$tools2$devServe === void 0 ? void 0 : _conf$tools2$devServe.headers,
|
|
321
|
-
publicPath: '/',
|
|
322
|
-
stats: false
|
|
323
|
-
}, this.dev.devMiddleware));
|
|
324
|
-
return (ctx, next) => {
|
|
325
|
-
const {
|
|
326
|
-
req,
|
|
327
|
-
res
|
|
328
|
-
} = ctx;
|
|
329
|
-
this.devMiddleware(req, res, next);
|
|
330
|
-
};
|
|
230
|
+
createContext(req, res) {
|
|
231
|
+
return super.createContext(req, res, {
|
|
232
|
+
etag: true
|
|
233
|
+
});
|
|
331
234
|
}
|
|
332
235
|
|
|
333
236
|
async setupBeforeDevMiddleware() {
|
|
@@ -1,15 +1,8 @@
|
|
|
1
1
|
import { Server } from '@modern-js/prod-server';
|
|
2
2
|
import { ModernDevServer } from "./dev-server";
|
|
3
|
-
import { ModernAPIDevServer, ModernSSRDevServer } from "./dev-server-split";
|
|
4
3
|
|
|
5
4
|
const createDevServer = options => {
|
|
6
|
-
|
|
7
|
-
return new ModernAPIDevServer(options);
|
|
8
|
-
} else if (options.ssrOnly) {
|
|
9
|
-
return new ModernSSRDevServer(options);
|
|
10
|
-
} else {
|
|
11
|
-
return new ModernDevServer(options);
|
|
12
|
-
}
|
|
5
|
+
return new ModernDevServer(options);
|
|
13
6
|
};
|
|
14
7
|
|
|
15
8
|
export class DevServer extends Server {
|
|
@@ -21,7 +21,7 @@ class DevServerPlugin {
|
|
|
21
21
|
const host = client.host ? `&host=${client.host}` : '';
|
|
22
22
|
const path = client.path ? `&path=${client.path}` : '';
|
|
23
23
|
const port = client.port ? `&port=${client.port}` : '';
|
|
24
|
-
const clientEntry = `${require.resolve("
|
|
24
|
+
const clientEntry = `${require.resolve("./hmr-client")}?${host}${path}${port}`; // use a hook to add entries if available
|
|
25
25
|
|
|
26
26
|
new compiler.webpack.EntryPlugin(compiler.context, clientEntry, {
|
|
27
27
|
name: undefined
|
|
File without changes
|
|
File without changes
|