@modern-js/prod-server 2.5.1-alpha.3 → 2.6.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 +14 -0
- package/dist/cjs/libs/context/context.js +13 -0
- package/dist/cjs/libs/hook-api/index.js +4 -0
- package/dist/cjs/libs/loadConfig.js +5 -0
- package/dist/cjs/libs/render/cache/__tests__/cache.fun.test.js +4 -0
- package/dist/cjs/libs/render/cache/page-caches/lru.js +4 -0
- package/dist/cjs/libs/render/cache/spr.js +5 -0
- package/dist/cjs/libs/render/cache/util.js +4 -0
- package/dist/cjs/libs/render/index.js +4 -0
- package/dist/cjs/libs/render/reader.js +9 -0
- package/dist/cjs/libs/render/ssr.js +16 -4
- package/dist/cjs/libs/render/static.js +4 -0
- package/dist/cjs/libs/route/index.js +4 -0
- package/dist/cjs/libs/route/matcher.js +4 -0
- package/dist/cjs/libs/serve-file.js +26 -19
- package/dist/cjs/server/index.js +32 -4
- package/dist/cjs/server/modern-server.js +19 -3
- package/dist/esm/libs/context/context.js +15 -6
- package/dist/esm/libs/render/cache/spr.js +1 -0
- package/dist/esm/libs/render/ssr.js +5 -5
- package/dist/esm/libs/route/index.js +4 -0
- package/dist/esm/libs/route/matcher.js +4 -0
- package/dist/esm/libs/serve-file.js +2 -1
- package/dist/esm/server/index.js +30 -7
- package/dist/esm/server/modern-server.js +17 -4
- package/dist/esm-node/libs/context/context.js +9 -0
- package/dist/esm-node/libs/loadConfig.js +1 -0
- package/dist/esm-node/libs/render/cache/spr.js +1 -0
- package/dist/esm-node/libs/render/reader.js +5 -0
- package/dist/esm-node/libs/render/ssr.js +12 -4
- package/dist/esm-node/libs/route/index.js +4 -0
- package/dist/esm-node/libs/route/matcher.js +4 -0
- package/dist/esm-node/libs/serve-file.js +22 -19
- package/dist/esm-node/server/index.js +28 -4
- package/dist/esm-node/server/modern-server.js +15 -3
- package/dist/types/libs/context/context.d.ts +1 -1
- package/dist/types/libs/render/ssr.d.ts +1 -0
- package/dist/types/type.d.ts +1 -8
- package/dist/types/utils.d.ts +1 -1
- package/package.json +9 -9
- package/dist/js/modern/constants.js +0 -35
- package/dist/js/modern/index.js +0 -18
- package/dist/js/modern/libs/context/context.js +0 -160
- package/dist/js/modern/libs/context/index.js +0 -6
- package/dist/js/modern/libs/hook-api/index.js +0 -134
- package/dist/js/modern/libs/hook-api/route.js +0 -20
- package/dist/js/modern/libs/hook-api/template.js +0 -73
- package/dist/js/modern/libs/loadConfig.js +0 -62
- package/dist/js/modern/libs/logger.js +0 -111
- package/dist/js/modern/libs/metrics.js +0 -11
- package/dist/js/modern/libs/proxy.js +0 -92
- package/dist/js/modern/libs/render/cache/__tests__/cache.fun.test.js +0 -114
- package/dist/js/modern/libs/render/cache/__tests__/cache.test.js +0 -254
- package/dist/js/modern/libs/render/cache/__tests__/cacheable.js +0 -47
- package/dist/js/modern/libs/render/cache/__tests__/error-configuration.js +0 -37
- package/dist/js/modern/libs/render/cache/__tests__/matched-cache.js +0 -91
- package/dist/js/modern/libs/render/cache/index.js +0 -115
- package/dist/js/modern/libs/render/cache/page-caches/index.js +0 -32
- package/dist/js/modern/libs/render/cache/page-caches/lru.js +0 -29
- package/dist/js/modern/libs/render/cache/spr.js +0 -248
- package/dist/js/modern/libs/render/cache/type.js +0 -0
- package/dist/js/modern/libs/render/cache/util.js +0 -102
- package/dist/js/modern/libs/render/index.js +0 -86
- package/dist/js/modern/libs/render/measure.js +0 -68
- package/dist/js/modern/libs/render/reader.js +0 -107
- package/dist/js/modern/libs/render/ssr.js +0 -100
- package/dist/js/modern/libs/render/static.js +0 -60
- package/dist/js/modern/libs/render/type.js +0 -9
- package/dist/js/modern/libs/route/index.js +0 -54
- package/dist/js/modern/libs/route/matcher.js +0 -87
- package/dist/js/modern/libs/route/route.js +0 -16
- package/dist/js/modern/libs/serve-file.js +0 -67
- package/dist/js/modern/server/index.js +0 -208
- package/dist/js/modern/server/modern-server-split.js +0 -74
- package/dist/js/modern/server/modern-server.js +0 -554
- package/dist/js/modern/type.js +0 -0
- package/dist/js/modern/utils.js +0 -136
- package/dist/js/modern/worker-server.js +0 -89
- package/dist/js/node/constants.js +0 -62
- package/dist/js/node/index.js +0 -44
- package/dist/js/node/libs/context/context.js +0 -189
- package/dist/js/node/libs/context/index.js +0 -30
- package/dist/js/node/libs/hook-api/index.js +0 -164
- package/dist/js/node/libs/hook-api/route.js +0 -43
- package/dist/js/node/libs/hook-api/template.js +0 -97
- package/dist/js/node/libs/loadConfig.js +0 -91
- package/dist/js/node/libs/logger.js +0 -133
- package/dist/js/node/libs/metrics.js +0 -34
- package/dist/js/node/libs/proxy.js +0 -114
- package/dist/js/node/libs/render/cache/__tests__/cache.fun.test.js +0 -115
- package/dist/js/node/libs/render/cache/__tests__/cache.test.js +0 -245
- package/dist/js/node/libs/render/cache/__tests__/cacheable.js +0 -70
- package/dist/js/node/libs/render/cache/__tests__/error-configuration.js +0 -60
- package/dist/js/node/libs/render/cache/__tests__/matched-cache.js +0 -114
- package/dist/js/node/libs/render/cache/index.js +0 -134
- package/dist/js/node/libs/render/cache/page-caches/index.js +0 -55
- package/dist/js/node/libs/render/cache/page-caches/lru.js +0 -58
- package/dist/js/node/libs/render/cache/spr.js +0 -270
- package/dist/js/node/libs/render/cache/type.js +0 -15
- package/dist/js/node/libs/render/cache/util.js +0 -138
- package/dist/js/node/libs/render/index.js +0 -115
- package/dist/js/node/libs/render/measure.js +0 -90
- package/dist/js/node/libs/render/reader.js +0 -140
- package/dist/js/node/libs/render/ssr.js +0 -123
- package/dist/js/node/libs/render/static.js +0 -89
- package/dist/js/node/libs/render/type.js +0 -32
- package/dist/js/node/libs/route/index.js +0 -78
- package/dist/js/node/libs/route/matcher.js +0 -106
- package/dist/js/node/libs/route/route.js +0 -39
- package/dist/js/node/libs/serve-file.js +0 -97
- package/dist/js/node/server/index.js +0 -219
- package/dist/js/node/server/modern-server-split.js +0 -97
- package/dist/js/node/server/modern-server.js +0 -559
- package/dist/js/node/type.js +0 -15
- package/dist/js/node/utils.js +0 -166
- package/dist/js/node/worker-server.js +0 -113
- package/dist/js/treeshaking/constants.js +0 -29
- package/dist/js/treeshaking/index.js +0 -13
- package/dist/js/treeshaking/libs/context/context.js +0 -274
- package/dist/js/treeshaking/libs/context/index.js +0 -5
- package/dist/js/treeshaking/libs/hook-api/index.js +0 -281
- package/dist/js/treeshaking/libs/hook-api/route.js +0 -68
- package/dist/js/treeshaking/libs/hook-api/template.js +0 -127
- package/dist/js/treeshaking/libs/loadConfig.js +0 -82
- package/dist/js/treeshaking/libs/logger.js +0 -205
- package/dist/js/treeshaking/libs/metrics.js +0 -6
- package/dist/js/treeshaking/libs/proxy.js +0 -244
- package/dist/js/treeshaking/libs/render/cache/__tests__/cache.fun.test.js +0 -291
- package/dist/js/treeshaking/libs/render/cache/__tests__/cache.test.js +0 -781
- package/dist/js/treeshaking/libs/render/cache/__tests__/cacheable.js +0 -67
- package/dist/js/treeshaking/libs/render/cache/__tests__/error-configuration.js +0 -45
- package/dist/js/treeshaking/libs/render/cache/__tests__/matched-cache.js +0 -147
- package/dist/js/treeshaking/libs/render/cache/index.js +0 -346
- package/dist/js/treeshaking/libs/render/cache/page-caches/index.js +0 -154
- package/dist/js/treeshaking/libs/render/cache/page-caches/lru.js +0 -84
- package/dist/js/treeshaking/libs/render/cache/spr.js +0 -492
- package/dist/js/treeshaking/libs/render/cache/type.js +0 -1
- package/dist/js/treeshaking/libs/render/cache/util.js +0 -280
- package/dist/js/treeshaking/libs/render/index.js +0 -234
- package/dist/js/treeshaking/libs/render/measure.js +0 -146
- package/dist/js/treeshaking/libs/render/reader.js +0 -339
- package/dist/js/treeshaking/libs/render/ssr.js +0 -223
- package/dist/js/treeshaking/libs/render/static.js +0 -216
- package/dist/js/treeshaking/libs/render/type.js +0 -7
- package/dist/js/treeshaking/libs/route/index.js +0 -130
- package/dist/js/treeshaking/libs/route/matcher.js +0 -143
- package/dist/js/treeshaking/libs/route/route.js +0 -40
- package/dist/js/treeshaking/libs/serve-file.js +0 -184
- package/dist/js/treeshaking/server/index.js +0 -505
- package/dist/js/treeshaking/server/modern-server-split.js +0 -360
- package/dist/js/treeshaking/server/modern-server.js +0 -1089
- package/dist/js/treeshaking/type.js +0 -1
- package/dist/js/treeshaking/utils.js +0 -147
- package/dist/js/treeshaking/worker-server.js +0 -233
|
@@ -124,16 +124,15 @@ var __generator = this && this.__generator || function(thisArg, body) {
|
|
|
124
124
|
};
|
|
125
125
|
import path from "path";
|
|
126
126
|
import { fs, LOADABLE_STATS_FILE, mime, ROUTE_MINIFEST_FILE, SERVER_RENDER_FUNCTION_NAME } from "@modern-js/utils";
|
|
127
|
-
import cookie from "cookie";
|
|
128
127
|
import cache from "./cache";
|
|
129
128
|
import { createLogger, createMetrics } from "./measure";
|
|
130
129
|
var render = function() {
|
|
131
130
|
var _ref = _asyncToGenerator(function(ctx, renderOptions, runner) {
|
|
132
|
-
var _ctx_res, urlPath, bundle, distDir, template, entryName, staticGenerate, bundleJS, loadableUri, loadableStats, routesManifestUri, routeManifest, context, serverRender, content, _context_redirection, url, _context_redirection_status, status;
|
|
131
|
+
var _ctx_res, urlPath, bundle, distDir, template, entryName, staticGenerate, _renderOptions_enableUnsafeCtx, enableUnsafeCtx, bundleJS, loadableUri, loadableStats, routesManifestUri, routeManifest, context, serverRender, content, _context_redirection, url, _context_redirection_status, status;
|
|
133
132
|
return __generator(this, function(_state) {
|
|
134
133
|
switch(_state.label){
|
|
135
134
|
case 0:
|
|
136
|
-
urlPath = renderOptions.urlPath, bundle = renderOptions.bundle, distDir = renderOptions.distDir, template = renderOptions.template, entryName = renderOptions.entryName, staticGenerate = renderOptions.staticGenerate;
|
|
135
|
+
urlPath = renderOptions.urlPath, bundle = renderOptions.bundle, distDir = renderOptions.distDir, template = renderOptions.template, entryName = renderOptions.entryName, staticGenerate = renderOptions.staticGenerate, _renderOptions_enableUnsafeCtx = renderOptions.enableUnsafeCtx, enableUnsafeCtx = _renderOptions_enableUnsafeCtx === void 0 ? false : _renderOptions_enableUnsafeCtx;
|
|
137
136
|
bundleJS = path.join(distDir, bundle);
|
|
138
137
|
loadableUri = path.join(distDir, LOADABLE_STATS_FILE);
|
|
139
138
|
loadableStats = fs.existsSync(loadableUri) ? require(loadableUri) : "";
|
|
@@ -147,7 +146,6 @@ var render = function() {
|
|
|
147
146
|
host: ctx.host,
|
|
148
147
|
query: ctx.query,
|
|
149
148
|
url: ctx.href,
|
|
150
|
-
cookieMap: cookie.parse(ctx.headers.cookie || ""),
|
|
151
149
|
headers: ctx.headers
|
|
152
150
|
},
|
|
153
151
|
response: {
|
|
@@ -163,12 +161,14 @@ var render = function() {
|
|
|
163
161
|
template: template,
|
|
164
162
|
loadableStats: loadableStats,
|
|
165
163
|
routeManifest: routeManifest,
|
|
164
|
+
// for streaming ssr
|
|
166
165
|
entryName: entryName,
|
|
167
166
|
staticGenerate: staticGenerate,
|
|
168
167
|
logger: void 0,
|
|
169
168
|
metrics: void 0,
|
|
170
169
|
req: ctx.req,
|
|
171
|
-
res: ctx.res
|
|
170
|
+
res: ctx.res,
|
|
171
|
+
enableUnsafeCtx: enableUnsafeCtx
|
|
172
172
|
};
|
|
173
173
|
context.logger = createLogger(context, ctx.logger);
|
|
174
174
|
context.metrics = createMetrics(context, ctx.metrics);
|
|
@@ -41,6 +41,7 @@ var RouteMatchManager = /*#__PURE__*/ function() {
|
|
|
41
41
|
}
|
|
42
42
|
_createClass(RouteMatchManager, [
|
|
43
43
|
{
|
|
44
|
+
// get all routes matches pathname
|
|
44
45
|
key: "filter",
|
|
45
46
|
value: function filter(pathname) {
|
|
46
47
|
return this.matchers.reduce(function(matches, matcher) {
|
|
@@ -52,6 +53,7 @@ var RouteMatchManager = /*#__PURE__*/ function() {
|
|
|
52
53
|
}
|
|
53
54
|
},
|
|
54
55
|
{
|
|
56
|
+
// get best match from a set of matches
|
|
55
57
|
key: "best",
|
|
56
58
|
value: function best(pathname, matches) {
|
|
57
59
|
var best;
|
|
@@ -87,6 +89,7 @@ var RouteMatchManager = /*#__PURE__*/ function() {
|
|
|
87
89
|
}
|
|
88
90
|
},
|
|
89
91
|
{
|
|
92
|
+
// reset routes matcher
|
|
90
93
|
key: "reset",
|
|
91
94
|
value: function reset(specs) {
|
|
92
95
|
this.specs = specs;
|
|
@@ -98,6 +101,7 @@ var RouteMatchManager = /*#__PURE__*/ function() {
|
|
|
98
101
|
}
|
|
99
102
|
},
|
|
100
103
|
{
|
|
104
|
+
// get best match from all matcher in manager
|
|
101
105
|
key: "match",
|
|
102
106
|
value: function match(pathname) {
|
|
103
107
|
var matches = this.filter(pathname);
|
|
@@ -61,6 +61,7 @@ var RouteMatcher = /*#__PURE__*/ function() {
|
|
|
61
61
|
}
|
|
62
62
|
_createClass(RouteMatcher, [
|
|
63
63
|
{
|
|
64
|
+
// generate modern route object
|
|
64
65
|
key: "generate",
|
|
65
66
|
value: function generate(url) {
|
|
66
67
|
var route = new ModernRoute(this.spec);
|
|
@@ -84,6 +85,7 @@ var RouteMatcher = /*#__PURE__*/ function() {
|
|
|
84
85
|
}
|
|
85
86
|
},
|
|
86
87
|
{
|
|
88
|
+
// get match url length
|
|
87
89
|
key: "matchLength",
|
|
88
90
|
value: function matchLength(pathname) {
|
|
89
91
|
if (!this.urlReg) {
|
|
@@ -96,6 +98,7 @@ var RouteMatcher = /*#__PURE__*/ function() {
|
|
|
96
98
|
}
|
|
97
99
|
},
|
|
98
100
|
{
|
|
101
|
+
// if match url path
|
|
99
102
|
key: "matchUrlPath",
|
|
100
103
|
value: function matchUrlPath(requestUrl) {
|
|
101
104
|
var urlWithoutSlash = requestUrl.endsWith("/") && requestUrl !== "/" ? requestUrl.slice(0, -1) : requestUrl;
|
|
@@ -121,6 +124,7 @@ var RouteMatcher = /*#__PURE__*/ function() {
|
|
|
121
124
|
}
|
|
122
125
|
},
|
|
123
126
|
{
|
|
127
|
+
// compiler urlPath to regexp if necessary
|
|
124
128
|
key: "setupUrlPath",
|
|
125
129
|
value: function setupUrlPath() {
|
|
126
130
|
var urlPath = this.spec.urlPath;
|
|
@@ -146,7 +146,8 @@ var faviconFallbackHandler = function(context, next) {
|
|
|
146
146
|
var createStaticFileHandler = function(rules) {
|
|
147
147
|
var output = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
|
|
148
148
|
return function() {
|
|
149
|
-
var _ref =
|
|
149
|
+
var _ref = // eslint-disable-next-line consistent-return
|
|
150
|
+
_asyncToGenerator(function(context, next) {
|
|
150
151
|
var requestUrl, req, res, _output_assetPrefix, assetPrefix, hitRule, resume;
|
|
151
152
|
return __generator(this, function(_state) {
|
|
152
153
|
requestUrl = context.url, req = context.req, res = context.res;
|
package/dist/esm/server/index.js
CHANGED
|
@@ -246,7 +246,20 @@ var Server = /*#__PURE__*/ function() {
|
|
|
246
246
|
_createClass(Server, [
|
|
247
247
|
{
|
|
248
248
|
key: "init",
|
|
249
|
-
value:
|
|
249
|
+
value: /**
|
|
250
|
+
* 初始化顺序
|
|
251
|
+
* - 读取 .env.{process.env.MODERN_ENV} 文件,加载环境变量
|
|
252
|
+
* - 获取 server runtime config
|
|
253
|
+
* - 设置 context
|
|
254
|
+
* - 创建 hooksRunner
|
|
255
|
+
* - 合并插件,内置插件和 serverConfig 中配置的插件
|
|
256
|
+
* - 执行 config hook
|
|
257
|
+
* - 获取最终的配置
|
|
258
|
+
* - 设置配置到 context
|
|
259
|
+
* - 初始化 server
|
|
260
|
+
* - 执行 prepare hook
|
|
261
|
+
* - 执行 server init
|
|
262
|
+
*/ function init() {
|
|
250
263
|
var _this = this;
|
|
251
264
|
return _asyncToGenerator(function() {
|
|
252
265
|
var options;
|
|
@@ -309,7 +322,11 @@ var Server = /*#__PURE__*/ function() {
|
|
|
309
322
|
}
|
|
310
323
|
},
|
|
311
324
|
{
|
|
312
|
-
|
|
325
|
+
/**
|
|
326
|
+
* Execute config hooks
|
|
327
|
+
* @param runner
|
|
328
|
+
* @param options
|
|
329
|
+
*/ key: "runConfigHook",
|
|
313
330
|
value: function runConfigHook(runner, serverConfig) {
|
|
314
331
|
var newServerConfig = runner.config(serverConfig || {});
|
|
315
332
|
return newServerConfig;
|
|
@@ -340,7 +357,10 @@ var Server = /*#__PURE__*/ function() {
|
|
|
340
357
|
},
|
|
341
358
|
{
|
|
342
359
|
key: "initConfig",
|
|
343
|
-
value:
|
|
360
|
+
value: /**
|
|
361
|
+
*
|
|
362
|
+
* merge cliConfig and serverConfig
|
|
363
|
+
*/ function initConfig(runner, options) {
|
|
344
364
|
var _this = this;
|
|
345
365
|
return _asyncToGenerator(function() {
|
|
346
366
|
var pwd, config, serverConfig, finalServerConfig, resolvedConfigPath;
|
|
@@ -382,6 +402,11 @@ var Server = /*#__PURE__*/ function() {
|
|
|
382
402
|
listener === null || listener === void 0 ? void 0 : listener();
|
|
383
403
|
};
|
|
384
404
|
if (typeof options === "object") {
|
|
405
|
+
if (process.env.PORT) {
|
|
406
|
+
Object.assign(options, {
|
|
407
|
+
port: process.env.PORT
|
|
408
|
+
});
|
|
409
|
+
}
|
|
385
410
|
this.app.listen(options, callback);
|
|
386
411
|
} else {
|
|
387
412
|
this.app.listen(process.env.PORT || options || 8080, callback);
|
|
@@ -471,7 +496,7 @@ var Server = /*#__PURE__*/ function() {
|
|
|
471
496
|
key: "initAppContext",
|
|
472
497
|
value: function initAppContext() {
|
|
473
498
|
var options = this.options;
|
|
474
|
-
var appDirectory = options.pwd, _options_plugins = options.plugins, plugins = _options_plugins === void 0 ? [] : _options_plugins, config = options.config
|
|
499
|
+
var appDirectory = options.pwd, _options_plugins = options.plugins, plugins = _options_plugins === void 0 ? [] : _options_plugins, config = options.config;
|
|
475
500
|
var serverPlugins = plugins.map(function(p) {
|
|
476
501
|
return {
|
|
477
502
|
server: p
|
|
@@ -479,10 +504,8 @@ var Server = /*#__PURE__*/ function() {
|
|
|
479
504
|
});
|
|
480
505
|
return {
|
|
481
506
|
appDirectory: appDirectory,
|
|
482
|
-
apiDirectory: appContext === null || appContext === void 0 ? void 0 : appContext.apiDirectory,
|
|
483
|
-
lambdaDirectory: appContext === null || appContext === void 0 ? void 0 : appContext.lambdaDirectory,
|
|
484
|
-
sharedDirectory: (appContext === null || appContext === void 0 ? void 0 : appContext.sharedDirectory) || path.resolve(appDirectory, SHARED_DIR),
|
|
485
507
|
distDirectory: path.join(appDirectory, config.output.path || "dist"),
|
|
508
|
+
sharedDirectory: path.resolve(appDirectory, SHARED_DIR),
|
|
486
509
|
plugins: serverPlugins
|
|
487
510
|
};
|
|
488
511
|
}
|
|
@@ -216,8 +216,11 @@ var ModernServer = /*#__PURE__*/ function() {
|
|
|
216
216
|
function ModernServer(param) {
|
|
217
217
|
var pwd = param.pwd, config = param.config, routes = param.routes, staticGenerate = param.staticGenerate, logger = param.logger, metrics = param.metrics, runMode = param.runMode, proxyTarget = param.proxyTarget;
|
|
218
218
|
_classCallCheck(this, ModernServer);
|
|
219
|
+
// appDirectory
|
|
219
220
|
_defineProperty(this, "pwd", void 0);
|
|
221
|
+
// product dist dir
|
|
220
222
|
_defineProperty(this, "distDir", void 0);
|
|
223
|
+
// work on src or dist
|
|
221
224
|
_defineProperty(this, "workDir", void 0);
|
|
222
225
|
_defineProperty(this, "router", void 0);
|
|
223
226
|
_defineProperty(this, "conf", void 0);
|
|
@@ -254,7 +257,8 @@ var ModernServer = /*#__PURE__*/ function() {
|
|
|
254
257
|
_createClass(ModernServer, [
|
|
255
258
|
{
|
|
256
259
|
key: "onInit",
|
|
257
|
-
value:
|
|
260
|
+
value: // server prepare
|
|
261
|
+
function onInit(runner, app) {
|
|
258
262
|
var _this = this;
|
|
259
263
|
return _asyncToGenerator(function() {
|
|
260
264
|
var _conf_bff, _this_conf_server, distDir, staticGenerate, conf, usageRoutes, staticPathRegExp, ssrConfig, forceCSR;
|
|
@@ -323,6 +327,7 @@ var ModernServer = /*#__PURE__*/ function() {
|
|
|
323
327
|
}
|
|
324
328
|
},
|
|
325
329
|
{
|
|
330
|
+
// server ready
|
|
326
331
|
key: "onRepack",
|
|
327
332
|
value: function onRepack(_) {}
|
|
328
333
|
},
|
|
@@ -382,6 +387,7 @@ var ModernServer = /*#__PURE__*/ function() {
|
|
|
382
387
|
}
|
|
383
388
|
},
|
|
384
389
|
{
|
|
390
|
+
// exposed requestHandler
|
|
385
391
|
key: "getRequestHandler",
|
|
386
392
|
value: function getRequestHandler() {
|
|
387
393
|
return this.requestHandler.bind(this);
|
|
@@ -442,6 +448,7 @@ var ModernServer = /*#__PURE__*/ function() {
|
|
|
442
448
|
}
|
|
443
449
|
},
|
|
444
450
|
{
|
|
451
|
+
/* —————————————————————— function will be overwrite —————————————————————— */ // get routes info
|
|
445
452
|
key: "getRoutes",
|
|
446
453
|
value: function getRoutes() {
|
|
447
454
|
if (this.presetRoutes) {
|
|
@@ -456,12 +463,15 @@ var ModernServer = /*#__PURE__*/ function() {
|
|
|
456
463
|
}
|
|
457
464
|
},
|
|
458
465
|
{
|
|
466
|
+
// add promisify request handler to server
|
|
467
|
+
// handler should do not do more things after invoke next
|
|
459
468
|
key: "addHandler",
|
|
460
469
|
value: function addHandler(handler) {
|
|
461
470
|
this.handlers.push(handler);
|
|
462
471
|
}
|
|
463
472
|
},
|
|
464
473
|
{
|
|
474
|
+
// return 404 page
|
|
465
475
|
key: "render404",
|
|
466
476
|
value: function render404(context) {
|
|
467
477
|
context.error(ERROR_DIGEST.ENOTF, "404 Not Found");
|
|
@@ -502,7 +512,8 @@ var ModernServer = /*#__PURE__*/ function() {
|
|
|
502
512
|
},
|
|
503
513
|
{
|
|
504
514
|
key: "prepareFrameHandler",
|
|
505
|
-
value:
|
|
515
|
+
value: // gather frame extension and get framework handler
|
|
516
|
+
function prepareFrameHandler(options) {
|
|
506
517
|
var _this = this;
|
|
507
518
|
return _asyncToGenerator(function() {
|
|
508
519
|
var workDir, runner, _ref, onlyApi, onlyWeb, _createMiddlewareCollecter, getMiddlewares, collector, _getMiddlewares, pluginAPIExt, pluginWebExt, apiDir, serverDir, webExtension, apiExtension;
|
|
@@ -610,7 +621,6 @@ var ModernServer = /*#__PURE__*/ function() {
|
|
|
610
621
|
pwd: workDir,
|
|
611
622
|
config: extension,
|
|
612
623
|
prefix: Array.isArray(prefix) ? prefix[0] : prefix,
|
|
613
|
-
httpMethodDecider: bff === null || bff === void 0 ? void 0 : bff.httpMethodDecider,
|
|
614
624
|
render: _this.render.bind(_this)
|
|
615
625
|
}, {
|
|
616
626
|
onLast: function() {
|
|
@@ -714,6 +724,7 @@ var ModernServer = /*#__PURE__*/ function() {
|
|
|
714
724
|
}
|
|
715
725
|
},
|
|
716
726
|
{
|
|
727
|
+
// warmup ssr function
|
|
717
728
|
key: "warmupSSRBundle",
|
|
718
729
|
value: function warmupSSRBundle() {
|
|
719
730
|
var distDir = this.distDir;
|
|
@@ -735,7 +746,8 @@ var ModernServer = /*#__PURE__*/ function() {
|
|
|
735
746
|
},
|
|
736
747
|
{
|
|
737
748
|
key: "routeHandler",
|
|
738
|
-
value: function
|
|
749
|
+
value: /* —————————————————————— private function —————————————————————— */ // handler route.json, include api / csr / ssr
|
|
750
|
+
function routeHandler(context) {
|
|
739
751
|
var _this = this;
|
|
740
752
|
return _asyncToGenerator(function() {
|
|
741
753
|
var res, matched, route, afterMatchContext, _afterMatchContext_router, current, url, status, matched2, middlewareContext, renderResult, contentStream, response, afterRenderContext;
|
|
@@ -920,6 +932,7 @@ var ModernServer = /*#__PURE__*/ function() {
|
|
|
920
932
|
}
|
|
921
933
|
},
|
|
922
934
|
{
|
|
935
|
+
// compose handlers and create the final handler
|
|
923
936
|
key: "compose",
|
|
924
937
|
value: function compose() {
|
|
925
938
|
var _this = this;
|
|
@@ -6,6 +6,9 @@ import fresh from "fresh";
|
|
|
6
6
|
import { headersWithoutCookie } from "../../utils";
|
|
7
7
|
class ModernServerContext {
|
|
8
8
|
constructor(req, res, options) {
|
|
9
|
+
/**
|
|
10
|
+
* url params
|
|
11
|
+
*/
|
|
9
12
|
this.params = {};
|
|
10
13
|
this.options = {};
|
|
11
14
|
this.req = req;
|
|
@@ -28,6 +31,7 @@ class ModernServerContext {
|
|
|
28
31
|
this.send(body);
|
|
29
32
|
};
|
|
30
33
|
}
|
|
34
|
+
// compat express res.send, only support etag now
|
|
31
35
|
send(body) {
|
|
32
36
|
try {
|
|
33
37
|
const generateETag = !this.res.getHeader("ETag") && this.options.etag;
|
|
@@ -77,6 +81,7 @@ class ModernServerContext {
|
|
|
77
81
|
}
|
|
78
82
|
return false;
|
|
79
83
|
}
|
|
84
|
+
/* request property */
|
|
80
85
|
get headers() {
|
|
81
86
|
return this.req.headers;
|
|
82
87
|
}
|
|
@@ -137,12 +142,16 @@ class ModernServerContext {
|
|
|
137
142
|
const str = this.querystring;
|
|
138
143
|
return qs.parse(str);
|
|
139
144
|
}
|
|
145
|
+
/* response property */
|
|
140
146
|
get status() {
|
|
141
147
|
return this.res.statusCode;
|
|
142
148
|
}
|
|
143
149
|
set status(statusCode) {
|
|
144
150
|
this.res.statusCode = statusCode;
|
|
145
151
|
}
|
|
152
|
+
/**
|
|
153
|
+
* 判断链接是否已经关闭
|
|
154
|
+
*/
|
|
146
155
|
resHasHandled() {
|
|
147
156
|
return this.res.writableEnded;
|
|
148
157
|
}
|
|
@@ -12,11 +12,13 @@ const createCacheItem = async (filepath, mtime) => {
|
|
|
12
12
|
};
|
|
13
13
|
};
|
|
14
14
|
class LruReader {
|
|
15
|
+
// private timer?: NodeJS.Timeout;
|
|
15
16
|
constructor() {
|
|
16
17
|
this.cache = new LRU({
|
|
17
18
|
max: 256 * MB,
|
|
18
19
|
length: getContentLength,
|
|
19
20
|
maxAge: 5 * 60 * 5e3
|
|
21
|
+
// 60s
|
|
20
22
|
});
|
|
21
23
|
}
|
|
22
24
|
init() {
|
|
@@ -61,6 +63,9 @@ class LruReader {
|
|
|
61
63
|
}
|
|
62
64
|
}
|
|
63
65
|
}
|
|
66
|
+
// private timeTask() {
|
|
67
|
+
// this.timer = setInterval(() => this.update, 5 * 60 * 1000).unref();
|
|
68
|
+
// }
|
|
64
69
|
}
|
|
65
70
|
const reader = new LruReader();
|
|
66
71
|
const readFile = async (filepath) => {
|
|
@@ -6,12 +6,19 @@ import {
|
|
|
6
6
|
ROUTE_MINIFEST_FILE,
|
|
7
7
|
SERVER_RENDER_FUNCTION_NAME
|
|
8
8
|
} from "@modern-js/utils";
|
|
9
|
-
import cookie from "cookie";
|
|
10
9
|
import cache from "./cache";
|
|
11
10
|
import { createLogger, createMetrics } from "./measure";
|
|
12
11
|
const render = async (ctx, renderOptions, runner) => {
|
|
13
12
|
var _a;
|
|
14
|
-
const {
|
|
13
|
+
const {
|
|
14
|
+
urlPath,
|
|
15
|
+
bundle,
|
|
16
|
+
distDir,
|
|
17
|
+
template,
|
|
18
|
+
entryName,
|
|
19
|
+
staticGenerate,
|
|
20
|
+
enableUnsafeCtx = false
|
|
21
|
+
} = renderOptions;
|
|
15
22
|
const bundleJS = path.join(distDir, bundle);
|
|
16
23
|
const loadableUri = path.join(distDir, LOADABLE_STATS_FILE);
|
|
17
24
|
const loadableStats = fs.existsSync(loadableUri) ? require(loadableUri) : "";
|
|
@@ -25,7 +32,6 @@ const render = async (ctx, renderOptions, runner) => {
|
|
|
25
32
|
host: ctx.host,
|
|
26
33
|
query: ctx.query,
|
|
27
34
|
url: ctx.href,
|
|
28
|
-
cookieMap: cookie.parse(ctx.headers.cookie || ""),
|
|
29
35
|
headers: ctx.headers
|
|
30
36
|
},
|
|
31
37
|
response: {
|
|
@@ -41,12 +47,14 @@ const render = async (ctx, renderOptions, runner) => {
|
|
|
41
47
|
template,
|
|
42
48
|
loadableStats,
|
|
43
49
|
routeManifest,
|
|
50
|
+
// for streaming ssr
|
|
44
51
|
entryName,
|
|
45
52
|
staticGenerate,
|
|
46
53
|
logger: void 0,
|
|
47
54
|
metrics: void 0,
|
|
48
55
|
req: ctx.req,
|
|
49
|
-
res: ctx.res
|
|
56
|
+
res: ctx.res,
|
|
57
|
+
enableUnsafeCtx
|
|
50
58
|
};
|
|
51
59
|
context.logger = createLogger(context, ctx.logger);
|
|
52
60
|
context.metrics = createMetrics(context, ctx.metrics);
|
|
@@ -4,6 +4,7 @@ class RouteMatchManager {
|
|
|
4
4
|
this.specs = [];
|
|
5
5
|
this.matchers = [];
|
|
6
6
|
}
|
|
7
|
+
// get all routes matches pathname
|
|
7
8
|
filter(pathname) {
|
|
8
9
|
return this.matchers.reduce((matches, matcher) => {
|
|
9
10
|
if (matcher.matchUrlPath(pathname)) {
|
|
@@ -12,6 +13,7 @@ class RouteMatchManager {
|
|
|
12
13
|
return matches;
|
|
13
14
|
}, []);
|
|
14
15
|
}
|
|
16
|
+
// get best match from a set of matches
|
|
15
17
|
best(pathname, matches) {
|
|
16
18
|
let best;
|
|
17
19
|
let matchedLen = 0;
|
|
@@ -27,6 +29,7 @@ class RouteMatchManager {
|
|
|
27
29
|
}
|
|
28
30
|
return best;
|
|
29
31
|
}
|
|
32
|
+
// reset routes matcher
|
|
30
33
|
reset(specs) {
|
|
31
34
|
this.specs = specs;
|
|
32
35
|
const matchers = specs.reduce((ms, spec) => {
|
|
@@ -35,6 +38,7 @@ class RouteMatchManager {
|
|
|
35
38
|
}, []);
|
|
36
39
|
this.matchers = matchers;
|
|
37
40
|
}
|
|
41
|
+
// get best match from all matcher in manager
|
|
38
42
|
match(pathname) {
|
|
39
43
|
const matches = this.filter(pathname);
|
|
40
44
|
const best = this.best(pathname, matches);
|
|
@@ -22,6 +22,7 @@ class RouteMatcher {
|
|
|
22
22
|
this.spec = spec;
|
|
23
23
|
this.setupUrlPath();
|
|
24
24
|
}
|
|
25
|
+
// generate modern route object
|
|
25
26
|
generate(url) {
|
|
26
27
|
const route = new ModernRoute(this.spec);
|
|
27
28
|
if (this.urlPath) {
|
|
@@ -39,6 +40,7 @@ class RouteMatcher {
|
|
|
39
40
|
return matchResult.params;
|
|
40
41
|
}
|
|
41
42
|
}
|
|
43
|
+
// get match url length
|
|
42
44
|
matchLength(pathname) {
|
|
43
45
|
var _a;
|
|
44
46
|
if (!this.urlReg) {
|
|
@@ -48,6 +50,7 @@ class RouteMatcher {
|
|
|
48
50
|
return ((_a = result == null ? void 0 : result[0]) == null ? void 0 : _a.length) || null;
|
|
49
51
|
}
|
|
50
52
|
}
|
|
53
|
+
// if match url path
|
|
51
54
|
matchUrlPath(requestUrl) {
|
|
52
55
|
let urlWithoutSlash = requestUrl.endsWith("/") && requestUrl !== "/" ? requestUrl.slice(0, -1) : requestUrl;
|
|
53
56
|
urlWithoutSlash = removeHtmlSuffix(urlWithoutSlash);
|
|
@@ -67,6 +70,7 @@ class RouteMatcher {
|
|
|
67
70
|
matchEntry(entryName) {
|
|
68
71
|
return this.spec.entryName === entryName;
|
|
69
72
|
}
|
|
73
|
+
// compiler urlPath to regexp if necessary
|
|
70
74
|
setupUrlPath() {
|
|
71
75
|
const { urlPath } = this.spec;
|
|
72
76
|
this.urlPath = urlPath === "/" ? urlPath : removeTailSlash(urlPath);
|
|
@@ -20,27 +20,30 @@ const faviconFallbackHandler = (context, next) => {
|
|
|
20
20
|
next();
|
|
21
21
|
}
|
|
22
22
|
};
|
|
23
|
-
const createStaticFileHandler = (rules, output = {}) =>
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
const resume = removedPrefix(req, assetPrefix);
|
|
36
|
-
serve(hitRule.target)(req, res, () => {
|
|
37
|
-
resume();
|
|
38
|
-
next();
|
|
23
|
+
const createStaticFileHandler = (rules, output = {}) => (
|
|
24
|
+
// eslint-disable-next-line consistent-return
|
|
25
|
+
async (context, next) => {
|
|
26
|
+
const { url: requestUrl, req, res } = context;
|
|
27
|
+
const { assetPrefix = "/" } = output;
|
|
28
|
+
const hitRule = rules.find((item) => {
|
|
29
|
+
if (isString(item.path) && requestUrl.startsWith(item.path)) {
|
|
30
|
+
return true;
|
|
31
|
+
} else if (isRegExp(item.path) && item.path.test(requestUrl)) {
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
return false;
|
|
39
35
|
});
|
|
40
|
-
|
|
41
|
-
|
|
36
|
+
if (hitRule) {
|
|
37
|
+
const resume = removedPrefix(req, assetPrefix);
|
|
38
|
+
serve(hitRule.target)(req, res, () => {
|
|
39
|
+
resume();
|
|
40
|
+
next();
|
|
41
|
+
});
|
|
42
|
+
} else {
|
|
43
|
+
return next();
|
|
44
|
+
}
|
|
42
45
|
}
|
|
43
|
-
|
|
46
|
+
);
|
|
44
47
|
export {
|
|
45
48
|
createStaticFileHandler,
|
|
46
49
|
faviconFallbackHandler
|
|
@@ -32,6 +32,20 @@ class Server {
|
|
|
32
32
|
this.options = options;
|
|
33
33
|
this.serverConfig = {};
|
|
34
34
|
}
|
|
35
|
+
/**
|
|
36
|
+
* 初始化顺序
|
|
37
|
+
* - 读取 .env.{process.env.MODERN_ENV} 文件,加载环境变量
|
|
38
|
+
* - 获取 server runtime config
|
|
39
|
+
* - 设置 context
|
|
40
|
+
* - 创建 hooksRunner
|
|
41
|
+
* - 合并插件,内置插件和 serverConfig 中配置的插件
|
|
42
|
+
* - 执行 config hook
|
|
43
|
+
* - 获取最终的配置
|
|
44
|
+
* - 设置配置到 context
|
|
45
|
+
* - 初始化 server
|
|
46
|
+
* - 执行 prepare hook
|
|
47
|
+
* - 执行 server init
|
|
48
|
+
*/
|
|
35
49
|
async init() {
|
|
36
50
|
const { options } = this;
|
|
37
51
|
this.loadServerEnv(options);
|
|
@@ -46,6 +60,11 @@ class Server {
|
|
|
46
60
|
await this.server.onInit(this.runner, this.app);
|
|
47
61
|
return this;
|
|
48
62
|
}
|
|
63
|
+
/**
|
|
64
|
+
* Execute config hooks
|
|
65
|
+
* @param runner
|
|
66
|
+
* @param options
|
|
67
|
+
*/
|
|
49
68
|
runConfigHook(runner, serverConfig) {
|
|
50
69
|
const newServerConfig = runner.config(serverConfig || {});
|
|
51
70
|
return newServerConfig;
|
|
@@ -63,6 +82,10 @@ class Server {
|
|
|
63
82
|
const serverConfig = requireConfig(serverConfigPath);
|
|
64
83
|
this.serverConfig = serverConfig;
|
|
65
84
|
}
|
|
85
|
+
/**
|
|
86
|
+
*
|
|
87
|
+
* merge cliConfig and serverConfig
|
|
88
|
+
*/
|
|
66
89
|
async initConfig(runner, options) {
|
|
67
90
|
const { pwd, config } = options;
|
|
68
91
|
const { serverConfig } = this;
|
|
@@ -86,6 +109,9 @@ class Server {
|
|
|
86
109
|
listener == null ? void 0 : listener();
|
|
87
110
|
};
|
|
88
111
|
if (typeof options === "object") {
|
|
112
|
+
if (process.env.PORT) {
|
|
113
|
+
Object.assign(options, { port: process.env.PORT });
|
|
114
|
+
}
|
|
89
115
|
this.app.listen(options, callback);
|
|
90
116
|
} else {
|
|
91
117
|
this.app.listen(process.env.PORT || options || 8080, callback);
|
|
@@ -130,16 +156,14 @@ class Server {
|
|
|
130
156
|
}
|
|
131
157
|
initAppContext() {
|
|
132
158
|
const { options } = this;
|
|
133
|
-
const { pwd: appDirectory, plugins = [], config
|
|
159
|
+
const { pwd: appDirectory, plugins = [], config } = options;
|
|
134
160
|
const serverPlugins = plugins.map((p) => ({
|
|
135
161
|
server: p
|
|
136
162
|
}));
|
|
137
163
|
return {
|
|
138
164
|
appDirectory,
|
|
139
|
-
apiDirectory: appContext == null ? void 0 : appContext.apiDirectory,
|
|
140
|
-
lambdaDirectory: appContext == null ? void 0 : appContext.lambdaDirectory,
|
|
141
|
-
sharedDirectory: (appContext == null ? void 0 : appContext.sharedDirectory) || path.resolve(appDirectory, SHARED_DIR),
|
|
142
165
|
distDirectory: path.join(appDirectory, config.output.path || "dist"),
|
|
166
|
+
sharedDirectory: path.resolve(appDirectory, SHARED_DIR),
|
|
143
167
|
plugins: serverPlugins
|
|
144
168
|
};
|
|
145
169
|
}
|