santi 0.0.0-beta.39 → 0.0.0-beta.42
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/config/PrerenderSPAPlugin.js +12 -2
- package/config/index.js +2 -1
- package/config/override/addDevProxy.js +2 -1
- package/index.d.ts +48 -39
- package/lib/client/index.js +48 -39
- package/lib/client/index.js.map +1 -1
- package/lib/client/index.min.js +1 -1
- package/package.json +6 -3
- package/scripts/serve/csr/index.js +3 -1
- package/scripts/serve/ssr/index.js +1 -0
- package/server/koaFallbackStatic/index.js +3 -1
- package/server/koaSsr/Renderer.js +8 -2
- package/server/koaSsr/index.js +7 -1
- package/server/renderWithJSDOM/getPageContent.js +19 -1
- package/server/renderWithJSDOM/uncss.js +325 -0
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
const path = require('path')
|
|
6
6
|
const Prerenderer = require('@prerenderer/prerenderer')
|
|
7
7
|
const { minify } = require('html-minifier')
|
|
8
|
+
const express = require('express')
|
|
8
9
|
|
|
9
10
|
function PrerenderSPAPlugin(...args) {
|
|
10
11
|
const rendererOptions = {} // Primarily for backwards-compatibility.
|
|
@@ -78,10 +79,19 @@ PrerenderSPAPlugin.prototype.apply = function(compiler) {
|
|
|
78
79
|
|
|
79
80
|
const afterEmit = (compilation, done) => {
|
|
80
81
|
const PrerendererInstance = new Prerenderer(this._options)
|
|
82
|
+
const publicPath = this._options.publicPath !== '/' ? this._options.publicPath.replace(/\/$/, '') : '/'
|
|
83
|
+
|
|
84
|
+
if (publicPath !== '/') {
|
|
85
|
+
PrerendererInstance._server._expressServer.use(publicPath, express.static(this._options.staticDir, {
|
|
86
|
+
dotfiles: 'allow'
|
|
87
|
+
}))
|
|
88
|
+
}
|
|
81
89
|
|
|
82
90
|
PrerendererInstance.initialize()
|
|
83
91
|
.then(() => {
|
|
84
|
-
return PrerendererInstance.renderRoutes(this._options.routes
|
|
92
|
+
return PrerendererInstance.renderRoutes(this._options.routes.map(route => (
|
|
93
|
+
publicPath !== '/' ? `${publicPath}${route}` : route
|
|
94
|
+
)) || [])
|
|
85
95
|
})
|
|
86
96
|
// Backwards-compatibility with v2 (postprocessHTML should be migrated to postProcess)
|
|
87
97
|
.then(renderedRoutes =>
|
|
@@ -132,7 +142,7 @@ PrerenderSPAPlugin.prototype.apply = function(compiler) {
|
|
|
132
142
|
if (!rendered.outputPath) {
|
|
133
143
|
rendered.outputPath = path.join(
|
|
134
144
|
this._options.outputDir || this._options.staticDir,
|
|
135
|
-
rendered.route,
|
|
145
|
+
publicPath !== '/' ? rendered.route.replace(publicPath, '') : rendered.route,
|
|
136
146
|
'index.html'
|
|
137
147
|
)
|
|
138
148
|
}
|
package/config/index.js
CHANGED
|
@@ -98,6 +98,7 @@ module.exports = {
|
|
|
98
98
|
new PrerenderSPAPlugin({
|
|
99
99
|
// Required - The path to the webpack-outputted app to prerender.
|
|
100
100
|
staticDir: paths.appBuild,
|
|
101
|
+
publicPath: paths.publicUrlOrPath,
|
|
101
102
|
// Required - Routes to render.
|
|
102
103
|
routes: prerenderRoutes,
|
|
103
104
|
server: {
|
|
@@ -132,6 +133,6 @@ module.exports = {
|
|
|
132
133
|
),
|
|
133
134
|
devServer: overrideDevServer.apply(
|
|
134
135
|
null,
|
|
135
|
-
[...devServer, addDevProxy()].filter(Boolean)
|
|
136
|
+
[...devServer, addDevProxy({ publicPath: paths.publicUrlOrPath })].filter(Boolean)
|
|
136
137
|
),
|
|
137
138
|
}
|
|
@@ -5,7 +5,7 @@ const { devSsr, getConfig } = require('../../server')
|
|
|
5
5
|
|
|
6
6
|
const { ssr, mode, proxy: proxyTable } = getConfig()
|
|
7
7
|
|
|
8
|
-
const addDevProxy = () => (config) => {
|
|
8
|
+
const addDevProxy = ({ publicPath } = {}) => (config) => {
|
|
9
9
|
const originBefore = config.before
|
|
10
10
|
const originOnListening = config.onListening
|
|
11
11
|
|
|
@@ -27,6 +27,7 @@ const addDevProxy = () => (config) => {
|
|
|
27
27
|
app.use(
|
|
28
28
|
devSsr({
|
|
29
29
|
...ssr,
|
|
30
|
+
publicPath,
|
|
30
31
|
logError: false,
|
|
31
32
|
renderAfterTimeout: ssr.timeout || 1000,
|
|
32
33
|
ejectPortModifier(modifier) {
|
package/index.d.ts
CHANGED
|
@@ -3,6 +3,44 @@ import hoistStatics from 'hoist-non-react-statics';
|
|
|
3
3
|
import NodeKey from 'react-node-key';
|
|
4
4
|
import ReactDOM from 'react-dom';
|
|
5
5
|
|
|
6
|
+
function ownKeys(object, enumerableOnly) {
|
|
7
|
+
var keys = Object.keys(object);
|
|
8
|
+
|
|
9
|
+
if (Object.getOwnPropertySymbols) {
|
|
10
|
+
var symbols = Object.getOwnPropertySymbols(object);
|
|
11
|
+
|
|
12
|
+
if (enumerableOnly) {
|
|
13
|
+
symbols = symbols.filter(function (sym) {
|
|
14
|
+
return Object.getOwnPropertyDescriptor(object, sym).enumerable;
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
keys.push.apply(keys, symbols);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
return keys;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function _objectSpread2(target) {
|
|
25
|
+
for (var i = 1; i < arguments.length; i++) {
|
|
26
|
+
var source = arguments[i] != null ? arguments[i] : {};
|
|
27
|
+
|
|
28
|
+
if (i % 2) {
|
|
29
|
+
ownKeys(Object(source), true).forEach(function (key) {
|
|
30
|
+
_defineProperty(target, key, source[key]);
|
|
31
|
+
});
|
|
32
|
+
} else if (Object.getOwnPropertyDescriptors) {
|
|
33
|
+
Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
|
|
34
|
+
} else {
|
|
35
|
+
ownKeys(Object(source)).forEach(function (key) {
|
|
36
|
+
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
return target;
|
|
42
|
+
}
|
|
43
|
+
|
|
6
44
|
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
|
|
7
45
|
try {
|
|
8
46
|
var info = gen[key](arg);
|
|
@@ -72,40 +110,6 @@ function _extends() {
|
|
|
72
110
|
return _extends.apply(this, arguments);
|
|
73
111
|
}
|
|
74
112
|
|
|
75
|
-
function ownKeys(object, enumerableOnly) {
|
|
76
|
-
var keys = Object.keys(object);
|
|
77
|
-
|
|
78
|
-
if (Object.getOwnPropertySymbols) {
|
|
79
|
-
var symbols = Object.getOwnPropertySymbols(object);
|
|
80
|
-
if (enumerableOnly) symbols = symbols.filter(function (sym) {
|
|
81
|
-
return Object.getOwnPropertyDescriptor(object, sym).enumerable;
|
|
82
|
-
});
|
|
83
|
-
keys.push.apply(keys, symbols);
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
return keys;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
function _objectSpread2(target) {
|
|
90
|
-
for (var i = 1; i < arguments.length; i++) {
|
|
91
|
-
var source = arguments[i] != null ? arguments[i] : {};
|
|
92
|
-
|
|
93
|
-
if (i % 2) {
|
|
94
|
-
ownKeys(Object(source), true).forEach(function (key) {
|
|
95
|
-
_defineProperty(target, key, source[key]);
|
|
96
|
-
});
|
|
97
|
-
} else if (Object.getOwnPropertyDescriptors) {
|
|
98
|
-
Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
|
|
99
|
-
} else {
|
|
100
|
-
ownKeys(Object(source)).forEach(function (key) {
|
|
101
|
-
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
return target;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
113
|
function _objectWithoutPropertiesLoose(source, excluded) {
|
|
110
114
|
if (source == null) return {};
|
|
111
115
|
var target = {};
|
|
@@ -151,14 +155,17 @@ function _arrayWithHoles(arr) {
|
|
|
151
155
|
}
|
|
152
156
|
|
|
153
157
|
function _iterableToArrayLimit(arr, i) {
|
|
154
|
-
|
|
158
|
+
var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
|
|
159
|
+
|
|
160
|
+
if (_i == null) return;
|
|
155
161
|
var _arr = [];
|
|
156
162
|
var _n = true;
|
|
157
163
|
var _d = false;
|
|
158
|
-
|
|
164
|
+
|
|
165
|
+
var _s, _e;
|
|
159
166
|
|
|
160
167
|
try {
|
|
161
|
-
for (
|
|
168
|
+
for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) {
|
|
162
169
|
_arr.push(_s.value);
|
|
163
170
|
|
|
164
171
|
if (i && _arr.length === i) break;
|
|
@@ -310,6 +317,7 @@ var promiseGuess = function promiseGuess(executor, valuer) {
|
|
|
310
317
|
};
|
|
311
318
|
};
|
|
312
319
|
|
|
320
|
+
var _excluded = ["forwardRef", "__key"];
|
|
313
321
|
var _filehash = "nNBh";
|
|
314
322
|
var context = /*#__PURE__*/createContext();
|
|
315
323
|
var Provider = context.Provider;
|
|
@@ -318,7 +326,7 @@ function withSanti(Component) {
|
|
|
318
326
|
function WrappedComponent(_ref) {
|
|
319
327
|
var forwardRef = _ref.forwardRef,
|
|
320
328
|
nodeKey = _ref.__key,
|
|
321
|
-
props = _objectWithoutProperties(_ref,
|
|
329
|
+
props = _objectWithoutProperties(_ref, _excluded);
|
|
322
330
|
|
|
323
331
|
var count = 0;
|
|
324
332
|
var contextValue = useMemo(function () {
|
|
@@ -497,6 +505,7 @@ function useState(initialState, key) {
|
|
|
497
505
|
}, nodeKey];
|
|
498
506
|
}
|
|
499
507
|
|
|
508
|
+
var _excluded$1 = ["forwardedRef"];
|
|
500
509
|
var _filehash$1 = "8NS2";
|
|
501
510
|
|
|
502
511
|
var getInitialProps = function getInitialProps(fetch) {
|
|
@@ -505,7 +514,7 @@ var getInitialProps = function getInitialProps(fetch) {
|
|
|
505
514
|
return function (Component) {
|
|
506
515
|
function WrappedComponent(_ref) {
|
|
507
516
|
var forwardedRef = _ref.forwardedRef,
|
|
508
|
-
props = _objectWithoutProperties(_ref,
|
|
517
|
+
props = _objectWithoutProperties(_ref, _excluded$1);
|
|
509
518
|
|
|
510
519
|
var _useState = useState$1(false),
|
|
511
520
|
_useState2 = _slicedToArray(_useState, 2),
|
package/lib/client/index.js
CHANGED
|
@@ -10,6 +10,44 @@ var hoistStatics = _interopDefault(require('hoist-non-react-statics'));
|
|
|
10
10
|
var NodeKey = _interopDefault(require('react-node-key'));
|
|
11
11
|
var ReactDOM = _interopDefault(require('react-dom'));
|
|
12
12
|
|
|
13
|
+
function ownKeys(object, enumerableOnly) {
|
|
14
|
+
var keys = Object.keys(object);
|
|
15
|
+
|
|
16
|
+
if (Object.getOwnPropertySymbols) {
|
|
17
|
+
var symbols = Object.getOwnPropertySymbols(object);
|
|
18
|
+
|
|
19
|
+
if (enumerableOnly) {
|
|
20
|
+
symbols = symbols.filter(function (sym) {
|
|
21
|
+
return Object.getOwnPropertyDescriptor(object, sym).enumerable;
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
keys.push.apply(keys, symbols);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
return keys;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function _objectSpread2(target) {
|
|
32
|
+
for (var i = 1; i < arguments.length; i++) {
|
|
33
|
+
var source = arguments[i] != null ? arguments[i] : {};
|
|
34
|
+
|
|
35
|
+
if (i % 2) {
|
|
36
|
+
ownKeys(Object(source), true).forEach(function (key) {
|
|
37
|
+
_defineProperty(target, key, source[key]);
|
|
38
|
+
});
|
|
39
|
+
} else if (Object.getOwnPropertyDescriptors) {
|
|
40
|
+
Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
|
|
41
|
+
} else {
|
|
42
|
+
ownKeys(Object(source)).forEach(function (key) {
|
|
43
|
+
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
return target;
|
|
49
|
+
}
|
|
50
|
+
|
|
13
51
|
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
|
|
14
52
|
try {
|
|
15
53
|
var info = gen[key](arg);
|
|
@@ -79,40 +117,6 @@ function _extends() {
|
|
|
79
117
|
return _extends.apply(this, arguments);
|
|
80
118
|
}
|
|
81
119
|
|
|
82
|
-
function ownKeys(object, enumerableOnly) {
|
|
83
|
-
var keys = Object.keys(object);
|
|
84
|
-
|
|
85
|
-
if (Object.getOwnPropertySymbols) {
|
|
86
|
-
var symbols = Object.getOwnPropertySymbols(object);
|
|
87
|
-
if (enumerableOnly) symbols = symbols.filter(function (sym) {
|
|
88
|
-
return Object.getOwnPropertyDescriptor(object, sym).enumerable;
|
|
89
|
-
});
|
|
90
|
-
keys.push.apply(keys, symbols);
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
return keys;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
function _objectSpread2(target) {
|
|
97
|
-
for (var i = 1; i < arguments.length; i++) {
|
|
98
|
-
var source = arguments[i] != null ? arguments[i] : {};
|
|
99
|
-
|
|
100
|
-
if (i % 2) {
|
|
101
|
-
ownKeys(Object(source), true).forEach(function (key) {
|
|
102
|
-
_defineProperty(target, key, source[key]);
|
|
103
|
-
});
|
|
104
|
-
} else if (Object.getOwnPropertyDescriptors) {
|
|
105
|
-
Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
|
|
106
|
-
} else {
|
|
107
|
-
ownKeys(Object(source)).forEach(function (key) {
|
|
108
|
-
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
return target;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
120
|
function _objectWithoutPropertiesLoose(source, excluded) {
|
|
117
121
|
if (source == null) return {};
|
|
118
122
|
var target = {};
|
|
@@ -158,14 +162,17 @@ function _arrayWithHoles(arr) {
|
|
|
158
162
|
}
|
|
159
163
|
|
|
160
164
|
function _iterableToArrayLimit(arr, i) {
|
|
161
|
-
|
|
165
|
+
var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
|
|
166
|
+
|
|
167
|
+
if (_i == null) return;
|
|
162
168
|
var _arr = [];
|
|
163
169
|
var _n = true;
|
|
164
170
|
var _d = false;
|
|
165
|
-
|
|
171
|
+
|
|
172
|
+
var _s, _e;
|
|
166
173
|
|
|
167
174
|
try {
|
|
168
|
-
for (
|
|
175
|
+
for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) {
|
|
169
176
|
_arr.push(_s.value);
|
|
170
177
|
|
|
171
178
|
if (i && _arr.length === i) break;
|
|
@@ -317,6 +324,7 @@ var promiseGuess = function promiseGuess(executor, valuer) {
|
|
|
317
324
|
};
|
|
318
325
|
};
|
|
319
326
|
|
|
327
|
+
var _excluded = ["forwardRef", "__key"];
|
|
320
328
|
var _filehash = "nNBh";
|
|
321
329
|
var context = /*#__PURE__*/React.createContext();
|
|
322
330
|
var Provider = context.Provider;
|
|
@@ -325,7 +333,7 @@ function withSanti(Component) {
|
|
|
325
333
|
function WrappedComponent(_ref) {
|
|
326
334
|
var forwardRef = _ref.forwardRef,
|
|
327
335
|
nodeKey = _ref.__key,
|
|
328
|
-
props = _objectWithoutProperties(_ref,
|
|
336
|
+
props = _objectWithoutProperties(_ref, _excluded);
|
|
329
337
|
|
|
330
338
|
var count = 0;
|
|
331
339
|
var contextValue = React.useMemo(function () {
|
|
@@ -504,6 +512,7 @@ function useState(initialState, key) {
|
|
|
504
512
|
}, nodeKey];
|
|
505
513
|
}
|
|
506
514
|
|
|
515
|
+
var _excluded$1 = ["forwardedRef"];
|
|
507
516
|
var _filehash$1 = "8NS2";
|
|
508
517
|
|
|
509
518
|
var getInitialProps = function getInitialProps(fetch) {
|
|
@@ -512,7 +521,7 @@ var getInitialProps = function getInitialProps(fetch) {
|
|
|
512
521
|
return function (Component) {
|
|
513
522
|
function WrappedComponent(_ref) {
|
|
514
523
|
var forwardedRef = _ref.forwardedRef,
|
|
515
|
-
props = _objectWithoutProperties(_ref,
|
|
524
|
+
props = _objectWithoutProperties(_ref, _excluded$1);
|
|
516
525
|
|
|
517
526
|
var _useState = React.useState(false),
|
|
518
527
|
_useState2 = _slicedToArray(_useState, 2),
|
package/lib/client/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../client/helpers/base/is/index.js","../../client/helpers/base/try/index.js","../../client/helpers/utils.js","../../client/withSanti.js","../../client/store.js","../../client/useState.js","../../client/getInitialProps.js","../../client/ready.js","../../client/components/Container/index.js","../../client/render.js","../../client/components/Ready/index.js","../../client/components/NoSSR/index.js","../../client/index.js"],"sourcesContent":["// 值类型判断 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\nexport const isUndefined = val => typeof val === 'undefined'\n\nexport const isNull = val => val === null\n\nexport const isFunction = val => typeof val === 'function'\n\nexport const isArray = val =>\n isFunction(Array.isArray) ? Array.isArray(val) : val instanceof Array\n\nexport const isRegExp = val => val instanceof RegExp\n\nexport const isObject = val =>\n typeof val === 'object' && !(isArray(val) || isNull(val))\n\nexport const isBoolean = val => typeof val === 'boolean'\n\nexport const isString = val => typeof val === 'string'\n\nexport const isExist = val => !(isUndefined(val) || isNull(val))\n\nexport const isNaN = val =>\n isFunction(Number.isNaN) ? Number.isNaN(val) : val !== val // eslint-disable-line\n\nexport const isNumber = val => typeof val === 'number' && !isNaN(val)\n\nexport const isPromiseLike = val => isExist(val) && isFunction(val.then)\n// 值类型判断 -------------------------------------------------------------\n","import { isString, isUndefined, isFunction, isNumber } from '../is'\n\nexport const get = (obj, keys = [], defaultValue) => {\n try {\n if (isNumber(keys)) {\n keys = String(keys)\n }\n let result = (isString(keys) ? keys.split('.') : keys).reduce(\n (res, key) => res[key],\n obj\n )\n return isUndefined(result) ? defaultValue : result\n } catch (e) {\n return defaultValue\n }\n}\n\nexport const run = (obj, keys = [], ...args) => {\n keys = isString(keys) ? keys.split('.') : keys\n\n const func = get(obj, keys)\n const context = get(obj, keys.slice(0, -1))\n\n return isFunction(func) ? func.call(context, ...args) : func\n}\n\nexport const value = (...values) =>\n values.reduce(\n (value, nextValue) => (isUndefined(value) ? run(nextValue) : run(value)),\n undefined\n )\n","import { isArray, isPromiseLike } from './base/is'\n\nexport const nextTick = (func) => Promise.resolve().then(func)\n\nexport const delay = (time) =>\n new Promise((resolve) => setTimeout(resolve, time))\n\n/**\n * [防抖]\n * @param {Function} func 执行函数\n * @param {Number} wait 多少毫秒后运行一次\n */\nexport const debounce = (func, wait = 16) => {\n let timeout\n\n return function (...args) {\n clearTimeout(timeout)\n\n timeout = setTimeout(() => {\n func.apply(this, args)\n }, wait)\n\n return timeout\n }\n}\n\n/**\n * [用来智能处理Promise类型返回值]\n * 当值生成过程为 promise 时,将得到 promise 类型返回值,按约定 resolve 最终值\n * 当过程不为 promise 时将直接得到值\n * @param {Function} executor 执行过程获取\n * @param {Function} valuer 值处理过程\n */\nexport const promiseGuess = (executor, valuer) =>\n function (...args) {\n let value = executor.apply(this, args)\n\n return isPromiseLike(value)\n ? new Promise((resolve) =>\n value\n .then((value) => resolve(valuer.call(this, null, value, ...args)))\n .catch((err) => resolve(valuer.call(this, err, undefined, ...args)))\n )\n : valuer.call(this, null, value, ...args)\n }\n\nexport function getKey2Id() {\n let uuid = 0\n const map = new Map()\n\n // 对每种 NodeType 做编号处理\n return function key2Id(key) {\n let id = map.get(key)\n\n if (!id) {\n id = (++uuid).toString(32)\n map.set(key, id)\n }\n\n return id\n }\n}\n\nexport function isBrowser() {\n return !window.__SSR__\n}\n\nexport function isPrerendering() {\n return !!window.__PR__\n}\n","import React, { forwardRef, createContext, useContext, useMemo } from 'react'\nimport hoistStatics from 'hoist-non-react-statics'\nimport NodeKey from 'react-node-key'\n\nconst context = createContext()\nconst { Provider } = context\n\nfunction withSanti(Component) {\n function WrappedComponent({ forwardRef, __key: nodeKey, ...props }) {\n let count = 0\n const contextValue = useMemo(\n () => ({\n nodeKey,\n getCountedKey: () => (nodeKey ? `${nodeKey}:${count++}` : undefined)\n }),\n [nodeKey]\n )\n\n return (\n <Provider value={contextValue}>\n <Component {...props} ref={forwardRef} />\n </Provider>\n )\n }\n\n const ForwardedRefHOC = forwardRef((props, ref) => (\n <NodeKey>\n {nodeKey => (\n <WrappedComponent {...props} forwardedRef={ref} __key={nodeKey} />\n )}\n </NodeKey>\n ))\n\n return hoistStatics(ForwardedRefHOC, WrappedComponent)\n}\n\nexport function useNodeKey() {\n return (\n useContext(context) || {\n nodeKey: undefined,\n getCountedKey: () => undefined\n }\n )\n}\n\nexport function useSID() {\n const { nodeKey: sid, getCountedKey: getCountedSID } = useNodeKey()\n return { sid, getCountedSID }\n}\n\nexport default withSanti\n","import { run, isUndefined, promiseGuess, isExist } from './helpers'\n\nconst KEY = '__SSRDATA__'\n\nfunction inject() {\n let script = document.getElementById(KEY) || document.createElement('script')\n script.id = KEY\n script.innerHTML = `window.${KEY}={};`\n document.head.appendChild(script)\n}\n\nfunction bootstrap() {\n if (window.__SSR__) {\n inject()\n } else {\n if (isExist(document.getElementById(KEY))) {\n window.__SSRED__ = true\n }\n }\n const data = window[KEY] || {}\n\n function remove(key) {\n delete data[key]\n }\n\n function set(key, value) {\n if (!window.__SSR__) {\n return\n }\n data[key] = value\n document.getElementById(KEY).innerHTML = `window.${KEY}=${JSON.stringify(\n data\n )};`\n }\n\n function get(key) {\n let value = data[key]\n remove(key) // 初始值只在 html 就绪后使用一次,使用即销毁\n return value\n }\n\n return { set, get, remove }\n}\n\nconst store = bootstrap()\n\nexport default {\n get: promiseGuess(\n (key, builder) => {\n if (!key && window.__SSR__) {\n // 若无 key 则 SSR 阶段不计算\n return undefined\n }\n\n let value\n\n if (!window.__SSR__) {\n value = store.get(key)\n }\n\n if (isUndefined(value)) {\n value = run(builder)\n }\n\n return value\n },\n (err, value, key) => {\n if (!key) {\n return [null, value]\n }\n\n if (err) {\n store.remove(key)\n return [err, undefined]\n }\n\n if (window.__SSR__) {\n store.set(key, value)\n }\n\n return [null, value]\n }\n ),\n set: store.set\n}\n","import { useState as useReactState } from 'react'\n\nimport { run, debounce } from './helpers'\nimport { useNodeKey } from './withSanti'\nimport store from './store'\n\nconst warningMissingKey = debounce(() => {\n if (window.__SSR__) {\n return\n }\n\n console.warn('You shouldn\\'t use \"santi.useState\" outside a \"withSanti\"')\n}, 32)\n\nfunction useState(initialState, key) {\n const { getCountedKey } = useNodeKey()\n const nodeKey = key || run(getCountedKey)\n const [state, setState] = useReactState(() => {\n if (!nodeKey) {\n warningMissingKey()\n }\n\n const [err, value] = store.get(nodeKey, initialState)\n\n if (err) {\n console.error(err)\n }\n\n return value\n })\n\n return [\n state,\n getNextState => {\n const nextState = run(getNextState, undefined, state)\n\n store.set(nodeKey, nextState)\n\n return setState(nextState)\n },\n nodeKey\n ]\n}\n\nexport default useState\n","import React, { useState, forwardRef, useRef, useEffect } from 'react'\nimport hoistStatics from 'hoist-non-react-statics'\n\nimport { run } from './helpers'\nimport withSanti, { useNodeKey } from './withSanti'\nimport store from './store'\n\nconst getInitialProps = (fetch, fallback = null, key) => Component => {\n function WrappedComponent({ forwardedRef, ...props }) {\n const [ready, setReady] = useState(false)\n const [ssrProps, setSsrProps] = useState({})\n const mounted = useRef(true)\n const { getCountedKey } = useNodeKey()\n const nodeKey = key || run(getCountedKey)\n\n useEffect(() => {\n async function init() {\n const [err, ssrProps] = await store.get(nodeKey, () =>\n run(fetch, undefined, props)\n )\n\n if (err) {\n console.error('[getInitialProps error]', err)\n return\n }\n\n if (mounted.current && ssrProps) {\n setSsrProps(ssrProps)\n setReady(true)\n }\n }\n\n init()\n\n return () => {\n mounted.current = false\n }\n }, [])\n\n return ready ? (\n <Component {...{ ...props, ...ssrProps }} ref={forwardedRef} />\n ) : (\n run(fallback, undefined, props)\n )\n }\n\n const ForwardedRefHOC = forwardRef((props, ref) => (\n <WrappedComponent {...props} forwardedRef={ref} />\n ))\n\n return withSanti(hoistStatics(ForwardedRefHOC, WrappedComponent))\n}\n\nexport default getInitialProps\n","import { delay } from './helpers'\n\nconst ready = async (delayMillisecond = -1) => {\n try {\n if (delayMillisecond && Number(delayMillisecond) >= 0) {\n await delay(delayMillisecond)\n }\n\n if (window.__SSR__ && !window.__SSRREADY__) {\n const script = document.createElement('script')\n script.innerHTML = 'window.__SSRREADY__=true'\n document.head.appendChild(script)\n }\n // ssr 阶段:通知 santi 可以采集页面内容\n // csr 阶段:通知 santi/render 已完成呈现\n document.dispatchEvent(new Event('ssr-ready'))\n } finally {\n // nothing\n }\n}\n\nexport default ready\n","import withSanti from '../../withSanti'\n\nexport default withSanti(({ children }) => children)\n","import React from 'react'\nimport ReactDOM from 'react-dom'\n\nimport Container from './components/Container'\nimport { isFunction } from './helpers'\n\nconst ROOT_KEY = 'ssr-root'\n\nfunction render(content, container, callback) {\n const element = <Container>{content}</Container>\n\n // 支持热加载\n // FIXME: Dev 阶段会导致渲染抖动\n if (module.hot) {\n return ReactDOM.render(element, container, callback)\n }\n\n // ssr 阶段将内容渲染至动态生成的 ssr-root 节点中\n if (window.__SSR__) {\n let ssrRoot = document.getElementById(ROOT_KEY)\n if (!ssrRoot) {\n ssrRoot = document.createElement('div')\n ssrRoot.style.cssText = 'width:100%;height:100%;'\n ssrRoot.id = ROOT_KEY\n document.body.insertBefore(ssrRoot, container)\n }\n\n return ReactDOM.render(element, ssrRoot, callback)\n }\n\n // csr 阶段若为 ssr 渲染结果,则在 csr 完成后替换 ssr 结果\n // 注:不使用水合操作(ReactDOM.hydrate)因为可能造成节点错误问题\n if (window.__SSRED__) {\n const ssrRoot = document.getElementById(ROOT_KEY)\n let renderCallback = callback\n\n container.style.display = 'none'\n container.innerHTML = ssrRoot.innerHTML\n\n function display() {\n // 做一定延时,尽可能保证平滑呈现\n setTimeout(() => {\n const ssrRoot = document.getElementById(ROOT_KEY)\n if (ssrRoot) {\n try {\n ssrRoot.parentNode.removeChild(ssrRoot)\n } finally {\n // nothing\n }\n }\n container.style.display = ''\n }, 56)\n }\n\n // 若为快照 ssr 则 csr 阶段将同样收到 ssr-ready 事件,在此事件后平滑呈现真实可用交互\n if (window.__SSRREADY__) {\n function onReady() {\n display()\n document.removeEventListener('ssr-ready', onReady)\n }\n document.addEventListener('ssr-ready', onReady)\n } else {\n // 若不为快照 ssr(一般为超时自动快照),则在 render 回调结束后呈现真实结果\n renderCallback = function(...args) {\n // FIXME: 超时快照可能造成呈现不平滑,具体表现为 SSR 切到真实内容过程中有轻微空屏现象,通俗为 “闪一下”,此问题待完美修正\n display()\n\n if (isFunction(callback)) {\n callback.apply(this, args)\n }\n }\n }\n\n return ReactDOM.render(element, container, renderCallback)\n }\n\n // csr 若不为 ssr 渲染结果则正常渲染\n return ReactDOM.render(element, container, callback)\n}\n\nexport default render\n","import React, { useState, useEffect } from 'react'\n\nimport ready from '../../ready'\n\nfunction Ready({ children, delay, onMount = false, when = false }) {\n useEffect(() => {\n if (onMount) {\n ready(delay)\n }\n }, [])\n\n useEffect(() => {\n if (when) {\n ready(delay)\n }\n }, [when])\n\n return children\n}\n\nfunction ReadyOnMount({ children, delay }) {\n const [ready, setReady] = useState(false)\n useEffect(() => {\n setReady(true)\n }, [])\n\n return (\n <Ready delay={delay} when={ready}>\n {children}\n </Ready>\n )\n}\n\nReady.OnMount = ReadyOnMount\n\nexport default Ready\n","import { run } from '../../helpers'\n\nfunction NoSSR({ children, fallback = null }) {\n return window.__SSR__ ? run(fallback) : children\n}\n\nexport default NoSSR\n","import useState from './useState'\nimport getInitialProps from './getInitialProps'\nimport ready from './ready'\nimport render from './render'\nimport store from './store'\nimport withSanti, { useNodeKey, useSID } from './withSanti'\nimport Ready from './components/Ready'\nimport NoSSR from './components/NoSSR'\n\nexport default {\n render,\n store,\n useState,\n getInitialProps,\n ready,\n withSanti,\n useNodeKey,\n useSID,\n Ready,\n NoSSR\n}\n\nexport {\n render,\n store,\n useState,\n getInitialProps,\n ready,\n withSanti,\n useNodeKey,\n useSID,\n Ready,\n NoSSR\n}\n"],"names":["isUndefined","val","isNull","isFunction","isString","isExist","isNaN","Number","isNumber","isPromiseLike","then","get","obj","keys","defaultValue","String","result","split","reduce","res","key","e","run","func","context","slice","args","call","delay","time","Promise","resolve","setTimeout","debounce","wait","timeout","clearTimeout","apply","promiseGuess","executor","valuer","value","err","undefined","createContext","Provider","withSanti","Component","WrappedComponent","forwardRef","nodeKey","__key","props","count","contextValue","useMemo","getCountedKey","React","ForwardedRefHOC","ref","hoistStatics","useNodeKey","useContext","useSID","sid","getCountedSID","KEY","inject","script","document","getElementById","createElement","id","innerHTML","head","appendChild","bootstrap","window","__SSR__","__SSRED__","data","remove","set","JSON","stringify","store","builder","warningMissingKey","console","warn","useState","initialState","useReactState","error","state","setState","getNextState","nextState","getInitialProps","fetch","fallback","forwardedRef","ready","setReady","ssrProps","setSsrProps","mounted","useRef","useEffect","init","current","delayMillisecond","__SSRREADY__","dispatchEvent","Event","children","ROOT_KEY","render","content","container","callback","element","module","hot","ReactDOM","ssrRoot","style","cssText","body","insertBefore","display","parentNode","removeChild","renderCallback","onReady","removeEventListener","addEventListener","Ready","onMount","when","ReadyOnMount","OnMount","NoSSR"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../client/helpers/base/is/index.js","../../client/helpers/base/try/index.js","../../client/helpers/utils.js","../../client/withSanti.js","../../client/store.js","../../client/useState.js","../../client/getInitialProps.js","../../client/ready.js","../../client/components/Container/index.js","../../client/render.js","../../client/components/Ready/index.js","../../client/components/NoSSR/index.js","../../client/index.js"],"sourcesContent":["// 值类型判断 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\nexport const isUndefined = val => typeof val === 'undefined'\n\nexport const isNull = val => val === null\n\nexport const isFunction = val => typeof val === 'function'\n\nexport const isArray = val =>\n isFunction(Array.isArray) ? Array.isArray(val) : val instanceof Array\n\nexport const isRegExp = val => val instanceof RegExp\n\nexport const isObject = val =>\n typeof val === 'object' && !(isArray(val) || isNull(val))\n\nexport const isBoolean = val => typeof val === 'boolean'\n\nexport const isString = val => typeof val === 'string'\n\nexport const isExist = val => !(isUndefined(val) || isNull(val))\n\nexport const isNaN = val =>\n isFunction(Number.isNaN) ? Number.isNaN(val) : val !== val // eslint-disable-line\n\nexport const isNumber = val => typeof val === 'number' && !isNaN(val)\n\nexport const isPromiseLike = val => isExist(val) && isFunction(val.then)\n// 值类型判断 -------------------------------------------------------------\n","import { isString, isUndefined, isFunction, isNumber } from '../is'\n\nexport const get = (obj, keys = [], defaultValue) => {\n try {\n if (isNumber(keys)) {\n keys = String(keys)\n }\n let result = (isString(keys) ? keys.split('.') : keys).reduce(\n (res, key) => res[key],\n obj\n )\n return isUndefined(result) ? defaultValue : result\n } catch (e) {\n return defaultValue\n }\n}\n\nexport const run = (obj, keys = [], ...args) => {\n keys = isString(keys) ? keys.split('.') : keys\n\n const func = get(obj, keys)\n const context = get(obj, keys.slice(0, -1))\n\n return isFunction(func) ? func.call(context, ...args) : func\n}\n\nexport const value = (...values) =>\n values.reduce(\n (value, nextValue) => (isUndefined(value) ? run(nextValue) : run(value)),\n undefined\n )\n","import { isArray, isPromiseLike } from './base/is'\n\nexport const nextTick = (func) => Promise.resolve().then(func)\n\nexport const delay = (time) =>\n new Promise((resolve) => setTimeout(resolve, time))\n\n/**\n * [防抖]\n * @param {Function} func 执行函数\n * @param {Number} wait 多少毫秒后运行一次\n */\nexport const debounce = (func, wait = 16) => {\n let timeout\n\n return function (...args) {\n clearTimeout(timeout)\n\n timeout = setTimeout(() => {\n func.apply(this, args)\n }, wait)\n\n return timeout\n }\n}\n\n/**\n * [用来智能处理Promise类型返回值]\n * 当值生成过程为 promise 时,将得到 promise 类型返回值,按约定 resolve 最终值\n * 当过程不为 promise 时将直接得到值\n * @param {Function} executor 执行过程获取\n * @param {Function} valuer 值处理过程\n */\nexport const promiseGuess = (executor, valuer) =>\n function (...args) {\n let value = executor.apply(this, args)\n\n return isPromiseLike(value)\n ? new Promise((resolve) =>\n value\n .then((value) => resolve(valuer.call(this, null, value, ...args)))\n .catch((err) => resolve(valuer.call(this, err, undefined, ...args)))\n )\n : valuer.call(this, null, value, ...args)\n }\n\nexport function getKey2Id() {\n let uuid = 0\n const map = new Map()\n\n // 对每种 NodeType 做编号处理\n return function key2Id(key) {\n let id = map.get(key)\n\n if (!id) {\n id = (++uuid).toString(32)\n map.set(key, id)\n }\n\n return id\n }\n}\n\nexport function isBrowser() {\n return !window.__SSR__\n}\n\nexport function isPrerendering() {\n return !!window.__PR__\n}\n","import React, { forwardRef, createContext, useContext, useMemo } from 'react'\nimport hoistStatics from 'hoist-non-react-statics'\nimport NodeKey from 'react-node-key'\n\nconst context = createContext()\nconst { Provider } = context\n\nfunction withSanti(Component) {\n function WrappedComponent({ forwardRef, __key: nodeKey, ...props }) {\n let count = 0\n const contextValue = useMemo(\n () => ({\n nodeKey,\n getCountedKey: () => (nodeKey ? `${nodeKey}:${count++}` : undefined)\n }),\n [nodeKey]\n )\n\n return (\n <Provider value={contextValue}>\n <Component {...props} ref={forwardRef} />\n </Provider>\n )\n }\n\n const ForwardedRefHOC = forwardRef((props, ref) => (\n <NodeKey>\n {nodeKey => (\n <WrappedComponent {...props} forwardedRef={ref} __key={nodeKey} />\n )}\n </NodeKey>\n ))\n\n return hoistStatics(ForwardedRefHOC, WrappedComponent)\n}\n\nexport function useNodeKey() {\n return (\n useContext(context) || {\n nodeKey: undefined,\n getCountedKey: () => undefined\n }\n )\n}\n\nexport function useSID() {\n const { nodeKey: sid, getCountedKey: getCountedSID } = useNodeKey()\n return { sid, getCountedSID }\n}\n\nexport default withSanti\n","import { run, isUndefined, promiseGuess, isExist } from './helpers'\n\nconst KEY = '__SSRDATA__'\n\nfunction inject() {\n let script = document.getElementById(KEY) || document.createElement('script')\n script.id = KEY\n script.innerHTML = `window.${KEY}={};`\n document.head.appendChild(script)\n}\n\nfunction bootstrap() {\n if (window.__SSR__) {\n inject()\n } else {\n if (isExist(document.getElementById(KEY))) {\n window.__SSRED__ = true\n }\n }\n const data = window[KEY] || {}\n\n function remove(key) {\n delete data[key]\n }\n\n function set(key, value) {\n if (!window.__SSR__) {\n return\n }\n data[key] = value\n document.getElementById(KEY).innerHTML = `window.${KEY}=${JSON.stringify(\n data\n )};`\n }\n\n function get(key) {\n let value = data[key]\n remove(key) // 初始值只在 html 就绪后使用一次,使用即销毁\n return value\n }\n\n return { set, get, remove }\n}\n\nconst store = bootstrap()\n\nexport default {\n get: promiseGuess(\n (key, builder) => {\n if (!key && window.__SSR__) {\n // 若无 key 则 SSR 阶段不计算\n return undefined\n }\n\n let value\n\n if (!window.__SSR__) {\n value = store.get(key)\n }\n\n if (isUndefined(value)) {\n value = run(builder)\n }\n\n return value\n },\n (err, value, key) => {\n if (!key) {\n return [null, value]\n }\n\n if (err) {\n store.remove(key)\n return [err, undefined]\n }\n\n if (window.__SSR__) {\n store.set(key, value)\n }\n\n return [null, value]\n }\n ),\n set: store.set\n}\n","import { useState as useReactState } from 'react'\n\nimport { run, debounce } from './helpers'\nimport { useNodeKey } from './withSanti'\nimport store from './store'\n\nconst warningMissingKey = debounce(() => {\n if (window.__SSR__) {\n return\n }\n\n console.warn('You shouldn\\'t use \"santi.useState\" outside a \"withSanti\"')\n}, 32)\n\nfunction useState(initialState, key) {\n const { getCountedKey } = useNodeKey()\n const nodeKey = key || run(getCountedKey)\n const [state, setState] = useReactState(() => {\n if (!nodeKey) {\n warningMissingKey()\n }\n\n const [err, value] = store.get(nodeKey, initialState)\n\n if (err) {\n console.error(err)\n }\n\n return value\n })\n\n return [\n state,\n getNextState => {\n const nextState = run(getNextState, undefined, state)\n\n store.set(nodeKey, nextState)\n\n return setState(nextState)\n },\n nodeKey\n ]\n}\n\nexport default useState\n","import React, { useState, forwardRef, useRef, useEffect } from 'react'\nimport hoistStatics from 'hoist-non-react-statics'\n\nimport { run } from './helpers'\nimport withSanti, { useNodeKey } from './withSanti'\nimport store from './store'\n\nconst getInitialProps = (fetch, fallback = null, key) => Component => {\n function WrappedComponent({ forwardedRef, ...props }) {\n const [ready, setReady] = useState(false)\n const [ssrProps, setSsrProps] = useState({})\n const mounted = useRef(true)\n const { getCountedKey } = useNodeKey()\n const nodeKey = key || run(getCountedKey)\n\n useEffect(() => {\n async function init() {\n const [err, ssrProps] = await store.get(nodeKey, () =>\n run(fetch, undefined, props)\n )\n\n if (err) {\n console.error('[getInitialProps error]', err)\n return\n }\n\n if (mounted.current && ssrProps) {\n setSsrProps(ssrProps)\n setReady(true)\n }\n }\n\n init()\n\n return () => {\n mounted.current = false\n }\n }, [])\n\n return ready ? (\n <Component {...{ ...props, ...ssrProps }} ref={forwardedRef} />\n ) : (\n run(fallback, undefined, props)\n )\n }\n\n const ForwardedRefHOC = forwardRef((props, ref) => (\n <WrappedComponent {...props} forwardedRef={ref} />\n ))\n\n return withSanti(hoistStatics(ForwardedRefHOC, WrappedComponent))\n}\n\nexport default getInitialProps\n","import { delay } from './helpers'\n\nconst ready = async (delayMillisecond = -1) => {\n try {\n if (delayMillisecond && Number(delayMillisecond) >= 0) {\n await delay(delayMillisecond)\n }\n\n if (window.__SSR__ && !window.__SSRREADY__) {\n const script = document.createElement('script')\n script.innerHTML = 'window.__SSRREADY__=true'\n document.head.appendChild(script)\n }\n // ssr 阶段:通知 santi 可以采集页面内容\n // csr 阶段:通知 santi/render 已完成呈现\n document.dispatchEvent(new Event('ssr-ready'))\n } finally {\n // nothing\n }\n}\n\nexport default ready\n","import withSanti from '../../withSanti'\n\nexport default withSanti(({ children }) => children)\n","import React from 'react'\nimport ReactDOM from 'react-dom'\n\nimport Container from './components/Container'\nimport { isFunction } from './helpers'\n\nconst ROOT_KEY = 'ssr-root'\n\nfunction render(content, container, callback) {\n const element = <Container>{content}</Container>\n\n // 支持热加载\n // FIXME: Dev 阶段会导致渲染抖动\n if (module.hot) {\n return ReactDOM.render(element, container, callback)\n }\n\n // ssr 阶段将内容渲染至动态生成的 ssr-root 节点中\n if (window.__SSR__) {\n let ssrRoot = document.getElementById(ROOT_KEY)\n if (!ssrRoot) {\n ssrRoot = document.createElement('div')\n ssrRoot.style.cssText = 'width:100%;height:100%;'\n ssrRoot.id = ROOT_KEY\n document.body.insertBefore(ssrRoot, container)\n }\n\n return ReactDOM.render(element, ssrRoot, callback)\n }\n\n // csr 阶段若为 ssr 渲染结果,则在 csr 完成后替换 ssr 结果\n // 注:不使用水合操作(ReactDOM.hydrate)因为可能造成节点错误问题\n if (window.__SSRED__) {\n const ssrRoot = document.getElementById(ROOT_KEY)\n let renderCallback = callback\n\n container.style.display = 'none'\n container.innerHTML = ssrRoot.innerHTML\n\n function display() {\n // 做一定延时,尽可能保证平滑呈现\n setTimeout(() => {\n const ssrRoot = document.getElementById(ROOT_KEY)\n if (ssrRoot) {\n try {\n ssrRoot.parentNode.removeChild(ssrRoot)\n } finally {\n // nothing\n }\n }\n container.style.display = ''\n }, 56)\n }\n\n // 若为快照 ssr 则 csr 阶段将同样收到 ssr-ready 事件,在此事件后平滑呈现真实可用交互\n if (window.__SSRREADY__) {\n function onReady() {\n display()\n document.removeEventListener('ssr-ready', onReady)\n }\n document.addEventListener('ssr-ready', onReady)\n } else {\n // 若不为快照 ssr(一般为超时自动快照),则在 render 回调结束后呈现真实结果\n renderCallback = function(...args) {\n // FIXME: 超时快照可能造成呈现不平滑,具体表现为 SSR 切到真实内容过程中有轻微空屏现象,通俗为 “闪一下”,此问题待完美修正\n display()\n\n if (isFunction(callback)) {\n callback.apply(this, args)\n }\n }\n }\n\n return ReactDOM.render(element, container, renderCallback)\n }\n\n // csr 若不为 ssr 渲染结果则正常渲染\n return ReactDOM.render(element, container, callback)\n}\n\nexport default render\n","import React, { useState, useEffect } from 'react'\n\nimport ready from '../../ready'\n\nfunction Ready({ children, delay, onMount = false, when = false }) {\n useEffect(() => {\n if (onMount) {\n ready(delay)\n }\n }, [])\n\n useEffect(() => {\n if (when) {\n ready(delay)\n }\n }, [when])\n\n return children\n}\n\nfunction ReadyOnMount({ children, delay }) {\n const [ready, setReady] = useState(false)\n useEffect(() => {\n setReady(true)\n }, [])\n\n return (\n <Ready delay={delay} when={ready}>\n {children}\n </Ready>\n )\n}\n\nReady.OnMount = ReadyOnMount\n\nexport default Ready\n","import { run } from '../../helpers'\n\nfunction NoSSR({ children, fallback = null }) {\n return window.__SSR__ ? run(fallback) : children\n}\n\nexport default NoSSR\n","import useState from './useState'\nimport getInitialProps from './getInitialProps'\nimport ready from './ready'\nimport render from './render'\nimport store from './store'\nimport withSanti, { useNodeKey, useSID } from './withSanti'\nimport Ready from './components/Ready'\nimport NoSSR from './components/NoSSR'\n\nexport default {\n render,\n store,\n useState,\n getInitialProps,\n ready,\n withSanti,\n useNodeKey,\n useSID,\n Ready,\n NoSSR\n}\n\nexport {\n render,\n store,\n useState,\n getInitialProps,\n ready,\n withSanti,\n useNodeKey,\n useSID,\n Ready,\n NoSSR\n}\n"],"names":["isUndefined","val","isNull","isFunction","isString","isExist","isNaN","Number","isNumber","isPromiseLike","then","get","obj","keys","defaultValue","String","result","split","reduce","res","key","e","run","func","context","slice","args","call","delay","time","Promise","resolve","setTimeout","debounce","wait","timeout","clearTimeout","apply","promiseGuess","executor","valuer","value","err","undefined","createContext","Provider","withSanti","Component","WrappedComponent","forwardRef","nodeKey","__key","props","count","contextValue","useMemo","getCountedKey","React","ForwardedRefHOC","ref","hoistStatics","useNodeKey","useContext","useSID","sid","getCountedSID","KEY","inject","script","document","getElementById","createElement","id","innerHTML","head","appendChild","bootstrap","window","__SSR__","__SSRED__","data","remove","set","JSON","stringify","store","builder","warningMissingKey","console","warn","useState","initialState","useReactState","error","state","setState","getNextState","nextState","getInitialProps","fetch","fallback","forwardedRef","ready","setReady","ssrProps","setSsrProps","mounted","useRef","useEffect","init","current","delayMillisecond","__SSRREADY__","dispatchEvent","Event","children","ROOT_KEY","render","content","container","callback","element","module","hot","ReactDOM","ssrRoot","style","cssText","body","insertBefore","display","parentNode","removeChild","renderCallback","onReady","removeEventListener","addEventListener","Ready","onMount","when","ReadyOnMount","OnMount","NoSSR"],"mappings":"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"}
|
package/lib/client/index.min.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("react"),require("hoist-non-react-statics"),require("react-node-key"),require("react-dom")):"function"==typeof define&&define.amd?define(["exports","react","hoist-non-react-statics","react-node-key","react-dom"],t):t((e=e||self).SantiClient={},e.React,e.hoistStatics,e.NodeKey,e.ReactDOM)}(this,function(e,y,t,o,i){"use strict";var p="default"in y?y.default:y;function a(e,t,n,r,o,u,i){try{var c=e[u](i),a=c.value}catch(e){return void n(e)}c.done?t(a):Promise.resolve(a).then(r,o)}function
|
|
1
|
+
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("react"),require("hoist-non-react-statics"),require("react-node-key"),require("react-dom")):"function"==typeof define&&define.amd?define(["exports","react","hoist-non-react-statics","react-node-key","react-dom"],t):t((e=e||self).SantiClient={},e.React,e.hoistStatics,e.NodeKey,e.ReactDOM)}(this,function(e,y,t,o,i){"use strict";var p="default"in y?y.default:y;function n(t,e){var n,r=Object.keys(t);return Object.getOwnPropertySymbols&&(n=Object.getOwnPropertySymbols(t),e&&(n=n.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),r.push.apply(r,n)),r}function v(r){for(var e=1;e<arguments.length;e++){var o=null!=arguments[e]?arguments[e]:{};e%2?n(Object(o),!0).forEach(function(e){var t,n;t=r,e=o[n=e],n in t?Object.defineProperty(t,n,{value:e,enumerable:!0,configurable:!0,writable:!0}):t[n]=e}):Object.getOwnPropertyDescriptors?Object.defineProperties(r,Object.getOwnPropertyDescriptors(o)):n(Object(o)).forEach(function(e){Object.defineProperty(r,e,Object.getOwnPropertyDescriptor(o,e))})}return r}function a(e,t,n,r,o,u,i){try{var c=e[u](i),a=c.value}catch(e){return void n(e)}c.done?t(a):Promise.resolve(a).then(r,o)}function m(c){return function(){var e=this,i=arguments;return new Promise(function(t,n){var r=c.apply(e,i);function o(e){a(r,t,n,o,u,"next",e)}function u(e){a(r,t,n,o,u,"throw",e)}o(void 0)})}}function w(){return(w=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n,r=arguments[t];for(n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}function h(e,t){if(null==e)return{};var n,r=function(e,t){if(null==e)return{};for(var n,r={},o=Object.keys(e),u=0;u<o.length;u++)n=o[u],0<=t.indexOf(n)||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols)for(var o=Object.getOwnPropertySymbols(e),u=0;u<o.length;u++)n=o[u],0<=t.indexOf(n)||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n]);return r}function _(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,o,u=[],i=!0,c=!1;try{for(n=n.call(e);!(i=(r=n.next()).done)&&(u.push(r.value),!t||u.length!==t);i=!0);}catch(e){c=!0,o=e}finally{try{i||null==n.return||n.return()}finally{if(c)throw o}}return u}}(e,t)||function(e,t){if(e){if("string"==typeof e)return r(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Map"===(n="Object"===n&&e.constructor?e.constructor.name:n)||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?r(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function r(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}t=t&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t,o=o&&Object.prototype.hasOwnProperty.call(o,"default")?o.default:o,i=i&&Object.prototype.hasOwnProperty.call(i,"default")?i.default:i;function c(e){var t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:[],n=2<arguments.length?arguments[2]:void 0;try{g(t)&&(t=String(t));var r=(d(t)?t.split("."):t).reduce(function(e,t){return e[t]},e);return u(r)?n:r}catch(e){return n}}function S(e){for(var t=d(t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:[])?t.split("."):t,n=c(e,t),t=c(e,t.slice(0,-1)),r=arguments.length,o=new Array(2<r?r-2:0),u=2;u<r;u++)o[u-2]=arguments[u];return l(n)?n.call.apply(n,[t].concat(o)):n}var u=function(e){return void 0===e},f=function(e){return null===e},l=function(e){return"function"==typeof e},d=function(e){return"string"==typeof e},s=function(e){return!(u(e)||f(e))},g=function(e){return"number"==typeof e&&(e=e,!(l(Number.isNaN)?Number.isNaN(e):e!=e))},b=["forwardRef","__key"],O="nNBh",R=y.createContext(),E=R.Provider;function j(u){function r(e){var t=e.forwardRef,n=e.__key,r=h(e,b),o=0,e=y.useMemo(function(){return{nodeKey:n,getCountedKey:function(){return n?"".concat(n,":").concat(o++):void 0}}},[n]);return p.createElement(E,{value:e,_nk:"".concat(O,"11")},p.createElement(u,w({},r,{ref:t,_nk:"".concat(O,"21")})))}return t(y.forwardRef(function(t,n){return p.createElement(o,{_nk:"".concat(O,"31")},function(e){return p.createElement(r,w({},t,{forwardedRef:n,__key:e,_nk:"".concat(O,"41")}))})}),r)}function P(){return y.useContext(R)||{nodeKey:void 0,getCountedKey:function(){}}}function k(){var e=P();return{sid:e.nodeKey,getCountedSID:e.getCountedKey}}var x="__SSRDATA__";var I,N,A=function(){var e;window.__SSR__?((e=document.getElementById(x)||document.createElement("script")).id=x,e.innerHTML="window.".concat(x,"={};"),document.head.appendChild(e)):s(document.getElementById(x))&&(window.__SSRED__=!0);var n=window[x]||{};function r(e){delete n[e]}return{set:function(e,t){window.__SSR__&&(n[e]=t,document.getElementById(x).innerHTML="window.".concat(x,"=").concat(JSON.stringify(n),";"))},get:function(e){var t=n[e];return r(e),t},remove:r}}(),D={get:(I=function(e,t){var n;if(e||!window.__SSR__)return window.__SSR__||(n=A.get(e)),n=u(n)?S(t):n},N=function(e,t,n){return n?e?(A.remove(n),[e,void 0]):(window.__SSR__&&A.set(n,t),[null,t]):[null,t]},function(){for(var n=this,e=arguments.length,r=new Array(e),t=0;t<e;t++)r[t]=arguments[t];var o,u=I.apply(this,r);return s(o=u)&&l(o.then)?new Promise(function(t){return u.then(function(e){return t(N.call.apply(N,[n,null,e].concat(r)))}).catch(function(e){return t(N.call.apply(N,[n,e,void 0].concat(r)))})}):N.call.apply(N,[this,null,u].concat(r))}),set:A.set},C=function(o){var u,i=1<arguments.length&&void 0!==arguments[1]?arguments[1]:16;return function(){for(var e=this,t=arguments.length,n=new Array(t),r=0;r<t;r++)n[r]=arguments[r];return clearTimeout(u),u=setTimeout(function(){o.apply(e,n)},i)}}(function(){window.__SSR__||console.warn('You shouldn\'t use "santi.useState" outside a "withSanti"')},32);function K(n,e){var t=P().getCountedKey,r=e||S(t),t=y.useState(function(){r||C();var e=_(D.get(r,n),2),t=e[0],e=e[1];return t&&console.error(t),e}),t=_(t,2),o=t[0],u=t[1];return[o,function(e){e=S(e,void 0,o);return D.set(r,e),u(e)},r]}function T(l){var d=1<arguments.length&&void 0!==arguments[1]?arguments[1]:null,s=2<arguments.length?arguments[2]:void 0;return function(f){function n(e){var t=e.forwardedRef,r=h(e,M),n=_(y.useState(!1),2),o=n[0],u=n[1],e=_(y.useState({}),2),n=e[0],i=e[1],c=y.useRef(!0),e=P().getCountedKey,a=s||S(e);return y.useEffect(function(){function e(){return(e=m(regeneratorRuntime.mark(function e(){var t,n;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,D.get(a,function(){return S(l,void 0,r)});case 2:if(t=e.sent,n=_(t,2),t=n[0],n=n[1],t)return console.error("[getInitialProps error]",t),e.abrupt("return");e.next=9;break;case 9:c.current&&n&&(i(n),u(!0));case 10:case"end":return e.stop()}},e)}))).apply(this,arguments)}return function(){e.apply(this,arguments)}(),function(){c.current=!1}},[]),o?p.createElement(f,w({},v(v({},r),n),{ref:t,_nk:"".concat(B,"11")})):S(d,void 0,r)}return j(t(y.forwardRef(function(e,t){return p.createElement(n,w({},e,{forwardedRef:t,_nk:"".concat(B,"21")}))}),n))}}var M=["forwardedRef"],B="8NS2",L=function(){var e=m(regeneratorRuntime.mark(function e(){var t,n=arguments;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(t=0<n.length&&void 0!==n[0]?n[0]:-1,e.prev=1,t&&0<=Number(t))return e.next=5,function(t){return new Promise(function(e){return setTimeout(e,t)})}(t);e.next=5;break;case 5:window.__SSR__&&!window.__SSRREADY__&&((t=document.createElement("script")).innerHTML="window.__SSRREADY__=true",document.head.appendChild(t)),document.dispatchEvent(new Event("ssr-ready"));case 7:return e.prev=7,e.finish(7);case 9:case"end":return e.stop()}},e,null,[[1,,7,9]])}));return function(){return e.apply(this,arguments)}}(),H=j(function(e){return e.children}),q="ssr-root";function Y(e,t,r){var n=p.createElement(H,{_nk:"".concat("4mmK","11")},e);if(module.hot)return i.render(n,t,r);if(window.__SSR__){var o=document.getElementById(q);return o||((o=document.createElement("div")).style.cssText="width:100%;height:100%;",o.id=q,document.body.insertBefore(o,t)),i.render(n,o,r)}if(window.__SSRED__){var u=function(){setTimeout(function(){var e=document.getElementById(q);e&&e.parentNode.removeChild(e),t.style.display=""},56)},e=document.getElementById(q),o=r;return t.style.display="none",t.innerHTML=e.innerHTML,window.__SSRREADY__?document.addEventListener("ssr-ready",function e(){u(),document.removeEventListener("ssr-ready",e)}):o=function(){if(u(),l(r)){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];r.apply(this,t)}},i.render(n,t,o)}return i.render(n,t,r)}function J(e){var t=e.children,n=e.delay,r=e.onMount,o=void 0!==r&&r,e=e.when,u=void 0!==e&&e;return y.useEffect(function(){o&&L(n)},[]),y.useEffect(function(){u&&L(n)},[u]),t}function U(e){var t=e.children,e=e.fallback;return window.__SSR__?S(void 0===e?null:e):t}J.OnMount=function(e){var t=e.children,n=e.delay,r=_(y.useState(!1),2),e=r[0],o=r[1];return y.useEffect(function(){o(!0)},[]),p.createElement(J,{delay:n,when:e,_nk:"".concat("B/hE","11")},t)};var $={render:Y,store:D,useState:K,getInitialProps:T,ready:L,withSanti:j,useNodeKey:P,useSID:k,Ready:J,NoSSR:U};e.NoSSR=U,e.Ready=J,e.default=$,e.getInitialProps=T,e.ready=L,e.render=Y,e.store=D,e.useNodeKey=P,e.useSID=k,e.useState=K,e.withSanti=j,Object.defineProperty(e,"__esModule",{value:!0})});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "santi",
|
|
3
|
-
"version": "0.0.0-beta.
|
|
3
|
+
"version": "0.0.0-beta.42",
|
|
4
4
|
"description": "Isomorphic framework for base on create-react-app and jsdom",
|
|
5
5
|
"bin": {
|
|
6
6
|
"santi": "bin/santi.js"
|
|
@@ -51,11 +51,14 @@
|
|
|
51
51
|
"promise-limit": "^2.7.0",
|
|
52
52
|
"qs": "^6.9.1",
|
|
53
53
|
"react-app-rewired": "^2.1.8",
|
|
54
|
-
"react-node-key": "^0.1
|
|
54
|
+
"react-node-key": "^0.3.1",
|
|
55
55
|
"react-scripts": "^3.4.4",
|
|
56
56
|
"szfe-tools": "^0.0.0-beta.7",
|
|
57
57
|
"webpack-bundle-analyzer": "^3.6.0",
|
|
58
|
-
"yargs": "^15.0.2"
|
|
58
|
+
"yargs": "^15.0.2",
|
|
59
|
+
"lodash": "^4.17.15",
|
|
60
|
+
"postcss": "^7.0.17",
|
|
61
|
+
"postcss-selector-parser": "6.0.2"
|
|
59
62
|
},
|
|
60
63
|
"devDependencies": {
|
|
61
64
|
"@babel/core": "^7.7.5",
|
|
@@ -22,6 +22,7 @@ function runKoa(config = KOA_DEFAULT, port) {
|
|
|
22
22
|
const {
|
|
23
23
|
proxy: proxyTable,
|
|
24
24
|
staticDir = paths.appBuild,
|
|
25
|
+
publicPath = paths.publicUrlOrPath,
|
|
25
26
|
static: staticOpts
|
|
26
27
|
} = {
|
|
27
28
|
...KOA_DEFAULT,
|
|
@@ -37,7 +38,8 @@ function runKoa(config = KOA_DEFAULT, port) {
|
|
|
37
38
|
app.use(
|
|
38
39
|
koaFallbackStatic(staticDir, {
|
|
39
40
|
...staticOpts,
|
|
40
|
-
fallback: '__root.html'
|
|
41
|
+
fallback: '__root.html',
|
|
42
|
+
publicPath
|
|
41
43
|
})
|
|
42
44
|
)
|
|
43
45
|
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
const koaStatic = require('./koaStatic')
|
|
2
2
|
|
|
3
|
-
function koaFallbackStatic(root, { fallback = '/', ...opts } = {}) {
|
|
3
|
+
function koaFallbackStatic(root, { fallback = '/', publicPath = '/', ...opts } = {}) {
|
|
4
4
|
const serveStatic = koaStatic(root, opts)
|
|
5
5
|
|
|
6
6
|
return async (ctx, next) => {
|
|
7
|
+
ctx.request.url = ctx.request.url.replace(publicPath, '/')
|
|
8
|
+
|
|
7
9
|
if (
|
|
8
10
|
/\.html$/.test(ctx.request.url) ||
|
|
9
11
|
!/text\/html/.test(ctx.header.accept)
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const { run } = require('szfe-tools')
|
|
2
|
-
|
|
2
|
+
const express = require('express')
|
|
3
3
|
const Prerenderer = require('./Prerenderer')
|
|
4
4
|
|
|
5
5
|
const JSDOMPrerenderer = require('../JSDOMPrerenderer')
|
|
@@ -8,7 +8,7 @@ const renderWithJSDOM = require('../renderWithJSDOM')
|
|
|
8
8
|
const DEFAULT_RENDERER_CONFIG = {}
|
|
9
9
|
|
|
10
10
|
module.exports = class Renderer {
|
|
11
|
-
constructor({ staticDir, server, proxy, ...rendererConfig }) {
|
|
11
|
+
constructor({ staticDir, publicPath, server, proxy, ...rendererConfig }) {
|
|
12
12
|
this.config = {
|
|
13
13
|
...DEFAULT_RENDERER_CONFIG,
|
|
14
14
|
...rendererConfig
|
|
@@ -25,6 +25,12 @@ module.exports = class Renderer {
|
|
|
25
25
|
renderer: new JSDOMPrerenderer(this.config)
|
|
26
26
|
})
|
|
27
27
|
|
|
28
|
+
if (publicPath !== '/') {
|
|
29
|
+
prerender._server._expressServer.use(publicPath, express.static(staticDir, {
|
|
30
|
+
dotfiles: 'allow'
|
|
31
|
+
}))
|
|
32
|
+
}
|
|
33
|
+
|
|
28
34
|
prerender.initialize()
|
|
29
35
|
|
|
30
36
|
this.renderer = {
|
package/server/koaSsr/index.js
CHANGED
|
@@ -36,6 +36,7 @@ const defaultCacheEngine = {
|
|
|
36
36
|
module.exports = function ssr({
|
|
37
37
|
devMode = false,
|
|
38
38
|
staticDir,
|
|
39
|
+
publicPath,
|
|
39
40
|
server,
|
|
40
41
|
log: useLog = true,
|
|
41
42
|
renderConfig: renderConfigTable = [],
|
|
@@ -53,6 +54,7 @@ module.exports = function ssr({
|
|
|
53
54
|
// https://github.com/koajs/send/blob/5.0.0/index.js#L80
|
|
54
55
|
gzip: true,
|
|
55
56
|
fallback: '__root.html',
|
|
57
|
+
publicPath,
|
|
56
58
|
})
|
|
57
59
|
: server
|
|
58
60
|
? httpProxy({
|
|
@@ -70,6 +72,7 @@ module.exports = function ssr({
|
|
|
70
72
|
|
|
71
73
|
const { render } = new Renderer({
|
|
72
74
|
staticDir,
|
|
75
|
+
publicPath,
|
|
73
76
|
server,
|
|
74
77
|
...rendererConfig,
|
|
75
78
|
})
|
|
@@ -140,6 +143,8 @@ module.exports = function ssr({
|
|
|
140
143
|
try {
|
|
141
144
|
if (useSsr && isUndefined(key)) {
|
|
142
145
|
const html = await render(ctx.request.url, {
|
|
146
|
+
uncss: rendererConfig.uncss,
|
|
147
|
+
timeout: rendererConfig.timeout,
|
|
143
148
|
cookie: ctx.request.headers.cookie,
|
|
144
149
|
inject: {
|
|
145
150
|
__REQUEST__,
|
|
@@ -185,7 +190,8 @@ module.exports = function ssr({
|
|
|
185
190
|
}
|
|
186
191
|
|
|
187
192
|
renderTask = render(ctx.request.url, {
|
|
188
|
-
|
|
193
|
+
uncss: renderConfig.uncss || rendererConfig.uncss,
|
|
194
|
+
timeout: renderConfig.timeout || rendererConfig.timeout,
|
|
189
195
|
cookie: ctx.request.headers.cookie,
|
|
190
196
|
inject: {
|
|
191
197
|
__REQUEST__,
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
+
const uncss = require('./uncss')
|
|
2
|
+
|
|
1
3
|
const DEFAULT_CONFIG = {
|
|
4
|
+
uncss: false,
|
|
2
5
|
deferHeadScripts: true,
|
|
3
6
|
asyncHeadScripts: false,
|
|
4
7
|
inlinePrimaryStyle: true,
|
|
@@ -21,7 +24,7 @@ const getPageContent = (dom, config = DEFAULT_CONFIG, resources) =>
|
|
|
21
24
|
let interval
|
|
22
25
|
let timeout
|
|
23
26
|
|
|
24
|
-
function captureDocument() {
|
|
27
|
+
async function captureDocument() {
|
|
25
28
|
// console.log('节点数:', document.body.querySelectorAll('*').length)
|
|
26
29
|
if (options.deferHeadScripts) {
|
|
27
30
|
// defer scripts
|
|
@@ -57,6 +60,21 @@ const getPageContent = (dom, config = DEFAULT_CONFIG, resources) =>
|
|
|
57
60
|
})
|
|
58
61
|
}
|
|
59
62
|
|
|
63
|
+
// 过滤无效 css
|
|
64
|
+
if (config.uncss) {
|
|
65
|
+
await Promise.all(
|
|
66
|
+
[...document.head.querySelectorAll('style')].map(async (style) => {
|
|
67
|
+
const nextInnerHTML = await uncss(dom, style.innerHTML)
|
|
68
|
+
|
|
69
|
+
if (nextInnerHTML.length > 0) {
|
|
70
|
+
style.innerHTML = nextInnerHTML
|
|
71
|
+
} else {
|
|
72
|
+
style.parentNode.removeChild(style)
|
|
73
|
+
}
|
|
74
|
+
})
|
|
75
|
+
)
|
|
76
|
+
}
|
|
77
|
+
|
|
60
78
|
// get page content string
|
|
61
79
|
try {
|
|
62
80
|
const html = dom.serialize()
|
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
// From: https://github.com/uncss/uncss/blob/0.17.3/src/lib.js
|
|
2
|
+
|
|
3
|
+
const postcss = require('postcss'),
|
|
4
|
+
postcssSelectorParser = require('postcss-selector-parser'),
|
|
5
|
+
_ = require('lodash')
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Filter unused selectors.
|
|
9
|
+
* @param {Object} window A jsdom window
|
|
10
|
+
* @param {Array} sels List of selectors to be filtered
|
|
11
|
+
* @return {Array}
|
|
12
|
+
*/
|
|
13
|
+
function findAll(window, sels) {
|
|
14
|
+
const document = window.document
|
|
15
|
+
|
|
16
|
+
// Unwrap noscript elements.
|
|
17
|
+
const elements = document.getElementsByTagName('noscript')
|
|
18
|
+
Array.prototype.forEach.call(elements, (ns) => {
|
|
19
|
+
const wrapper = document.createElement('div')
|
|
20
|
+
wrapper.innerHTML = ns.textContent
|
|
21
|
+
// Insert each child of the <noscript> as its sibling
|
|
22
|
+
Array.prototype.forEach.call(wrapper.children, (child) => {
|
|
23
|
+
ns.parentNode.insertBefore(child, ns)
|
|
24
|
+
})
|
|
25
|
+
})
|
|
26
|
+
|
|
27
|
+
// Do the filtering.
|
|
28
|
+
return sels.filter((selector) => {
|
|
29
|
+
try {
|
|
30
|
+
return document.querySelector(selector)
|
|
31
|
+
// eslint-disable-next-line no-unused-vars
|
|
32
|
+
} catch (e) {
|
|
33
|
+
// We ignore the error because there are a bunch of selectors which are out of our control.
|
|
34
|
+
// In that case, we consider them as unused.
|
|
35
|
+
return true
|
|
36
|
+
}
|
|
37
|
+
})
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/* Some styles are applied only with user interaction, and therefore its
|
|
41
|
+
* selectors cannot be used with querySelectorAll.
|
|
42
|
+
* http://www.w3.org/TR/2001/CR-css3-selectors-20011113/
|
|
43
|
+
*/
|
|
44
|
+
const dePseudify = (() => {
|
|
45
|
+
const ignoredPseudos = [
|
|
46
|
+
/* link */
|
|
47
|
+
':link',
|
|
48
|
+
':visited',
|
|
49
|
+
/* user action */
|
|
50
|
+
':hover',
|
|
51
|
+
':active',
|
|
52
|
+
':focus',
|
|
53
|
+
':focus-within',
|
|
54
|
+
/* UI element states */
|
|
55
|
+
':enabled',
|
|
56
|
+
':disabled',
|
|
57
|
+
':checked',
|
|
58
|
+
':indeterminate',
|
|
59
|
+
/* form validation */
|
|
60
|
+
':required',
|
|
61
|
+
':invalid',
|
|
62
|
+
':valid',
|
|
63
|
+
/* pseudo elements */
|
|
64
|
+
'::first-line',
|
|
65
|
+
'::first-letter',
|
|
66
|
+
'::selection',
|
|
67
|
+
'::before',
|
|
68
|
+
'::after',
|
|
69
|
+
/* pseudo classes */
|
|
70
|
+
':target',
|
|
71
|
+
/* CSS2 pseudo elements */
|
|
72
|
+
':before',
|
|
73
|
+
':after',
|
|
74
|
+
/* Vendor-specific pseudo-elements:
|
|
75
|
+
* https://developer.mozilla.org/ja/docs/Glossary/Vendor_Prefix
|
|
76
|
+
*/
|
|
77
|
+
'::?-(?:moz|ms|webkit|o)-[a-z0-9-]+',
|
|
78
|
+
],
|
|
79
|
+
// Actual regex is of the format: /^(:hover|:focus|...)$/i
|
|
80
|
+
pseudosRegex = new RegExp(`^(${ignoredPseudos.join('|')})$`, 'i')
|
|
81
|
+
|
|
82
|
+
const transform = (selectors) => {
|
|
83
|
+
selectors.walkPseudos((selector) => {
|
|
84
|
+
if (pseudosRegex.test(selector.value)) {
|
|
85
|
+
selector.remove()
|
|
86
|
+
}
|
|
87
|
+
})
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const processor = postcssSelectorParser(transform)
|
|
91
|
+
|
|
92
|
+
return (selector) => processor.processSync(selector)
|
|
93
|
+
})()
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Private function used in filterUnusedRules.
|
|
97
|
+
* @param {Array} selectors CSS selectors created by the CSS parser
|
|
98
|
+
* @param {Array} ignore List of selectors to be ignored
|
|
99
|
+
* @param {Array} usedSelectors List of Selectors found in the jsdom pages
|
|
100
|
+
* @return {Array} The selectors matched in the DOMs
|
|
101
|
+
*/
|
|
102
|
+
function filterUnusedSelectors(selectors, ignore, usedSelectors) {
|
|
103
|
+
/* There are some selectors not supported for matching, like
|
|
104
|
+
* :before, :after
|
|
105
|
+
* They should be removed only if the parent is not found.
|
|
106
|
+
* Example: '.clearfix:before' should be removed only if there
|
|
107
|
+
* is no '.clearfix'
|
|
108
|
+
*/
|
|
109
|
+
return selectors.filter((selector) => {
|
|
110
|
+
selector = dePseudify(selector)
|
|
111
|
+
/* TODO: process @-rules */
|
|
112
|
+
if (selector[0] === '@') {
|
|
113
|
+
return true
|
|
114
|
+
}
|
|
115
|
+
for (let i = 0, len = ignore.length; i < len; ++i) {
|
|
116
|
+
if (_.isRegExp(ignore[i]) && ignore[i].test(selector)) {
|
|
117
|
+
return true
|
|
118
|
+
}
|
|
119
|
+
if (/:\w+/.test(ignore[i])) {
|
|
120
|
+
const ignored = dePseudify(ignore[i])
|
|
121
|
+
if (ignored === selector) {
|
|
122
|
+
return true
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
if (ignore[i] === selector) {
|
|
126
|
+
return true
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return usedSelectors.indexOf(selector) !== -1
|
|
130
|
+
})
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Filter @keyframes that are not used
|
|
135
|
+
* @param {Object} css The postcss.Root node
|
|
136
|
+
* @param {Array} animations
|
|
137
|
+
* @param {Array} unusedRules
|
|
138
|
+
* @return {Array}
|
|
139
|
+
*/
|
|
140
|
+
function filterKeyframes(css, unusedRules) {
|
|
141
|
+
const usedAnimations = []
|
|
142
|
+
css.walkDecls((decl) => {
|
|
143
|
+
if (_.endsWith(decl.prop, 'animation-name')) {
|
|
144
|
+
/* Multiple animations, separated by comma */
|
|
145
|
+
usedAnimations.push(...postcss.list.comma(decl.value))
|
|
146
|
+
} else if (_.endsWith(decl.prop, 'animation')) {
|
|
147
|
+
/* Support multiple animations */
|
|
148
|
+
postcss.list.comma(decl.value).forEach((anim) => {
|
|
149
|
+
/* If declared as animation, name can be anywhere in the string; so we include all the properties */
|
|
150
|
+
usedAnimations.push(...postcss.list.space(anim))
|
|
151
|
+
})
|
|
152
|
+
}
|
|
153
|
+
})
|
|
154
|
+
const usedAnimationsSet = new Set(usedAnimations)
|
|
155
|
+
css.walkAtRules(/keyframes$/, (atRule) => {
|
|
156
|
+
if (!usedAnimationsSet.has(atRule.params)) {
|
|
157
|
+
unusedRules.push(atRule)
|
|
158
|
+
atRule.remove()
|
|
159
|
+
}
|
|
160
|
+
})
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Filter rules with no selectors remaining
|
|
165
|
+
* @param {Object} css The postcss.Root node
|
|
166
|
+
* @return {Array}
|
|
167
|
+
*/
|
|
168
|
+
function filterEmptyAtRules(css) {
|
|
169
|
+
/* Filter media queries with no remaining rules */
|
|
170
|
+
css.walkAtRules((atRule) => {
|
|
171
|
+
if (atRule.name === 'media' && atRule.nodes.length === 0) {
|
|
172
|
+
atRule.remove()
|
|
173
|
+
}
|
|
174
|
+
})
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Find which selectors are used in {pages}
|
|
179
|
+
* @param {Array} page List of jsdom pages
|
|
180
|
+
* @param {Object} css The postcss.Root node
|
|
181
|
+
* @return {Promise}
|
|
182
|
+
*/
|
|
183
|
+
function getUsedSelectors(page, css) {
|
|
184
|
+
let usedSelectors = []
|
|
185
|
+
css.walkRules((rule) => {
|
|
186
|
+
rule.selectors.filter((s) => /^@/.test(s)).forEach((s) => console.log(s))
|
|
187
|
+
usedSelectors = _.concat(usedSelectors, rule.selectors.map(dePseudify))
|
|
188
|
+
})
|
|
189
|
+
|
|
190
|
+
return findAll(page.window, usedSelectors)
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* Get all the selectors mentioned in {css}
|
|
195
|
+
* @param {Object} css The postcss.Root node
|
|
196
|
+
* @return {Array}
|
|
197
|
+
*/
|
|
198
|
+
function getAllSelectors(css) {
|
|
199
|
+
let selectors = []
|
|
200
|
+
css.walkRules((rule) => {
|
|
201
|
+
selectors = _.concat(selectors, rule.selector)
|
|
202
|
+
})
|
|
203
|
+
return selectors
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Remove css rules not used in the dom
|
|
208
|
+
* @param {Array} pages List of jsdom pages
|
|
209
|
+
* @param {Object} css The postcss.Root node
|
|
210
|
+
* @param {Array} ignore List of selectors to be ignored
|
|
211
|
+
* @param {Array} usedSelectors List of selectors that are found in {pages}
|
|
212
|
+
* @return {Object} A css_parse-compatible stylesheet
|
|
213
|
+
*/
|
|
214
|
+
function filterUnusedRules(css, ignore, usedSelectors) {
|
|
215
|
+
let ignoreNextRule = false,
|
|
216
|
+
ignoreNextRulesStart = false,
|
|
217
|
+
unusedRuleSelectors,
|
|
218
|
+
usedRuleSelectors
|
|
219
|
+
|
|
220
|
+
const unusedRules = []
|
|
221
|
+
|
|
222
|
+
/* Rule format:
|
|
223
|
+
* { selectors: [ '...', '...' ],
|
|
224
|
+
* declarations: [ { property: '...', value: '...' } ]
|
|
225
|
+
* },.
|
|
226
|
+
* Two steps: filter the unused selectors for each rule,
|
|
227
|
+
* filter the rules with no selectors
|
|
228
|
+
*/
|
|
229
|
+
ignoreNextRule = false
|
|
230
|
+
css.walk((rule) => {
|
|
231
|
+
if (rule.type === 'comment') {
|
|
232
|
+
if (/^!?\s?uncss:ignore start\s?$/.test(rule.text)) {
|
|
233
|
+
// ignore next rules while using comment `/* uncss:ignore start */`
|
|
234
|
+
ignoreNextRulesStart = true
|
|
235
|
+
} else if (/^!?\s?uncss:ignore end\s?$/.test(rule.text)) {
|
|
236
|
+
// until `/* uncss:ignore end */` was found
|
|
237
|
+
ignoreNextRulesStart = false
|
|
238
|
+
} else if (/^!?\s?uncss:ignore\s?$/.test(rule.text)) {
|
|
239
|
+
// ignore next rule while using comment `/* uncss:ignore */`
|
|
240
|
+
ignoreNextRule = true
|
|
241
|
+
}
|
|
242
|
+
} else if (rule.type === 'rule') {
|
|
243
|
+
if (
|
|
244
|
+
rule.parent.type === 'atrule' &&
|
|
245
|
+
_.endsWith(rule.parent.name, 'keyframes')
|
|
246
|
+
) {
|
|
247
|
+
// Don't remove animation keyframes that have selector names of '30%' or 'to'
|
|
248
|
+
return
|
|
249
|
+
}
|
|
250
|
+
if (ignoreNextRulesStart) {
|
|
251
|
+
ignore = ignore.concat(rule.selectors)
|
|
252
|
+
} else if (ignoreNextRule) {
|
|
253
|
+
ignoreNextRule = false
|
|
254
|
+
ignore = ignore.concat(rule.selectors)
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
usedRuleSelectors = filterUnusedSelectors(
|
|
258
|
+
rule.selectors,
|
|
259
|
+
ignore,
|
|
260
|
+
usedSelectors
|
|
261
|
+
)
|
|
262
|
+
unusedRuleSelectors = rule.selectors.filter(
|
|
263
|
+
(selector) => usedRuleSelectors.indexOf(selector) < 0
|
|
264
|
+
)
|
|
265
|
+
if (unusedRuleSelectors && unusedRuleSelectors.length) {
|
|
266
|
+
unusedRules.push({
|
|
267
|
+
type: 'rule',
|
|
268
|
+
selectors: unusedRuleSelectors,
|
|
269
|
+
position: rule.source,
|
|
270
|
+
})
|
|
271
|
+
}
|
|
272
|
+
if (usedRuleSelectors.length === 0) {
|
|
273
|
+
rule.remove()
|
|
274
|
+
} else {
|
|
275
|
+
rule.selectors = usedRuleSelectors
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
})
|
|
279
|
+
|
|
280
|
+
/* Filter the @media rules with no rules */
|
|
281
|
+
filterEmptyAtRules(css)
|
|
282
|
+
|
|
283
|
+
/* Filter unused @keyframes */
|
|
284
|
+
filterKeyframes(css, unusedRules)
|
|
285
|
+
|
|
286
|
+
return css
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* Main exposed function
|
|
291
|
+
* @param {Array} pages List of jsdom pages
|
|
292
|
+
* @param {Object} css The postcss.Root node
|
|
293
|
+
* @param {Array} ignore List of selectors to be ignored
|
|
294
|
+
* @return {Promise}
|
|
295
|
+
*/
|
|
296
|
+
module.exports = async function uncss(page, cssText, ignore = []) {
|
|
297
|
+
const pages = [page]
|
|
298
|
+
const css = postcss.parse(cssText)
|
|
299
|
+
css.walkAtRules('font-face', (rule) => {
|
|
300
|
+
rule.remove()
|
|
301
|
+
})
|
|
302
|
+
const nestedUsedSelectors = await Promise.all(
|
|
303
|
+
pages.map((page) => getUsedSelectors(page, css))
|
|
304
|
+
)
|
|
305
|
+
const usedSelectors = _.flatten(nestedUsedSelectors)
|
|
306
|
+
const filteredCss = filterUnusedRules(css, ignore, usedSelectors)
|
|
307
|
+
// console.log(usedSelectors)
|
|
308
|
+
// const allSelectors = getAllSelectors(css)
|
|
309
|
+
|
|
310
|
+
let newCssStr = ''
|
|
311
|
+
postcss.stringify(filteredCss, (result) => {
|
|
312
|
+
newCssStr += result
|
|
313
|
+
})
|
|
314
|
+
|
|
315
|
+
return newCssStr
|
|
316
|
+
// return [
|
|
317
|
+
// filteredCss,
|
|
318
|
+
// {
|
|
319
|
+
// /* Get the selectors for the report */
|
|
320
|
+
// all: allSelectors,
|
|
321
|
+
// unused: _.difference(allSelectors, usedSelectors),
|
|
322
|
+
// used: usedSelectors,
|
|
323
|
+
// },
|
|
324
|
+
// ]
|
|
325
|
+
}
|