@modern-js/server 1.4.4 → 1.4.7-canary.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 CHANGED
@@ -1,5 +1,19 @@
1
1
  # @modern-js/server
2
2
 
3
+ ## 1.4.6
4
+
5
+ ### Patch Changes
6
+
7
+ - a78e32d8: remove server hook when api only
8
+ - 59010b7a: rewrite server lifecycle, add unit test
9
+ - Updated dependencies [a78e32d8]
10
+ - Updated dependencies [e11eaafc]
11
+ - Updated dependencies [cbba492b]
12
+ - Updated dependencies [db43dce6]
13
+ - Updated dependencies [59010b7a]
14
+ - @modern-js/prod-server@1.0.2
15
+ - @modern-js/utils@1.3.4
16
+
3
17
  ## 1.4.4
4
18
 
5
19
  ### Patch Changes
@@ -0,0 +1,17 @@
1
+ import { HMR_SOCK_PATH } from '@modern-js/utils';
2
+ export const DEFAULT_DEV_OPTIONS = {
3
+ client: {
4
+ port: '8080',
5
+ overlay: false,
6
+ logging: 'none',
7
+ path: HMR_SOCK_PATH,
8
+ host: 'localhost'
9
+ },
10
+ https: false,
11
+ dev: {
12
+ writeToDisk: true
13
+ },
14
+ watch: true,
15
+ hot: true,
16
+ liveReload: true
17
+ };
@@ -37,11 +37,7 @@ export const createMockHandler = ({
37
37
  return next();
38
38
  }
39
39
 
40
- if (matched) {
41
- res.setHeader('Access-Control-Allow-Origin', '*');
42
- return matched.handler(context, next);
43
- } else {
44
- return next();
45
- }
40
+ res.setHeader('Access-Control-Allow-Origin', '*');
41
+ return matched.handler(context, next);
46
42
  };
47
43
  };
@@ -1,4 +1,5 @@
1
1
  import path from 'path';
2
+ import { fs } from '@modern-js/utils';
2
3
  import chokidar from 'chokidar';
3
4
  import { DependencyTree } from "./dependency-tree";
4
5
  import { StatsCache } from "./stats-cache";
@@ -27,7 +28,7 @@ export default class Watcher {
27
28
  cache.add(getWatchedFiles(watcher));
28
29
  });
29
30
  watcher.on('change', changed => {
30
- if (cache.isDiff(changed)) {
31
+ if (!fs.existsSync(changed) || cache.isDiff(changed)) {
31
32
  cache.refresh(changed);
32
33
  callback(changed);
33
34
  }
@@ -1,28 +1,43 @@
1
+ import { RUN_MODE } from '@modern-js/prod-server';
1
2
  import { ModernDevServer } from "./dev-server";
2
3
  export class ModernSSRDevServer extends ModernDevServer {
3
4
  prepareAPIHandler(_m, _) {
4
5
  return null;
5
6
  }
6
7
 
7
- async prepareWebHandler(extension) {
8
- return super.prepareWebHandler(extension);
8
+ filterRoutes(routes) {
9
+ return routes.filter(route => route.isSSR);
9
10
  }
10
11
 
11
- filterRoutes(routes) {
12
- return routes.filter(route => route.entryName);
12
+ async preServerInit() {
13
+ if (this.runMode === RUN_MODE.FULL) {
14
+ await super.preServerInit();
15
+ }
16
+ }
17
+
18
+ async emitRouteHook(_, _input) {
19
+ if (this.runMode === RUN_MODE.FULL) {
20
+ await super.emitRouteHook(_, _input);
21
+ }
13
22
  }
14
23
 
15
24
  }
16
25
  export class ModernAPIDevServer extends ModernDevServer {
17
- async prepareAPIHandler(mode, extension) {
18
- return super.prepareAPIHandler(mode, extension);
26
+ prepareWebHandler(_) {
27
+ return null;
19
28
  }
20
29
 
21
30
  filterRoutes(routes) {
22
31
  return routes.filter(route => route.isApi);
23
32
  }
24
33
 
25
- async preServerInit() {// noop
34
+ async preServerInit() {
35
+ if (this.runMode === RUN_MODE.FULL) {
36
+ await super.preServerInit();
37
+ }
38
+ }
39
+
40
+ async emitRouteHook(_, _input) {// empty
26
41
  }
27
42
 
28
43
  }
@@ -7,35 +7,20 @@ function _defineProperty(obj, key, value) { if (key in obj) { Object.definePrope
7
7
  import { createServer } from 'http';
8
8
  import path from 'path';
9
9
  import { createServer as createHttpsServer } from 'https';
10
- import { API_DIR, HMR_SOCK_PATH, SERVER_DIR, SHARED_DIR } from '@modern-js/utils';
10
+ import { API_DIR, SERVER_DIR, SHARED_DIR } from '@modern-js/utils';
11
11
  import webpackDevMiddleware from 'webpack-dev-middleware';
12
12
  import { createProxyHandler, ModernServer, AGGRED_DIR } from '@modern-js/prod-server';
13
+ import { DEFAULT_DEV_OPTIONS } from "../constants";
13
14
  import { createMockHandler } from "../dev-tools/mock";
14
15
  import SocketServer from "../dev-tools/socket-server";
15
16
  import DevServerPlugin from "../dev-tools/dev-server-plugin";
16
17
  import { createLaunchEditorHandler } from "../dev-tools/launch-editor";
17
18
  import { enableRegister } from "../dev-tools/babel/register";
18
19
  import Watcher from "../dev-tools/watcher";
19
- const DEFAULT_DEV_OPTIONS = {
20
- client: {
21
- port: '8080',
22
- overlay: false,
23
- logging: 'none',
24
- path: HMR_SOCK_PATH,
25
- host: 'localhost'
26
- },
27
- https: false,
28
- dev: {
29
- writeToDisk: true
30
- },
31
- watch: true,
32
- hot: true,
33
- liveReload: true
34
- };
35
20
  export class ModernDevServer extends ModernServer {
36
21
  constructor(options) {
37
- super(options);
38
- this.devProxyHandler = null;
22
+ super(options); // dev server should work in pwd
23
+
39
24
  this.mockHandler = null;
40
25
  this.dev = void 0;
41
26
  this.compiler = void 0;
@@ -46,27 +31,25 @@ export class ModernDevServer extends ModernServer {
46
31
 
47
32
  this.compiler = options.compiler; // set dev server options, like webpack-dev-server
48
33
 
49
- this.dev = typeof options.dev === 'boolean' ? DEFAULT_DEV_OPTIONS : _objectSpread(_objectSpread({}, DEFAULT_DEV_OPTIONS), options.dev);
34
+ this.dev = _objectSpread(_objectSpread({}, DEFAULT_DEV_OPTIONS), typeof options.dev === 'boolean' ? {} : options.dev);
50
35
  enableRegister(this.pwd, this.conf);
51
36
  } // Complete the preparation of services
52
37
 
53
38
 
54
- async init(runner) {
39
+ async onInit(runner) {
55
40
  var _conf$tools, _conf$tools$devServer;
56
41
 
57
42
  const {
58
43
  conf,
59
44
  pwd,
60
- compiler
45
+ compiler,
46
+ dev
61
47
  } = this; // mock handler
62
48
 
63
49
  this.mockHandler = createMockHandler({
64
50
  pwd
65
51
  });
66
52
  this.addHandler((ctx, next) => {
67
- ctx.res.setHeader('Access-Control-Allow-Origin', '*');
68
- ctx.res.setHeader('Access-Control-Allow-Credentials', 'false');
69
-
70
53
  if (this.mockHandler) {
71
54
  this.mockHandler(ctx, next);
72
55
  } else {
@@ -74,10 +57,10 @@ export class ModernDevServer extends ModernServer {
74
57
  }
75
58
  }); // dev proxy handler, each proxy has own handler
76
59
 
77
- this.devProxyHandler = createProxyHandler((_conf$tools = conf.tools) === null || _conf$tools === void 0 ? void 0 : (_conf$tools$devServer = _conf$tools.devServer) === null || _conf$tools$devServer === void 0 ? void 0 : _conf$tools$devServer.proxy);
60
+ const proxyHandlers = createProxyHandler((_conf$tools = conf.tools) === null || _conf$tools === void 0 ? void 0 : (_conf$tools$devServer = _conf$tools.devServer) === null || _conf$tools$devServer === void 0 ? void 0 : _conf$tools$devServer.proxy);
78
61
 
79
- if (this.devProxyHandler) {
80
- this.devProxyHandler.forEach(handler => {
62
+ if (proxyHandlers) {
63
+ proxyHandlers.forEach(handler => {
81
64
  this.addHandler(handler);
82
65
  });
83
66
  } // do webpack build / plugin apply / socket server when pass compiler instance
@@ -85,7 +68,7 @@ export class ModernDevServer extends ModernServer {
85
68
 
86
69
  if (compiler) {
87
70
  // init socket server
88
- this.socketServer = new SocketServer(this.dev); // open file in edtor.
71
+ this.socketServer = new SocketServer(dev); // open file in edtor.
89
72
 
90
73
  this.addHandler(createLaunchEditorHandler()); // setup compiler in server, also add dev-middleware to handler static file in memory
91
74
 
@@ -93,32 +76,17 @@ export class ModernDevServer extends ModernServer {
93
76
  this.addHandler(devMiddlewareHandler);
94
77
  }
95
78
 
96
- await super.init(runner); // watch mock/ server/ api/ dir file change
79
+ await super.onInit(runner); // watch mock/ server/ api/ dir file change
97
80
 
98
- if (this.dev.watch) {
81
+ if (dev.watch) {
99
82
  this.startWatcher();
100
83
  }
101
84
  }
102
85
 
103
- ready(options = {}) {
104
- // reset the routing management instance every times the service starts
105
- this.router.reset(this.filterRoutes(options.routes || this.presetRoutes || []));
106
- this.cleanSSRCache(); // reset static file
107
-
108
- this.reader.updateFile();
109
- this.runner.reset();
110
- }
111
-
112
- onListening(app) {
86
+ async onClose() {
113
87
  var _this$socketServer;
114
88
 
115
- (_this$socketServer = this.socketServer) === null || _this$socketServer === void 0 ? void 0 : _this$socketServer.prepare(app);
116
- }
117
-
118
- async close() {
119
- var _this$socketServer2;
120
-
121
- super.close();
89
+ await super.onClose();
122
90
  await this.watcher.close();
123
91
  await new Promise(resolve => {
124
92
  if (this.devMiddleware) {
@@ -129,7 +97,28 @@ export class ModernDevServer extends ModernServer {
129
97
  resolve();
130
98
  }
131
99
  });
132
- (_this$socketServer2 = this.socketServer) === null || _this$socketServer2 === void 0 ? void 0 : _this$socketServer2.close();
100
+ (_this$socketServer = this.socketServer) === null || _this$socketServer === void 0 ? void 0 : _this$socketServer.close();
101
+ }
102
+
103
+ onRepack(options = {}) {
104
+ // reset the routing management instance every times the service starts
105
+ if (Array.isArray(options.routes)) {
106
+ this.router.reset(this.filterRoutes(options.routes));
107
+ } // clean ssr bundle cache
108
+
109
+
110
+ this.cleanSSRCache(); // reset static file
111
+
112
+ this.reader.updateFile(); // emit reset hook
113
+
114
+ this.runner.reset();
115
+ super.onRepack(options);
116
+ }
117
+
118
+ onListening(app) {
119
+ var _this$socketServer2;
120
+
121
+ (_this$socketServer2 = this.socketServer) === null || _this$socketServer2 === void 0 ? void 0 : _this$socketServer2.prepare(app);
133
122
  }
134
123
 
135
124
  async createHTTPServer(handler) {
@@ -150,7 +139,34 @@ export class ModernDevServer extends ModernServer {
150
139
  }
151
140
  }
152
141
 
153
- warmupSSRBundle() {// empty
142
+ warmupSSRBundle() {// not warmup ssr bundle on development
143
+ }
144
+
145
+ onServerChange({
146
+ filepath
147
+ }) {
148
+ const {
149
+ pwd
150
+ } = this;
151
+ const {
152
+ mock
153
+ } = AGGRED_DIR;
154
+ const mockPath = path.normalize(path.join(pwd, mock));
155
+ this.runner.reset();
156
+
157
+ if (filepath.startsWith(mockPath)) {
158
+ this.mockHandler = createMockHandler({
159
+ pwd
160
+ });
161
+ } else {
162
+ try {
163
+ super.onServerChange({
164
+ filepath
165
+ });
166
+ } catch (e) {
167
+ this.logger.error(e);
168
+ }
169
+ }
154
170
  } // set up plugin to each compiler
155
171
  // register hooks for each compilation, update socket stats if recompiled
156
172
  // start dev middleware
@@ -201,8 +217,8 @@ export class ModernDevServer extends ModernServer {
201
217
  if (stats.toJson({
202
218
  all: false
203
219
  }).name === 'client') {
204
- this.ready({
205
- routes: this.readRouteSpec()
220
+ this.onRepack({
221
+ routes: this.getRoutes()
206
222
  });
207
223
  }
208
224
  });
@@ -253,7 +269,6 @@ export class ModernDevServer extends ModernServer {
253
269
  } = AGGRED_DIR;
254
270
  const defaultWatched = [`${mock}/**/*`, `${SERVER_DIR}/**/*`, `${API_DIR}/**`, `${SHARED_DIR}/**/*`];
255
271
  const defaultWatchedPaths = defaultWatched.map(p => path.normalize(path.join(pwd, p)));
256
- const mockPath = path.normalize(path.join(pwd, mock));
257
272
  const watcher = new Watcher();
258
273
  watcher.createDepTree(); // 监听文件变动,如果有变动则给 client,也就是 start 启动的插件发消息
259
274
 
@@ -264,19 +279,9 @@ export class ModernDevServer extends ModernServer {
264
279
  }, filepath => {
265
280
  watcher.updateDepTree();
266
281
  watcher.cleanDepCache(filepath);
267
- this.runner.reset();
268
-
269
- if (filepath.startsWith(mockPath)) {
270
- this.mockHandler = createMockHandler({
271
- pwd
272
- });
273
- } else {
274
- try {
275
- this.prepareFrameHandler();
276
- } catch (e) {
277
- this.logger.error(e);
278
- }
279
- }
282
+ this.onServerChange({
283
+ filepath
284
+ });
280
285
  });
281
286
  this.watcher = watcher;
282
287
  }
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.DEFAULT_DEV_OPTIONS = void 0;
7
+
8
+ var _utils = require("@modern-js/utils");
9
+
10
+ const DEFAULT_DEV_OPTIONS = {
11
+ client: {
12
+ port: '8080',
13
+ overlay: false,
14
+ logging: 'none',
15
+ path: _utils.HMR_SOCK_PATH,
16
+ host: 'localhost'
17
+ },
18
+ https: false,
19
+ dev: {
20
+ writeToDisk: true
21
+ },
22
+ watch: true,
23
+ hot: true,
24
+ liveReload: true
25
+ };
26
+ exports.DEFAULT_DEV_OPTIONS = DEFAULT_DEV_OPTIONS;
@@ -54,12 +54,8 @@ const createMockHandler = ({
54
54
  return next();
55
55
  }
56
56
 
57
- if (matched) {
58
- res.setHeader('Access-Control-Allow-Origin', '*');
59
- return matched.handler(context, next);
60
- } else {
61
- return next();
62
- }
57
+ res.setHeader('Access-Control-Allow-Origin', '*');
58
+ return matched.handler(context, next);
63
59
  };
64
60
  };
65
61
 
@@ -7,6 +7,8 @@ exports.getWatchedFiles = exports.default = void 0;
7
7
 
8
8
  var _path = _interopRequireDefault(require("path"));
9
9
 
10
+ var _utils = require("@modern-js/utils");
11
+
10
12
  var _chokidar = _interopRequireDefault(require("chokidar"));
11
13
 
12
14
  var _dependencyTree = require("./dependency-tree");
@@ -45,7 +47,7 @@ class Watcher {
45
47
  cache.add(getWatchedFiles(watcher));
46
48
  });
47
49
  watcher.on('change', changed => {
48
- if (cache.isDiff(changed)) {
50
+ if (!_utils.fs.existsSync(changed) || cache.isDiff(changed)) {
49
51
  cache.refresh(changed);
50
52
  callback(changed);
51
53
  }
@@ -5,6 +5,8 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.ModernSSRDevServer = exports.ModernAPIDevServer = void 0;
7
7
 
8
+ var _prodServer = require("@modern-js/prod-server");
9
+
8
10
  var _devServer = require("./dev-server");
9
11
 
10
12
  class ModernSSRDevServer extends _devServer.ModernDevServer {
@@ -12,12 +14,20 @@ class ModernSSRDevServer extends _devServer.ModernDevServer {
12
14
  return null;
13
15
  }
14
16
 
15
- async prepareWebHandler(extension) {
16
- return super.prepareWebHandler(extension);
17
+ filterRoutes(routes) {
18
+ return routes.filter(route => route.isSSR);
17
19
  }
18
20
 
19
- filterRoutes(routes) {
20
- return routes.filter(route => route.entryName);
21
+ async preServerInit() {
22
+ if (this.runMode === _prodServer.RUN_MODE.FULL) {
23
+ await super.preServerInit();
24
+ }
25
+ }
26
+
27
+ async emitRouteHook(_, _input) {
28
+ if (this.runMode === _prodServer.RUN_MODE.FULL) {
29
+ await super.emitRouteHook(_, _input);
30
+ }
21
31
  }
22
32
 
23
33
  }
@@ -25,15 +35,21 @@ class ModernSSRDevServer extends _devServer.ModernDevServer {
25
35
  exports.ModernSSRDevServer = ModernSSRDevServer;
26
36
 
27
37
  class ModernAPIDevServer extends _devServer.ModernDevServer {
28
- async prepareAPIHandler(mode, extension) {
29
- return super.prepareAPIHandler(mode, extension);
38
+ prepareWebHandler(_) {
39
+ return null;
30
40
  }
31
41
 
32
42
  filterRoutes(routes) {
33
43
  return routes.filter(route => route.isApi);
34
44
  }
35
45
 
36
- async preServerInit() {// noop
46
+ async preServerInit() {
47
+ if (this.runMode === _prodServer.RUN_MODE.FULL) {
48
+ await super.preServerInit();
49
+ }
50
+ }
51
+
52
+ async emitRouteHook(_, _input) {// empty
37
53
  }
38
54
 
39
55
  }