@modern-js/server 1.21.5 → 2.0.0-beta.1
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 +79 -22
- 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 +9 -23
- 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 +37 -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 +8 -31
- 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 +37 -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 +11 -34
|
@@ -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,
|
|
@@ -141,23 +121,21 @@ class ModernDevServer extends _prodServer.ModernServer {
|
|
|
141
121
|
this.addHandler((ctx, next) => {
|
|
142
122
|
// allow hmr request cross-domain, because the user may use global proxy
|
|
143
123
|
ctx.res.setHeader('Access-Control-Allow-Origin', '*');
|
|
144
|
-
|
|
145
124
|
if (ctx.path.includes('hot-update')) {
|
|
146
125
|
ctx.res.setHeader('Access-Control-Allow-Credentials', 'false');
|
|
147
|
-
}
|
|
148
|
-
|
|
126
|
+
}
|
|
149
127
|
|
|
128
|
+
// 用户在 devServer 上配置的 headers 不会对 html 的请求生效,加入下面代码,使配置的 headers 对所有请求生效
|
|
150
129
|
const confHeaders = dev.headers;
|
|
151
|
-
|
|
152
130
|
if (confHeaders) {
|
|
153
131
|
for (const [key, value] of Object.entries(confHeaders)) {
|
|
154
132
|
ctx.res.setHeader(key, value);
|
|
155
133
|
}
|
|
156
134
|
}
|
|
157
|
-
|
|
158
135
|
next();
|
|
159
|
-
});
|
|
136
|
+
});
|
|
160
137
|
|
|
138
|
+
// mock handler
|
|
161
139
|
this.mockHandler = (0, _mock.createMockHandler)({
|
|
162
140
|
pwd
|
|
163
141
|
});
|
|
@@ -167,17 +145,17 @@ class ModernDevServer extends _prodServer.ModernServer {
|
|
|
167
145
|
} else {
|
|
168
146
|
next();
|
|
169
147
|
}
|
|
170
|
-
});
|
|
148
|
+
});
|
|
171
149
|
|
|
150
|
+
// dev proxy handler, each proxy has own handler
|
|
172
151
|
const proxyHandlers = (0, _prodServer.createProxyHandler)(dev.proxy);
|
|
173
|
-
|
|
174
152
|
if (proxyHandlers) {
|
|
175
153
|
proxyHandlers.forEach(handler => {
|
|
176
154
|
this.addHandler(handler);
|
|
177
155
|
});
|
|
178
|
-
}
|
|
179
|
-
|
|
156
|
+
}
|
|
180
157
|
|
|
158
|
+
// do webpack build / plugin apply / socket server when pass compiler instance
|
|
181
159
|
devMiddleware.init(app);
|
|
182
160
|
devMiddleware.on('change', stats => {
|
|
183
161
|
// Reset only when client compile done
|
|
@@ -194,14 +172,12 @@ class ModernDevServer extends _prodServer.ModernServer {
|
|
|
194
172
|
req,
|
|
195
173
|
res
|
|
196
174
|
} = ctx;
|
|
197
|
-
|
|
198
175
|
if (devMiddleware.middleware) {
|
|
199
176
|
devMiddleware.middleware(req, res, next);
|
|
200
177
|
} else {
|
|
201
178
|
next();
|
|
202
179
|
}
|
|
203
180
|
});
|
|
204
|
-
|
|
205
181
|
if (dev.historyApiFallback) {
|
|
206
182
|
const {
|
|
207
183
|
default: connectHistoryApiFallback
|
|
@@ -210,41 +186,37 @@ class ModernDevServer extends _prodServer.ModernServer {
|
|
|
210
186
|
this.addHandler((ctx, next) => historyApiFallbackMiddleware(ctx.req, ctx.res, next));
|
|
211
187
|
}
|
|
212
188
|
}
|
|
213
|
-
|
|
214
189
|
onRepack(options = {}) {
|
|
215
190
|
// reset the routing management instance every times the service starts
|
|
216
191
|
if (Array.isArray(options.routes)) {
|
|
217
192
|
this.router.reset(this.filterRoutes(options.routes));
|
|
218
|
-
}
|
|
219
|
-
|
|
193
|
+
}
|
|
220
194
|
|
|
221
|
-
|
|
195
|
+
// clean ssr bundle cache
|
|
196
|
+
this.cleanSSRCache();
|
|
222
197
|
|
|
198
|
+
// reset static file
|
|
223
199
|
this.reader.updateFile();
|
|
224
200
|
super.onRepack(options);
|
|
225
201
|
}
|
|
226
|
-
|
|
227
202
|
async createHTTPServer(handler) {
|
|
228
203
|
const {
|
|
229
204
|
dev
|
|
230
205
|
} = this;
|
|
231
206
|
const devHttpsOption = typeof dev === 'object' && dev.https;
|
|
232
|
-
|
|
233
207
|
if (devHttpsOption) {
|
|
234
208
|
const {
|
|
235
209
|
genHttpsOptions
|
|
236
210
|
} = require("../dev-tools/https");
|
|
237
|
-
|
|
238
211
|
const httpsOptions = await genHttpsOptions(devHttpsOption);
|
|
239
212
|
return (0, _https.createServer)(httpsOptions, handler);
|
|
240
213
|
} else {
|
|
241
214
|
return (0, _http.createServer)(handler);
|
|
242
215
|
}
|
|
243
216
|
}
|
|
244
|
-
|
|
245
|
-
|
|
217
|
+
warmupSSRBundle() {
|
|
218
|
+
// not warmup ssr bundle on development
|
|
246
219
|
}
|
|
247
|
-
|
|
248
220
|
onServerChange({
|
|
249
221
|
filepath,
|
|
250
222
|
event
|
|
@@ -255,11 +227,8 @@ class ModernDevServer extends _prodServer.ModernServer {
|
|
|
255
227
|
const {
|
|
256
228
|
mock
|
|
257
229
|
} = _prodServer.AGGRED_DIR;
|
|
258
|
-
|
|
259
230
|
const mockPath = _path.default.normalize(_path.default.join(pwd, mock));
|
|
260
|
-
|
|
261
231
|
this.runner.reset();
|
|
262
|
-
|
|
263
232
|
if (filepath.startsWith(mockPath)) {
|
|
264
233
|
this.mockHandler = (0, _mock.createMockHandler)({
|
|
265
234
|
pwd
|
|
@@ -269,11 +238,12 @@ class ModernDevServer extends _prodServer.ModernServer {
|
|
|
269
238
|
const success = this.runner.onApiChange([{
|
|
270
239
|
filename: filepath,
|
|
271
240
|
event
|
|
272
|
-
}]);
|
|
241
|
+
}]);
|
|
242
|
+
|
|
243
|
+
// onApiChange 钩子被调用,且返回 true,则表示无需重新编译
|
|
273
244
|
// onApiChange 的类型是 WaterFall,WaterFall 钩子的返回值类型目前有问题
|
|
274
245
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
275
246
|
// @ts-expect-error
|
|
276
|
-
|
|
277
247
|
if (success !== true) {
|
|
278
248
|
super.onServerChange({
|
|
279
249
|
filepath
|
|
@@ -284,13 +254,11 @@ class ModernDevServer extends _prodServer.ModernServer {
|
|
|
284
254
|
}
|
|
285
255
|
}
|
|
286
256
|
}
|
|
287
|
-
|
|
288
257
|
createContext(req, res) {
|
|
289
258
|
return super.createContext(req, res, {
|
|
290
259
|
etag: true
|
|
291
260
|
});
|
|
292
261
|
}
|
|
293
|
-
|
|
294
262
|
async setupBeforeDevMiddleware() {
|
|
295
263
|
const {
|
|
296
264
|
runner,
|
|
@@ -301,7 +269,6 @@ class ModernDevServer extends _prodServer.ModernServer {
|
|
|
301
269
|
const pluginMids = await runner.beforeDevServer(conf);
|
|
302
270
|
return [...setupMids, ...pluginMids].flat();
|
|
303
271
|
}
|
|
304
|
-
|
|
305
272
|
async setupAfterDevMiddleware() {
|
|
306
273
|
const {
|
|
307
274
|
runner,
|
|
@@ -312,7 +279,6 @@ class ModernDevServer extends _prodServer.ModernServer {
|
|
|
312
279
|
const pluginMids = await runner.afterDevServer(conf);
|
|
313
280
|
return [...pluginMids, ...setupMids].flat();
|
|
314
281
|
}
|
|
315
|
-
|
|
316
282
|
cleanSSRCache() {
|
|
317
283
|
const {
|
|
318
284
|
distDir
|
|
@@ -320,20 +286,17 @@ class ModernDevServer extends _prodServer.ModernServer {
|
|
|
320
286
|
const bundles = this.router.getBundles();
|
|
321
287
|
bundles.forEach(bundle => {
|
|
322
288
|
const filepath = _path.default.join(distDir, bundle);
|
|
323
|
-
|
|
324
289
|
if (require.cache[filepath]) {
|
|
325
290
|
delete require.cache[filepath];
|
|
326
291
|
}
|
|
327
292
|
});
|
|
328
|
-
|
|
329
293
|
const loadable = _path.default.join(distDir, _constants.LOADABLE_STATS_FILE);
|
|
330
|
-
|
|
331
294
|
if (require.cache[loadable]) {
|
|
332
295
|
delete require.cache[loadable];
|
|
333
296
|
}
|
|
334
297
|
}
|
|
335
|
-
|
|
336
298
|
startWatcher() {
|
|
299
|
+
var _this$conf$server;
|
|
337
300
|
const {
|
|
338
301
|
pwd
|
|
339
302
|
} = this;
|
|
@@ -341,11 +304,12 @@ class ModernDevServer extends _prodServer.ModernServer {
|
|
|
341
304
|
mock
|
|
342
305
|
} = _prodServer.AGGRED_DIR;
|
|
343
306
|
const defaultWatched = [`${mock}/**/*`, `${_utils.SERVER_DIR}/**/*`, `${_utils.API_DIR}/**`, `${_utils.SHARED_DIR}/**/*`];
|
|
344
|
-
const watchOptions = (0, _watcher.mergeWatchOptions)(this.conf.server.watchOptions);
|
|
307
|
+
const watchOptions = (0, _watcher.mergeWatchOptions)((_this$conf$server = this.conf.server) === null || _this$conf$server === void 0 ? void 0 : _this$conf$server.watchOptions);
|
|
345
308
|
const defaultWatchedPaths = defaultWatched.map(p => _path.default.normalize(_path.default.join(pwd, p)));
|
|
346
309
|
const watcher = new _watcher.default();
|
|
347
|
-
watcher.createDepTree();
|
|
310
|
+
watcher.createDepTree();
|
|
348
311
|
|
|
312
|
+
// 监听文件变动,如果有变动则给 client,也就是 start 启动的插件发消息
|
|
349
313
|
watcher.listen(defaultWatchedPaths, watchOptions, (filepath, event) => {
|
|
350
314
|
watcher.updateDepTree();
|
|
351
315
|
watcher.cleanDepCache(filepath);
|
|
@@ -356,7 +320,5 @@ class ModernDevServer extends _prodServer.ModernServer {
|
|
|
356
320
|
});
|
|
357
321
|
this.watcher = watcher;
|
|
358
322
|
}
|
|
359
|
-
|
|
360
323
|
}
|
|
361
|
-
|
|
362
324
|
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;
|