@modern-js/server 2.0.0-beta.0 → 2.0.0-beta.2
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 +95 -0
- package/dist/js/modern/dev-tools/dev-middleware/dev-server-plugin.js +4 -9
- package/dist/js/modern/dev-tools/dev-middleware/hmr-client/createSocketUrl.js +2 -5
- package/dist/js/modern/dev-tools/dev-middleware/hmr-client/index.js +43 -50
- package/dist/js/modern/dev-tools/dev-middleware/index.js +14 -32
- package/dist/js/modern/dev-tools/dev-middleware/socket-server.js +18 -43
- package/dist/js/modern/dev-tools/https/index.js +0 -2
- package/dist/js/modern/dev-tools/mock/getMockData.js +4 -23
- package/dist/js/modern/dev-tools/mock/index.js +0 -8
- package/dist/js/modern/dev-tools/register/index.js +5 -20
- package/dist/js/modern/dev-tools/watcher/dependency-tree.js +5 -15
- package/dist/js/modern/dev-tools/watcher/index.js +0 -18
- package/dist/js/modern/dev-tools/watcher/stats-cache.js +0 -16
- package/dist/js/modern/index.js +0 -1
- package/dist/js/modern/server/dev-server.js +38 -56
- package/dist/js/modern/server/index.js +0 -4
- package/dist/js/node/constants.js +0 -3
- package/dist/js/node/dev-tools/dev-middleware/dev-server-plugin.js +4 -11
- package/dist/js/node/dev-tools/dev-middleware/hmr-client/createSocketUrl.js +2 -8
- package/dist/js/node/dev-tools/dev-middleware/hmr-client/index.js +41 -53
- package/dist/js/node/dev-tools/dev-middleware/index.js +14 -38
- package/dist/js/node/dev-tools/dev-middleware/socket-server.js +18 -48
- package/dist/js/node/dev-tools/https/index.js +0 -7
- package/dist/js/node/dev-tools/mock/getMockData.js +4 -29
- package/dist/js/node/dev-tools/mock/index.js +0 -17
- package/dist/js/node/dev-tools/register/index.js +5 -29
- package/dist/js/node/dev-tools/watcher/dependency-tree.js +5 -19
- package/dist/js/node/dev-tools/watcher/index.js +0 -32
- package/dist/js/node/dev-tools/watcher/stats-cache.js +0 -23
- package/dist/js/node/index.js +0 -4
- package/dist/js/node/server/dev-server.js +38 -75
- package/dist/js/node/server/index.js +0 -7
- package/dist/types/dev-tools/mock/getMockData.d.ts +0 -2
- package/dist/types/dev-tools/watcher/dependency-tree.d.ts +0 -2
- package/dist/types/index.d.ts +0 -2
- package/package.json +13 -14
|
@@ -4,16 +4,11 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.defaultIgnores = exports.DependencyTree = void 0;
|
|
7
|
-
|
|
8
7
|
var _minimatch = _interopRequireDefault(require("minimatch"));
|
|
9
|
-
|
|
10
8
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
11
|
-
|
|
12
9
|
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; }
|
|
13
|
-
|
|
14
10
|
const defaultIgnores = ['**/bower_components/**', '**/coverage/**', '**/node_modules/**', '**/.*/**', '**/*.d.ts', '**/*.log'];
|
|
15
11
|
exports.defaultIgnores = defaultIgnores;
|
|
16
|
-
|
|
17
12
|
/**
|
|
18
13
|
* `require.cache` already is a dependency tree, however require cache's
|
|
19
14
|
* `module.parent` is the module that first required. so we have to implement
|
|
@@ -22,26 +17,23 @@ exports.defaultIgnores = defaultIgnores;
|
|
|
22
17
|
class DependencyTree {
|
|
23
18
|
constructor() {
|
|
24
19
|
_defineProperty(this, "tree", void 0);
|
|
25
|
-
|
|
26
20
|
_defineProperty(this, "ignore", void 0);
|
|
27
|
-
|
|
28
21
|
this.tree = new Map();
|
|
29
22
|
this.ignore = [...defaultIgnores];
|
|
30
23
|
}
|
|
31
|
-
|
|
32
24
|
getNode(path) {
|
|
33
25
|
return this.tree.get(path);
|
|
34
26
|
}
|
|
27
|
+
|
|
35
28
|
/**
|
|
36
29
|
* update dependency tree
|
|
37
30
|
*
|
|
38
31
|
* @param cache
|
|
39
32
|
*/
|
|
40
|
-
|
|
41
|
-
|
|
42
33
|
update(cache) {
|
|
43
|
-
this.tree.clear();
|
|
34
|
+
this.tree.clear();
|
|
44
35
|
|
|
36
|
+
// insert all module that not ignored
|
|
45
37
|
Object.keys(cache).forEach(path => {
|
|
46
38
|
if (!this.shouldIgnore(path)) {
|
|
47
39
|
const module = cache[path];
|
|
@@ -51,8 +43,9 @@ class DependencyTree {
|
|
|
51
43
|
children: new Set()
|
|
52
44
|
});
|
|
53
45
|
}
|
|
54
|
-
});
|
|
46
|
+
});
|
|
55
47
|
|
|
48
|
+
// update treeNode parent and children
|
|
56
49
|
for (const treeNode of this.tree.values()) {
|
|
57
50
|
const {
|
|
58
51
|
parent
|
|
@@ -60,19 +53,15 @@ class DependencyTree {
|
|
|
60
53
|
const {
|
|
61
54
|
children
|
|
62
55
|
} = treeNode.module;
|
|
63
|
-
|
|
64
56
|
if (parent && !this.shouldIgnore(parent.filename)) {
|
|
65
57
|
const parentTreeNode = this.tree.get(parent.filename);
|
|
66
|
-
|
|
67
58
|
if (parentTreeNode) {
|
|
68
59
|
treeNode.parent.add(parentTreeNode);
|
|
69
60
|
}
|
|
70
61
|
}
|
|
71
|
-
|
|
72
62
|
children.forEach(child => {
|
|
73
63
|
if (!this.shouldIgnore(child.filename)) {
|
|
74
64
|
const childTreeNode = this.tree.get(child.filename);
|
|
75
|
-
|
|
76
65
|
if (childTreeNode) {
|
|
77
66
|
treeNode.children.add(childTreeNode);
|
|
78
67
|
childTreeNode.parent.add(treeNode);
|
|
@@ -81,11 +70,8 @@ class DependencyTree {
|
|
|
81
70
|
});
|
|
82
71
|
}
|
|
83
72
|
}
|
|
84
|
-
|
|
85
73
|
shouldIgnore(path) {
|
|
86
74
|
return !path || Boolean(this.ignore.find(rule => _minimatch.default.match([path], rule).length > 0));
|
|
87
75
|
}
|
|
88
|
-
|
|
89
76
|
}
|
|
90
|
-
|
|
91
77
|
exports.DependencyTree = DependencyTree;
|
|
@@ -4,30 +4,20 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.mergeWatchOptions = exports.getWatchedFiles = exports.defaultWatchOptions = exports.default = void 0;
|
|
7
|
-
|
|
8
7
|
var _path = _interopRequireDefault(require("path"));
|
|
9
|
-
|
|
10
8
|
var _utils = require("@modern-js/utils");
|
|
11
|
-
|
|
12
9
|
var _dependencyTree = require("./dependency-tree");
|
|
13
|
-
|
|
14
10
|
var _statsCache = require("./stats-cache");
|
|
15
|
-
|
|
16
11
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
17
|
-
|
|
18
12
|
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; }
|
|
19
|
-
|
|
20
13
|
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; }
|
|
21
|
-
|
|
22
14
|
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; }
|
|
23
|
-
|
|
24
15
|
const defaultWatchOptions = {
|
|
25
16
|
// 初始化的时候不触发 add、addDir 事件
|
|
26
17
|
ignoreInitial: true,
|
|
27
18
|
ignored: /api\/typings\/.*/
|
|
28
19
|
};
|
|
29
20
|
exports.defaultWatchOptions = defaultWatchOptions;
|
|
30
|
-
|
|
31
21
|
const getWatchedFiles = watcher => {
|
|
32
22
|
const watched = watcher.getWatched();
|
|
33
23
|
const files = [];
|
|
@@ -38,44 +28,32 @@ const getWatchedFiles = watcher => {
|
|
|
38
28
|
});
|
|
39
29
|
return files;
|
|
40
30
|
};
|
|
41
|
-
|
|
42
31
|
exports.getWatchedFiles = getWatchedFiles;
|
|
43
|
-
|
|
44
32
|
const mergeWatchOptions = options => {
|
|
45
33
|
const watchOptions = _objectSpread({}, options);
|
|
46
|
-
|
|
47
34
|
if (watchOptions) {
|
|
48
35
|
const {
|
|
49
36
|
ignored
|
|
50
37
|
} = watchOptions;
|
|
51
38
|
const finalIgnored = ignored ? [defaultWatchOptions.ignored, ...(Array.isArray(ignored) ? ignored : [ignored])] : ignored;
|
|
52
|
-
|
|
53
39
|
if (finalIgnored) {
|
|
54
40
|
watchOptions.ignored = finalIgnored;
|
|
55
41
|
}
|
|
56
42
|
}
|
|
57
|
-
|
|
58
43
|
const finalWatchOptions = _objectSpread(_objectSpread({}, defaultWatchOptions), watchOptions);
|
|
59
|
-
|
|
60
44
|
return finalWatchOptions;
|
|
61
45
|
};
|
|
62
|
-
|
|
63
46
|
exports.mergeWatchOptions = mergeWatchOptions;
|
|
64
|
-
|
|
65
47
|
class Watcher {
|
|
66
48
|
constructor() {
|
|
67
49
|
_defineProperty(this, "dependencyTree", null);
|
|
68
|
-
|
|
69
50
|
_defineProperty(this, "watcher", void 0);
|
|
70
51
|
}
|
|
71
|
-
|
|
72
52
|
listen(files, options, callback) {
|
|
73
53
|
const watched = files.filter(Boolean);
|
|
74
54
|
const filenames = watched.map(filename => filename.replace(/\\/g, '/'));
|
|
75
55
|
const cache = new _statsCache.StatsCache();
|
|
76
|
-
|
|
77
56
|
const watcher = _utils.chokidar.watch(filenames, options);
|
|
78
|
-
|
|
79
57
|
watcher.on('ready', () => {
|
|
80
58
|
cache.add(getWatchedFiles(watcher));
|
|
81
59
|
});
|
|
@@ -97,35 +75,25 @@ class Watcher {
|
|
|
97
75
|
});
|
|
98
76
|
this.watcher = watcher;
|
|
99
77
|
}
|
|
100
|
-
|
|
101
78
|
createDepTree() {
|
|
102
79
|
this.dependencyTree = new _dependencyTree.DependencyTree();
|
|
103
80
|
}
|
|
104
|
-
|
|
105
81
|
updateDepTree() {
|
|
106
82
|
var _this$dependencyTree;
|
|
107
|
-
|
|
108
83
|
(_this$dependencyTree = this.dependencyTree) === null || _this$dependencyTree === void 0 ? void 0 : _this$dependencyTree.update(require.cache);
|
|
109
84
|
}
|
|
110
|
-
|
|
111
85
|
cleanDepCache(filepath) {
|
|
112
86
|
var _this$dependencyTree2;
|
|
113
|
-
|
|
114
87
|
const node = (_this$dependencyTree2 = this.dependencyTree) === null || _this$dependencyTree2 === void 0 ? void 0 : _this$dependencyTree2.getNode(filepath);
|
|
115
|
-
|
|
116
88
|
if (node && require.cache[filepath]) {
|
|
117
89
|
delete require.cache[filepath];
|
|
118
|
-
|
|
119
90
|
for (const parentNode of node.parent.values()) {
|
|
120
91
|
this.cleanDepCache(parentNode.module.filename);
|
|
121
92
|
}
|
|
122
93
|
}
|
|
123
94
|
}
|
|
124
|
-
|
|
125
95
|
close() {
|
|
126
96
|
return this.watcher.close();
|
|
127
97
|
}
|
|
128
|
-
|
|
129
98
|
}
|
|
130
|
-
|
|
131
99
|
exports.default = Watcher;
|
|
@@ -4,32 +4,23 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.StatsCache = void 0;
|
|
7
|
-
|
|
8
7
|
var _fs = _interopRequireDefault(require("fs"));
|
|
9
|
-
|
|
10
8
|
var _crypto = _interopRequireDefault(require("crypto"));
|
|
11
|
-
|
|
12
9
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
13
|
-
|
|
14
10
|
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; }
|
|
15
|
-
|
|
16
11
|
class StatsCache {
|
|
17
12
|
constructor() {
|
|
18
13
|
_defineProperty(this, "cachedHash", {});
|
|
19
|
-
|
|
20
14
|
_defineProperty(this, "cachedSize", {});
|
|
21
15
|
}
|
|
22
|
-
|
|
23
16
|
add(files) {
|
|
24
17
|
const {
|
|
25
18
|
cachedHash,
|
|
26
19
|
cachedSize
|
|
27
20
|
} = this;
|
|
28
|
-
|
|
29
21
|
for (const filename of files) {
|
|
30
22
|
if (_fs.default.existsSync(filename)) {
|
|
31
23
|
const stats = _fs.default.statSync(filename);
|
|
32
|
-
|
|
33
24
|
if (stats.isFile() && !cachedHash[filename]) {
|
|
34
25
|
cachedHash[filename] = this.hash(stats, filename);
|
|
35
26
|
cachedSize[filename] = stats.size;
|
|
@@ -37,60 +28,46 @@ class StatsCache {
|
|
|
37
28
|
}
|
|
38
29
|
}
|
|
39
30
|
}
|
|
40
|
-
|
|
41
31
|
refresh(filename) {
|
|
42
32
|
const {
|
|
43
33
|
cachedHash,
|
|
44
34
|
cachedSize
|
|
45
35
|
} = this;
|
|
46
|
-
|
|
47
36
|
if (_fs.default.existsSync(filename)) {
|
|
48
37
|
const stats = _fs.default.statSync(filename);
|
|
49
|
-
|
|
50
38
|
if (stats.isFile()) {
|
|
51
39
|
cachedHash[filename] = this.hash(stats, filename);
|
|
52
40
|
cachedSize[filename] = stats.size;
|
|
53
41
|
}
|
|
54
42
|
}
|
|
55
43
|
}
|
|
56
|
-
|
|
57
44
|
del(filename) {
|
|
58
45
|
if (this.cachedHash[filename]) {
|
|
59
46
|
delete this.cachedHash[filename];
|
|
60
47
|
delete this.cachedSize[filename];
|
|
61
48
|
}
|
|
62
49
|
}
|
|
63
|
-
|
|
64
50
|
isDiff(filename) {
|
|
65
51
|
const {
|
|
66
52
|
cachedHash,
|
|
67
53
|
cachedSize
|
|
68
54
|
} = this;
|
|
69
|
-
|
|
70
55
|
const stats = _fs.default.statSync(filename);
|
|
71
|
-
|
|
72
56
|
const hash = cachedHash[filename];
|
|
73
57
|
const size = cachedSize[filename];
|
|
74
|
-
|
|
75
58
|
if (stats.size !== size) {
|
|
76
59
|
return true;
|
|
77
60
|
}
|
|
78
|
-
|
|
79
61
|
if (this.hash(stats, filename) !== hash) {
|
|
80
62
|
return true;
|
|
81
63
|
}
|
|
82
|
-
|
|
83
64
|
return false;
|
|
84
65
|
}
|
|
85
|
-
|
|
86
66
|
has(filename) {
|
|
87
67
|
return Boolean(this.cachedHash[filename]);
|
|
88
68
|
}
|
|
89
|
-
|
|
90
69
|
hash(stats, filename) {
|
|
91
70
|
return _crypto.default.createHash('md5').update(_fs.default.readFileSync(filename)).digest('hex');
|
|
92
71
|
}
|
|
93
|
-
|
|
94
72
|
}
|
|
95
|
-
|
|
96
73
|
exports.StatsCache = StatsCache;
|
package/dist/js/node/index.js
CHANGED
|
@@ -10,16 +10,12 @@ Object.defineProperty(exports, "Server", {
|
|
|
10
10
|
}
|
|
11
11
|
});
|
|
12
12
|
exports.default = void 0;
|
|
13
|
-
|
|
14
13
|
var _server = require("./server");
|
|
15
|
-
|
|
16
14
|
var _default = options => {
|
|
17
15
|
if (options == null) {
|
|
18
16
|
throw new Error('can not start mserver without options');
|
|
19
17
|
}
|
|
20
|
-
|
|
21
18
|
const server = new _server.DevServer(options);
|
|
22
19
|
return server.init();
|
|
23
20
|
};
|
|
24
|
-
|
|
25
21
|
exports.default = _default;
|
|
@@ -4,57 +4,38 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.ModernDevServer = void 0;
|
|
7
|
-
|
|
8
7
|
var _http = require("http");
|
|
9
|
-
|
|
10
8
|
var _path = _interopRequireDefault(require("path"));
|
|
11
|
-
|
|
12
9
|
var _https = require("https");
|
|
13
|
-
|
|
14
10
|
var _utils = require("@modern-js/utils");
|
|
15
|
-
|
|
16
11
|
var _prodServer = require("@modern-js/prod-server");
|
|
17
|
-
|
|
18
12
|
var _constants = require("@modern-js/utils/constants");
|
|
19
|
-
|
|
20
13
|
var _constants2 = require("../constants");
|
|
21
|
-
|
|
22
14
|
var _mock = require("../dev-tools/mock");
|
|
23
|
-
|
|
24
15
|
var _register = require("../dev-tools/register");
|
|
25
|
-
|
|
26
16
|
var _watcher = _interopRequireWildcard(require("../dev-tools/watcher"));
|
|
27
|
-
|
|
28
17
|
var _devMiddleware = _interopRequireDefault(require("../dev-tools/dev-middleware"));
|
|
29
|
-
|
|
30
18
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
31
|
-
|
|
32
19
|
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
33
|
-
|
|
34
20
|
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
35
|
-
|
|
36
21
|
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; }
|
|
37
|
-
|
|
38
22
|
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; }
|
|
39
|
-
|
|
40
23
|
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; }
|
|
41
|
-
|
|
42
24
|
class ModernDevServer extends _prodServer.ModernServer {
|
|
43
25
|
constructor(options) {
|
|
44
|
-
super(options);
|
|
26
|
+
super(options);
|
|
45
27
|
|
|
28
|
+
// dev server should work in pwd
|
|
46
29
|
_defineProperty(this, "mockHandler", null);
|
|
47
|
-
|
|
48
30
|
_defineProperty(this, "dev", void 0);
|
|
49
|
-
|
|
50
31
|
_defineProperty(this, "devMiddleware", void 0);
|
|
51
|
-
|
|
52
32
|
_defineProperty(this, "watcher", void 0);
|
|
33
|
+
this.workDir = this.pwd;
|
|
53
34
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
this.dev = this.getDevOptions(options); // create dev middleware instance
|
|
35
|
+
// set dev server options, like webpack-dev-server
|
|
36
|
+
this.dev = this.getDevOptions(options);
|
|
57
37
|
|
|
38
|
+
// create dev middleware instance
|
|
58
39
|
this.devMiddleware = new _devMiddleware.default({
|
|
59
40
|
dev: this.dev,
|
|
60
41
|
compiler: options.compiler,
|
|
@@ -62,7 +43,6 @@ class ModernDevServer extends _prodServer.ModernServer {
|
|
|
62
43
|
});
|
|
63
44
|
(0, _register.enableRegister)(this.pwd, this.conf);
|
|
64
45
|
}
|
|
65
|
-
|
|
66
46
|
getDevOptions(options) {
|
|
67
47
|
const devOptions = typeof options.dev === 'boolean' ? {} : options.dev;
|
|
68
48
|
const defaultOptions = (0, _constants2.getDefaultDevOptions)();
|
|
@@ -70,7 +50,6 @@ class ModernDevServer extends _prodServer.ModernServer {
|
|
|
70
50
|
client: _objectSpread(_objectSpread({}, defaultOptions.client), devOptions === null || devOptions === void 0 ? void 0 : devOptions.client)
|
|
71
51
|
});
|
|
72
52
|
}
|
|
73
|
-
|
|
74
53
|
addMiddlewareHandler(handlers) {
|
|
75
54
|
handlers.forEach(handler => {
|
|
76
55
|
this.addHandler((ctx, next) => {
|
|
@@ -82,7 +61,6 @@ class ModernDevServer extends _prodServer.ModernServer {
|
|
|
82
61
|
});
|
|
83
62
|
});
|
|
84
63
|
}
|
|
85
|
-
|
|
86
64
|
applySetupMiddlewares() {
|
|
87
65
|
const setupMiddlewares = this.dev.setupMiddlewares || [];
|
|
88
66
|
const serverOptions = {
|
|
@@ -100,38 +78,40 @@ class ModernDevServer extends _prodServer.ModernServer {
|
|
|
100
78
|
befores,
|
|
101
79
|
afters
|
|
102
80
|
};
|
|
103
|
-
}
|
|
104
|
-
|
|
81
|
+
}
|
|
105
82
|
|
|
83
|
+
// Complete the preparation of services
|
|
106
84
|
async onInit(runner, app) {
|
|
107
85
|
this.runner = runner;
|
|
108
86
|
const {
|
|
109
87
|
dev
|
|
110
|
-
} = this;
|
|
88
|
+
} = this;
|
|
111
89
|
|
|
90
|
+
// Order: devServer.before => setupMiddlewares.unshift => internal middlewares => setupMiddlewares.push => devServer.after
|
|
112
91
|
const {
|
|
113
92
|
befores,
|
|
114
93
|
afters
|
|
115
|
-
} = this.applySetupMiddlewares();
|
|
94
|
+
} = this.applySetupMiddlewares();
|
|
116
95
|
|
|
96
|
+
// before dev handler
|
|
117
97
|
const beforeHandlers = await this.setupBeforeDevMiddleware();
|
|
118
98
|
this.addMiddlewareHandler([...beforeHandlers, ...befores]);
|
|
119
|
-
await this.applyDefaultMiddlewares(app);
|
|
99
|
+
await this.applyDefaultMiddlewares(app);
|
|
120
100
|
|
|
101
|
+
// after dev handler
|
|
121
102
|
const afterHandlers = await this.setupAfterDevMiddleware();
|
|
122
103
|
this.addMiddlewareHandler([...afters, ...afterHandlers]);
|
|
123
|
-
await super.onInit(runner, app);
|
|
104
|
+
await super.onInit(runner, app);
|
|
124
105
|
|
|
106
|
+
// watch mock/ server/ api/ dir file change
|
|
125
107
|
if (dev.watch) {
|
|
126
108
|
this.startWatcher();
|
|
127
109
|
app.on('close', async () => {
|
|
128
110
|
var _this$watcher;
|
|
129
|
-
|
|
130
111
|
await ((_this$watcher = this.watcher) === null || _this$watcher === void 0 ? void 0 : _this$watcher.close());
|
|
131
112
|
});
|
|
132
113
|
}
|
|
133
114
|
}
|
|
134
|
-
|
|
135
115
|
async applyDefaultMiddlewares(app) {
|
|
136
116
|
const {
|
|
137
117
|
pwd,
|
|
@@ -140,23 +120,22 @@ class ModernDevServer extends _prodServer.ModernServer {
|
|
|
140
120
|
} = this;
|
|
141
121
|
this.addHandler((ctx, next) => {
|
|
142
122
|
// allow hmr request cross-domain, because the user may use global proxy
|
|
123
|
+
ctx.res.setHeader('Access-Control-Allow-Origin', '*');
|
|
143
124
|
if (ctx.path.includes('hot-update')) {
|
|
144
|
-
ctx.res.setHeader('Access-Control-Allow-Origin', '*');
|
|
145
125
|
ctx.res.setHeader('Access-Control-Allow-Credentials', 'false');
|
|
146
|
-
}
|
|
147
|
-
|
|
126
|
+
}
|
|
148
127
|
|
|
128
|
+
// 用户在 devServer 上配置的 headers 不会对 html 的请求生效,加入下面代码,使配置的 headers 对所有请求生效
|
|
149
129
|
const confHeaders = dev.headers;
|
|
150
|
-
|
|
151
130
|
if (confHeaders) {
|
|
152
131
|
for (const [key, value] of Object.entries(confHeaders)) {
|
|
153
132
|
ctx.res.setHeader(key, value);
|
|
154
133
|
}
|
|
155
134
|
}
|
|
156
|
-
|
|
157
135
|
next();
|
|
158
|
-
});
|
|
136
|
+
});
|
|
159
137
|
|
|
138
|
+
// mock handler
|
|
160
139
|
this.mockHandler = (0, _mock.createMockHandler)({
|
|
161
140
|
pwd
|
|
162
141
|
});
|
|
@@ -166,17 +145,17 @@ class ModernDevServer extends _prodServer.ModernServer {
|
|
|
166
145
|
} else {
|
|
167
146
|
next();
|
|
168
147
|
}
|
|
169
|
-
});
|
|
148
|
+
});
|
|
170
149
|
|
|
150
|
+
// dev proxy handler, each proxy has own handler
|
|
171
151
|
const proxyHandlers = (0, _prodServer.createProxyHandler)(dev.proxy);
|
|
172
|
-
|
|
173
152
|
if (proxyHandlers) {
|
|
174
153
|
proxyHandlers.forEach(handler => {
|
|
175
154
|
this.addHandler(handler);
|
|
176
155
|
});
|
|
177
|
-
}
|
|
178
|
-
|
|
156
|
+
}
|
|
179
157
|
|
|
158
|
+
// do webpack build / plugin apply / socket server when pass compiler instance
|
|
180
159
|
devMiddleware.init(app);
|
|
181
160
|
devMiddleware.on('change', stats => {
|
|
182
161
|
// Reset only when client compile done
|
|
@@ -193,14 +172,12 @@ class ModernDevServer extends _prodServer.ModernServer {
|
|
|
193
172
|
req,
|
|
194
173
|
res
|
|
195
174
|
} = ctx;
|
|
196
|
-
|
|
197
175
|
if (devMiddleware.middleware) {
|
|
198
176
|
devMiddleware.middleware(req, res, next);
|
|
199
177
|
} else {
|
|
200
178
|
next();
|
|
201
179
|
}
|
|
202
180
|
});
|
|
203
|
-
|
|
204
181
|
if (dev.historyApiFallback) {
|
|
205
182
|
const {
|
|
206
183
|
default: connectHistoryApiFallback
|
|
@@ -209,41 +186,37 @@ class ModernDevServer extends _prodServer.ModernServer {
|
|
|
209
186
|
this.addHandler((ctx, next) => historyApiFallbackMiddleware(ctx.req, ctx.res, next));
|
|
210
187
|
}
|
|
211
188
|
}
|
|
212
|
-
|
|
213
189
|
onRepack(options = {}) {
|
|
214
190
|
// reset the routing management instance every times the service starts
|
|
215
191
|
if (Array.isArray(options.routes)) {
|
|
216
192
|
this.router.reset(this.filterRoutes(options.routes));
|
|
217
|
-
}
|
|
218
|
-
|
|
193
|
+
}
|
|
219
194
|
|
|
220
|
-
|
|
195
|
+
// clean ssr bundle cache
|
|
196
|
+
this.cleanSSRCache();
|
|
221
197
|
|
|
198
|
+
// reset static file
|
|
222
199
|
this.reader.updateFile();
|
|
223
200
|
super.onRepack(options);
|
|
224
201
|
}
|
|
225
|
-
|
|
226
202
|
async createHTTPServer(handler) {
|
|
227
203
|
const {
|
|
228
204
|
dev
|
|
229
205
|
} = this;
|
|
230
206
|
const devHttpsOption = typeof dev === 'object' && dev.https;
|
|
231
|
-
|
|
232
207
|
if (devHttpsOption) {
|
|
233
208
|
const {
|
|
234
209
|
genHttpsOptions
|
|
235
210
|
} = require("../dev-tools/https");
|
|
236
|
-
|
|
237
211
|
const httpsOptions = await genHttpsOptions(devHttpsOption);
|
|
238
212
|
return (0, _https.createServer)(httpsOptions, handler);
|
|
239
213
|
} else {
|
|
240
214
|
return (0, _http.createServer)(handler);
|
|
241
215
|
}
|
|
242
216
|
}
|
|
243
|
-
|
|
244
|
-
|
|
217
|
+
warmupSSRBundle() {
|
|
218
|
+
// not warmup ssr bundle on development
|
|
245
219
|
}
|
|
246
|
-
|
|
247
220
|
onServerChange({
|
|
248
221
|
filepath,
|
|
249
222
|
event
|
|
@@ -254,11 +227,8 @@ class ModernDevServer extends _prodServer.ModernServer {
|
|
|
254
227
|
const {
|
|
255
228
|
mock
|
|
256
229
|
} = _prodServer.AGGRED_DIR;
|
|
257
|
-
|
|
258
230
|
const mockPath = _path.default.normalize(_path.default.join(pwd, mock));
|
|
259
|
-
|
|
260
231
|
this.runner.reset();
|
|
261
|
-
|
|
262
232
|
if (filepath.startsWith(mockPath)) {
|
|
263
233
|
this.mockHandler = (0, _mock.createMockHandler)({
|
|
264
234
|
pwd
|
|
@@ -268,11 +238,12 @@ class ModernDevServer extends _prodServer.ModernServer {
|
|
|
268
238
|
const success = this.runner.onApiChange([{
|
|
269
239
|
filename: filepath,
|
|
270
240
|
event
|
|
271
|
-
}]);
|
|
241
|
+
}]);
|
|
242
|
+
|
|
243
|
+
// onApiChange 钩子被调用,且返回 true,则表示无需重新编译
|
|
272
244
|
// onApiChange 的类型是 WaterFall,WaterFall 钩子的返回值类型目前有问题
|
|
273
245
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
274
246
|
// @ts-expect-error
|
|
275
|
-
|
|
276
247
|
if (success !== true) {
|
|
277
248
|
super.onServerChange({
|
|
278
249
|
filepath
|
|
@@ -283,13 +254,11 @@ class ModernDevServer extends _prodServer.ModernServer {
|
|
|
283
254
|
}
|
|
284
255
|
}
|
|
285
256
|
}
|
|
286
|
-
|
|
287
257
|
createContext(req, res) {
|
|
288
258
|
return super.createContext(req, res, {
|
|
289
259
|
etag: true
|
|
290
260
|
});
|
|
291
261
|
}
|
|
292
|
-
|
|
293
262
|
async setupBeforeDevMiddleware() {
|
|
294
263
|
const {
|
|
295
264
|
runner,
|
|
@@ -300,7 +269,6 @@ class ModernDevServer extends _prodServer.ModernServer {
|
|
|
300
269
|
const pluginMids = await runner.beforeDevServer(conf);
|
|
301
270
|
return [...setupMids, ...pluginMids].flat();
|
|
302
271
|
}
|
|
303
|
-
|
|
304
272
|
async setupAfterDevMiddleware() {
|
|
305
273
|
const {
|
|
306
274
|
runner,
|
|
@@ -311,7 +279,6 @@ class ModernDevServer extends _prodServer.ModernServer {
|
|
|
311
279
|
const pluginMids = await runner.afterDevServer(conf);
|
|
312
280
|
return [...pluginMids, ...setupMids].flat();
|
|
313
281
|
}
|
|
314
|
-
|
|
315
282
|
cleanSSRCache() {
|
|
316
283
|
const {
|
|
317
284
|
distDir
|
|
@@ -319,22 +286,17 @@ class ModernDevServer extends _prodServer.ModernServer {
|
|
|
319
286
|
const bundles = this.router.getBundles();
|
|
320
287
|
bundles.forEach(bundle => {
|
|
321
288
|
const filepath = _path.default.join(distDir, bundle);
|
|
322
|
-
|
|
323
289
|
if (require.cache[filepath]) {
|
|
324
290
|
delete require.cache[filepath];
|
|
325
291
|
}
|
|
326
292
|
});
|
|
327
|
-
|
|
328
293
|
const loadable = _path.default.join(distDir, _constants.LOADABLE_STATS_FILE);
|
|
329
|
-
|
|
330
294
|
if (require.cache[loadable]) {
|
|
331
295
|
delete require.cache[loadable];
|
|
332
296
|
}
|
|
333
297
|
}
|
|
334
|
-
|
|
335
298
|
startWatcher() {
|
|
336
299
|
var _this$conf$server;
|
|
337
|
-
|
|
338
300
|
const {
|
|
339
301
|
pwd
|
|
340
302
|
} = this;
|
|
@@ -342,11 +304,14 @@ class ModernDevServer extends _prodServer.ModernServer {
|
|
|
342
304
|
mock
|
|
343
305
|
} = _prodServer.AGGRED_DIR;
|
|
344
306
|
const defaultWatched = [`${mock}/**/*`, `${_utils.SERVER_DIR}/**/*`, `${_utils.API_DIR}/**`, `${_utils.SHARED_DIR}/**/*`];
|
|
307
|
+
|
|
308
|
+
// FIXME: the server config.watchOptions;
|
|
345
309
|
const watchOptions = (0, _watcher.mergeWatchOptions)((_this$conf$server = this.conf.server) === null || _this$conf$server === void 0 ? void 0 : _this$conf$server.watchOptions);
|
|
346
310
|
const defaultWatchedPaths = defaultWatched.map(p => _path.default.normalize(_path.default.join(pwd, p)));
|
|
347
311
|
const watcher = new _watcher.default();
|
|
348
|
-
watcher.createDepTree();
|
|
312
|
+
watcher.createDepTree();
|
|
349
313
|
|
|
314
|
+
// 监听文件变动,如果有变动则给 client,也就是 start 启动的插件发消息
|
|
350
315
|
watcher.listen(defaultWatchedPaths, watchOptions, (filepath, event) => {
|
|
351
316
|
watcher.updateDepTree();
|
|
352
317
|
watcher.cleanDepCache(filepath);
|
|
@@ -357,7 +322,5 @@ class ModernDevServer extends _prodServer.ModernServer {
|
|
|
357
322
|
});
|
|
358
323
|
this.watcher = watcher;
|
|
359
324
|
}
|
|
360
|
-
|
|
361
325
|
}
|
|
362
|
-
|
|
363
326
|
exports.ModernDevServer = ModernDevServer;
|
|
@@ -4,24 +4,17 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.DevServer = void 0;
|
|
7
|
-
|
|
8
7
|
var _prodServer = require("@modern-js/prod-server");
|
|
9
|
-
|
|
10
8
|
var _devServer = require("./dev-server");
|
|
11
|
-
|
|
12
9
|
const createDevServer = options => {
|
|
13
10
|
return new _devServer.ModernDevServer(options);
|
|
14
11
|
};
|
|
15
|
-
|
|
16
12
|
class DevServer extends _prodServer.Server {
|
|
17
13
|
constructor(options) {
|
|
18
14
|
super(options);
|
|
19
|
-
|
|
20
15
|
if (options.dev) {
|
|
21
16
|
this.serverImpl = createDevServer;
|
|
22
17
|
}
|
|
23
18
|
}
|
|
24
|
-
|
|
25
19
|
}
|
|
26
|
-
|
|
27
20
|
exports.DevServer = DevServer;
|
|
@@ -11,8 +11,6 @@ export declare type MockApi = {
|
|
|
11
11
|
};
|
|
12
12
|
declare const createFunctionDataHandler: (method: string, handler: (req: IncomingMessage, res: ServerResponse, next: NextFunction) => void) => (context: ModernServerContext, next: NextFunction) => Promise<void>;
|
|
13
13
|
declare const createStaticDataHandler: (method: string, handler: Record<string, any>) => (context: ModernServerContext) => void;
|
|
14
|
-
|
|
15
14
|
declare const _default: (filepath: string) => MockApi[];
|
|
16
|
-
|
|
17
15
|
export default _default;
|
|
18
16
|
export declare const getMatched: (context: ModernServerContext, mockApiList: MockApi[]) => MockApi | undefined;
|