@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.
Files changed (38) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/dist/js/modern/dev-tools/{dev-server-plugin.js → dev-middleware/dev-server-plugin.js} +1 -1
  3. package/dist/js/modern/{hmr-client → dev-tools/dev-middleware/hmr-client}/createSocketUrl.js +0 -0
  4. package/dist/js/modern/{hmr-client → dev-tools/dev-middleware/hmr-client}/index.js +0 -0
  5. package/dist/js/modern/dev-tools/dev-middleware/index.js +138 -0
  6. package/dist/js/modern/dev-tools/{socket-server.js → dev-middleware/socket-server.js} +0 -0
  7. package/dist/js/modern/dev-tools/https/index.js +1 -1
  8. package/dist/js/modern/dev-tools/register/index.js +103 -0
  9. package/dist/js/modern/server/dev-server.js +45 -142
  10. package/dist/js/modern/server/index.js +1 -8
  11. package/dist/js/node/dev-tools/{dev-server-plugin.js → dev-middleware/dev-server-plugin.js} +1 -1
  12. package/dist/js/node/{hmr-client → dev-tools/dev-middleware/hmr-client}/createSocketUrl.js +0 -0
  13. package/dist/js/node/{hmr-client → dev-tools/dev-middleware/hmr-client}/index.js +0 -0
  14. package/dist/js/node/dev-tools/dev-middleware/index.js +152 -0
  15. package/dist/js/node/dev-tools/{socket-server.js → dev-middleware/socket-server.js} +0 -0
  16. package/dist/js/node/dev-tools/https/index.js +1 -1
  17. package/dist/js/node/dev-tools/register/index.js +120 -0
  18. package/dist/js/node/server/dev-server.js +46 -145
  19. package/dist/js/node/server/index.js +1 -9
  20. package/dist/types/dev-tools/{dev-server-plugin.d.ts → dev-middleware/dev-server-plugin.d.ts} +1 -1
  21. package/dist/types/{hmr-client → dev-tools/dev-middleware/hmr-client}/createSocketUrl.d.ts +0 -0
  22. package/dist/types/{hmr-client → dev-tools/dev-middleware/hmr-client}/index.d.ts +0 -0
  23. package/dist/types/dev-tools/dev-middleware/index.d.ts +31 -0
  24. package/dist/types/dev-tools/{socket-server.d.ts → dev-middleware/socket-server.d.ts} +1 -1
  25. package/dist/types/dev-tools/https/index.d.ts +6 -1
  26. package/dist/types/dev-tools/mock/getMockData.d.ts +1 -1
  27. package/dist/types/dev-tools/mock/index.d.ts +1 -1
  28. package/dist/types/dev-tools/{babel/register.d.ts → register/index.d.ts} +0 -0
  29. package/dist/types/index.d.ts +2 -2
  30. package/dist/types/server/dev-server.d.ts +6 -14
  31. package/dist/types/server/index.d.ts +1 -1
  32. package/dist/types/types.d.ts +7 -6
  33. package/package.json +17 -11
  34. package/dist/js/modern/dev-tools/babel/register.js +0 -33
  35. package/dist/js/modern/server/dev-server-split.js +0 -43
  36. package/dist/js/node/dev-tools/babel/register.js +0 -49
  37. package/dist/js/node/server/dev-server-split.js +0 -57
  38. 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
@@ -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("../hmr-client")}?${host}${path}${port}`; // use a hook to add entries if available
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
@@ -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
+ }
@@ -1,6 +1,6 @@
1
1
  import * as devcert from 'devcert';
2
2
  export const genHttpsOptions = async userOptions => {
3
- const httpsOptions = userOptions === true ? {} : 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 SocketServer from "../dev-tools/socket-server";
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, "compiler", void 0);
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
- _defineProperty(this, "devMiddleware", void 0);
29
+ this.workDir = this.pwd; // set dev server options, like webpack-dev-server
34
30
 
35
- this.workDir = this.pwd; // set webpack compiler
31
+ this.dev = this.getDevOptions(options); // create dev middleware instance
36
32
 
37
- this.compiler = options.compiler; // set dev server options, like webpack-dev-server
38
-
39
- this.dev = this.getDevOptions(options);
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
- compiler,
60
- dev
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
- if (compiler) {
115
- // init socket server
116
- this.socketServer = new SocketServer(dev); // setup compiler in server, also add dev-middleware to handler static file in memory
117
-
118
- const devMiddlewareHandler = this.setupCompiler(compiler);
119
- this.addHandler(devMiddlewareHandler);
120
- } // after dev handler
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
- await super.onClose();
144
- await ((_this$watcher = this.watcher) === null || _this$watcher === void 0 ? void 0 : _this$watcher.close());
145
- await new Promise(resolve => {
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
- isClientCompiler(compiler) {
245
- const {
246
- target
247
- } = compiler.options; // if target not contains `node`, it's a client compiler
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
- if (options.apiOnly) {
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("../hmr-client")}?${host}${path}${port}`; // use a hook to add entries if available
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