@coherent.js/devtools 1.0.0-beta.8 → 1.0.0-rc.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -1
- package/dist/performance/cache.js +417 -0
- package/dist/performance/cache.js.map +7 -0
- package/dist/performance/code-splitting.js +313 -0
- package/dist/performance/code-splitting.js.map +7 -0
- package/dist/performance/index.js +1443 -0
- package/dist/performance/index.js.map +7 -0
- package/dist/performance/lazy-loading.js +332 -0
- package/dist/performance/lazy-loading.js.map +7 -0
- package/dist/performance-dashboard.js +423 -0
- package/dist/performance-dashboard.js.map +7 -0
- package/package.json +23 -3
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
// src/performance/code-splitting.js
|
|
2
|
+
var CodeSplitter = class {
|
|
3
|
+
constructor(options = {}) {
|
|
4
|
+
this.options = {
|
|
5
|
+
preload: [],
|
|
6
|
+
prefetch: [],
|
|
7
|
+
timeout: 1e4,
|
|
8
|
+
retries: 3,
|
|
9
|
+
...options
|
|
10
|
+
};
|
|
11
|
+
this.modules = /* @__PURE__ */ new Map();
|
|
12
|
+
this.loading = /* @__PURE__ */ new Map();
|
|
13
|
+
this.failed = /* @__PURE__ */ new Set();
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Dynamically import a module
|
|
17
|
+
*
|
|
18
|
+
* @param {string} path - Module path
|
|
19
|
+
* @param {Object} [options] - Import options
|
|
20
|
+
* @returns {Promise} Module exports
|
|
21
|
+
*/
|
|
22
|
+
async import(path, options = {}) {
|
|
23
|
+
if (this.modules.has(path)) {
|
|
24
|
+
return this.modules.get(path);
|
|
25
|
+
}
|
|
26
|
+
if (this.loading.has(path)) {
|
|
27
|
+
return this.loading.get(path);
|
|
28
|
+
}
|
|
29
|
+
const importPromise = this.loadModule(path, options);
|
|
30
|
+
this.loading.set(path, importPromise);
|
|
31
|
+
try {
|
|
32
|
+
const module = await importPromise;
|
|
33
|
+
this.modules.set(path, module);
|
|
34
|
+
this.loading.delete(path);
|
|
35
|
+
return module;
|
|
36
|
+
} catch (error) {
|
|
37
|
+
this.loading.delete(path);
|
|
38
|
+
this.failed.add(path);
|
|
39
|
+
throw error;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Load module with retries
|
|
44
|
+
*/
|
|
45
|
+
async loadModule(path, options = {}) {
|
|
46
|
+
const maxRetries = options.retries ?? this.options.retries;
|
|
47
|
+
const timeout = options.timeout ?? this.options.timeout;
|
|
48
|
+
let lastError;
|
|
49
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
50
|
+
try {
|
|
51
|
+
const importPath = attempt > 0 ? `${path}?retry=${attempt}&t=${Date.now()}` : path;
|
|
52
|
+
const module = await Promise.race([
|
|
53
|
+
import(importPath),
|
|
54
|
+
new Promise(
|
|
55
|
+
(_, reject) => setTimeout(() => reject(new Error("Import timeout")), timeout)
|
|
56
|
+
)
|
|
57
|
+
]);
|
|
58
|
+
return module;
|
|
59
|
+
} catch (error) {
|
|
60
|
+
lastError = error;
|
|
61
|
+
if (attempt < maxRetries) {
|
|
62
|
+
await new Promise(
|
|
63
|
+
(resolve) => setTimeout(resolve, Math.pow(2, attempt) * 1e3)
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
throw new Error(`Failed to load module ${path}: ${lastError.message}`);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Preload modules
|
|
72
|
+
*/
|
|
73
|
+
async preload(paths) {
|
|
74
|
+
const pathArray = Array.isArray(paths) ? paths : [paths];
|
|
75
|
+
return Promise.all(
|
|
76
|
+
pathArray.map((path) => this.import(path).catch((err) => {
|
|
77
|
+
console.warn(`Failed to preload ${path}:`, err);
|
|
78
|
+
return null;
|
|
79
|
+
}))
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Prefetch modules (low priority)
|
|
84
|
+
*/
|
|
85
|
+
prefetch(paths) {
|
|
86
|
+
const pathArray = Array.isArray(paths) ? paths : [paths];
|
|
87
|
+
if (typeof requestIdleCallback !== "undefined") {
|
|
88
|
+
requestIdleCallback(() => {
|
|
89
|
+
pathArray.forEach((path) => {
|
|
90
|
+
this.import(path).catch(() => {
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
} else {
|
|
95
|
+
setTimeout(() => {
|
|
96
|
+
pathArray.forEach((path) => {
|
|
97
|
+
this.import(path).catch(() => {
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
}, 0);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Check if module is loaded
|
|
105
|
+
*/
|
|
106
|
+
isLoaded(path) {
|
|
107
|
+
return this.modules.has(path);
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Check if module is loading
|
|
111
|
+
*/
|
|
112
|
+
isLoading(path) {
|
|
113
|
+
return this.loading.has(path);
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Check if module failed to load
|
|
117
|
+
*/
|
|
118
|
+
hasFailed(path) {
|
|
119
|
+
return this.failed.has(path);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Clear cache
|
|
123
|
+
*/
|
|
124
|
+
clearCache(path = null) {
|
|
125
|
+
if (path) {
|
|
126
|
+
this.modules.delete(path);
|
|
127
|
+
this.failed.delete(path);
|
|
128
|
+
} else {
|
|
129
|
+
this.modules.clear();
|
|
130
|
+
this.failed.clear();
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Get statistics
|
|
135
|
+
*/
|
|
136
|
+
getStats() {
|
|
137
|
+
return {
|
|
138
|
+
loaded: this.modules.size,
|
|
139
|
+
loading: this.loading.size,
|
|
140
|
+
failed: this.failed.size,
|
|
141
|
+
modules: Array.from(this.modules.keys())
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
function createCodeSplitter(options = {}) {
|
|
146
|
+
return new CodeSplitter(options);
|
|
147
|
+
}
|
|
148
|
+
function lazy(loader, options = {}) {
|
|
149
|
+
let modulePromise = null;
|
|
150
|
+
let module = null;
|
|
151
|
+
let error = null;
|
|
152
|
+
return function LazyComponent(props = {}) {
|
|
153
|
+
if (module) {
|
|
154
|
+
const Component = module.default || module;
|
|
155
|
+
return Component(props);
|
|
156
|
+
}
|
|
157
|
+
if (error) {
|
|
158
|
+
if (options.errorComponent) {
|
|
159
|
+
return options.errorComponent({ error, retry: () => {
|
|
160
|
+
error = null;
|
|
161
|
+
modulePromise = null;
|
|
162
|
+
return LazyComponent(props);
|
|
163
|
+
} });
|
|
164
|
+
}
|
|
165
|
+
return {
|
|
166
|
+
div: {
|
|
167
|
+
className: "lazy-error",
|
|
168
|
+
text: `Error loading component: ${error.message}`
|
|
169
|
+
}
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
if (!modulePromise) {
|
|
173
|
+
modulePromise = loader().then((mod) => {
|
|
174
|
+
module = mod;
|
|
175
|
+
return mod;
|
|
176
|
+
}).catch((err) => {
|
|
177
|
+
error = err;
|
|
178
|
+
throw err;
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
if (options.loadingComponent) {
|
|
182
|
+
return options.loadingComponent(props);
|
|
183
|
+
}
|
|
184
|
+
return {
|
|
185
|
+
div: {
|
|
186
|
+
className: "lazy-loading",
|
|
187
|
+
text: options.loadingText || "Loading..."
|
|
188
|
+
}
|
|
189
|
+
};
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
function splitComponent(componentPath, options = {}) {
|
|
193
|
+
const splitter = new CodeSplitter(options);
|
|
194
|
+
return lazy(
|
|
195
|
+
() => splitter.import(componentPath),
|
|
196
|
+
options
|
|
197
|
+
);
|
|
198
|
+
}
|
|
199
|
+
function createRouteSplitter(routes) {
|
|
200
|
+
const splitter = new CodeSplitter();
|
|
201
|
+
const routeMap = /* @__PURE__ */ new Map();
|
|
202
|
+
for (const [path, config] of Object.entries(routes)) {
|
|
203
|
+
if (typeof config === "string") {
|
|
204
|
+
routeMap.set(path, {
|
|
205
|
+
loader: () => splitter.import(config)
|
|
206
|
+
});
|
|
207
|
+
} else {
|
|
208
|
+
routeMap.set(path, {
|
|
209
|
+
loader: () => splitter.import(config.component),
|
|
210
|
+
preload: config.preload || [],
|
|
211
|
+
...config
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
return {
|
|
216
|
+
/**
|
|
217
|
+
* Load route component
|
|
218
|
+
*/
|
|
219
|
+
async loadRoute(path) {
|
|
220
|
+
const route = routeMap.get(path);
|
|
221
|
+
if (!route) {
|
|
222
|
+
throw new Error(`Route not found: ${path}`);
|
|
223
|
+
}
|
|
224
|
+
if (route.preload && route.preload.length > 0) {
|
|
225
|
+
splitter.prefetch(route.preload);
|
|
226
|
+
}
|
|
227
|
+
return await route.loader();
|
|
228
|
+
},
|
|
229
|
+
/**
|
|
230
|
+
* Preload route
|
|
231
|
+
*/
|
|
232
|
+
preloadRoute(path) {
|
|
233
|
+
const route = routeMap.get(path);
|
|
234
|
+
if (route) {
|
|
235
|
+
return route.loader();
|
|
236
|
+
}
|
|
237
|
+
},
|
|
238
|
+
/**
|
|
239
|
+
* Get all routes
|
|
240
|
+
*/
|
|
241
|
+
getRoutes() {
|
|
242
|
+
return Array.from(routeMap.keys());
|
|
243
|
+
},
|
|
244
|
+
/**
|
|
245
|
+
* Get splitter instance
|
|
246
|
+
*/
|
|
247
|
+
getSplitter() {
|
|
248
|
+
return splitter;
|
|
249
|
+
}
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
var BundleAnalyzer = class {
|
|
253
|
+
constructor() {
|
|
254
|
+
this.chunks = /* @__PURE__ */ new Map();
|
|
255
|
+
this.loadTimes = /* @__PURE__ */ new Map();
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Track chunk load
|
|
259
|
+
*/
|
|
260
|
+
trackLoad(chunkName, size, loadTime) {
|
|
261
|
+
this.chunks.set(chunkName, { size, loadTime });
|
|
262
|
+
this.loadTimes.set(chunkName, loadTime);
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Get bundle statistics
|
|
266
|
+
*/
|
|
267
|
+
getStats() {
|
|
268
|
+
const chunks = Array.from(this.chunks.entries());
|
|
269
|
+
const totalSize = chunks.reduce((sum, [, chunk]) => sum + chunk.size, 0);
|
|
270
|
+
const avgLoadTime = chunks.reduce((sum, [, chunk]) => sum + chunk.loadTime, 0) / chunks.length;
|
|
271
|
+
return {
|
|
272
|
+
totalChunks: chunks.length,
|
|
273
|
+
totalSize,
|
|
274
|
+
averageLoadTime: avgLoadTime,
|
|
275
|
+
chunks: chunks.map(([name, data]) => ({
|
|
276
|
+
name,
|
|
277
|
+
size: data.size,
|
|
278
|
+
loadTime: data.loadTime,
|
|
279
|
+
percentage: (data.size / totalSize * 100).toFixed(2)
|
|
280
|
+
}))
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Find largest chunks
|
|
285
|
+
*/
|
|
286
|
+
getLargestChunks(limit = 10) {
|
|
287
|
+
return Array.from(this.chunks.entries()).sort((a, b) => b[1].size - a[1].size).slice(0, limit).map(([name, data]) => ({ name, ...data }));
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Find slowest chunks
|
|
291
|
+
*/
|
|
292
|
+
getSlowestChunks(limit = 10) {
|
|
293
|
+
return Array.from(this.chunks.entries()).sort((a, b) => b[1].loadTime - a[1].loadTime).slice(0, limit).map(([name, data]) => ({ name, ...data }));
|
|
294
|
+
}
|
|
295
|
+
};
|
|
296
|
+
var code_splitting_default = {
|
|
297
|
+
CodeSplitter,
|
|
298
|
+
createCodeSplitter,
|
|
299
|
+
lazy,
|
|
300
|
+
splitComponent,
|
|
301
|
+
createRouteSplitter,
|
|
302
|
+
BundleAnalyzer
|
|
303
|
+
};
|
|
304
|
+
export {
|
|
305
|
+
BundleAnalyzer,
|
|
306
|
+
CodeSplitter,
|
|
307
|
+
createCodeSplitter,
|
|
308
|
+
createRouteSplitter,
|
|
309
|
+
code_splitting_default as default,
|
|
310
|
+
lazy,
|
|
311
|
+
splitComponent
|
|
312
|
+
};
|
|
313
|
+
//# sourceMappingURL=code-splitting.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/performance/code-splitting.js"],
|
|
4
|
+
"sourcesContent": ["/**\n * Coherent.js Code Splitting\n * \n * Dynamic imports and code splitting utilities\n * \n * @module performance/code-splitting\n */\n\n/**\n * Code Splitter\n * Manages dynamic imports and lazy loading\n */\nexport class CodeSplitter {\n constructor(options = {}) {\n this.options = {\n preload: [],\n prefetch: [],\n timeout: 10000,\n retries: 3,\n ...options\n };\n \n this.modules = new Map();\n this.loading = new Map();\n this.failed = new Set();\n }\n\n /**\n * Dynamically import a module\n * \n * @param {string} path - Module path\n * @param {Object} [options] - Import options\n * @returns {Promise} Module exports\n */\n async import(path, options = {}) {\n // Check cache\n if (this.modules.has(path)) {\n return this.modules.get(path);\n }\n\n // Check if already loading\n if (this.loading.has(path)) {\n return this.loading.get(path);\n }\n\n // Create import promise\n const importPromise = this.loadModule(path, options);\n this.loading.set(path, importPromise);\n\n try {\n const module = await importPromise;\n this.modules.set(path, module);\n this.loading.delete(path);\n return module;\n } catch (error) {\n this.loading.delete(path);\n this.failed.add(path);\n throw error;\n }\n }\n\n /**\n * Load module with retries\n */\n async loadModule(path, options = {}) {\n const maxRetries = options.retries ?? this.options.retries;\n const timeout = options.timeout ?? this.options.timeout;\n \n let lastError;\n \n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n // Add cache busting if retry\n const importPath = attempt > 0 \n ? `${path}?retry=${attempt}&t=${Date.now()}`\n : path;\n\n // Import with timeout\n const module = await Promise.race([\n import(importPath),\n new Promise((_, reject) => \n setTimeout(() => reject(new Error('Import timeout')), timeout)\n )\n ]);\n\n return module;\n } catch (error) {\n lastError = error;\n \n if (attempt < maxRetries) {\n // Exponential backoff\n await new Promise(resolve => \n setTimeout(resolve, Math.pow(2, attempt) * 1000)\n );\n }\n }\n }\n\n throw new Error(`Failed to load module ${path}: ${lastError.message}`);\n }\n\n /**\n * Preload modules\n */\n async preload(paths) {\n const pathArray = Array.isArray(paths) ? paths : [paths];\n \n return Promise.all(\n pathArray.map(path => this.import(path).catch(err => {\n console.warn(`Failed to preload ${path}:`, err);\n return null;\n }))\n );\n }\n\n /**\n * Prefetch modules (low priority)\n */\n prefetch(paths) {\n const pathArray = Array.isArray(paths) ? paths : [paths];\n \n if (typeof requestIdleCallback !== 'undefined') {\n requestIdleCallback(() => {\n pathArray.forEach(path => {\n this.import(path).catch(() => {});\n });\n });\n } else {\n setTimeout(() => {\n pathArray.forEach(path => {\n this.import(path).catch(() => {});\n });\n }, 0);\n }\n }\n\n /**\n * Check if module is loaded\n */\n isLoaded(path) {\n return this.modules.has(path);\n }\n\n /**\n * Check if module is loading\n */\n isLoading(path) {\n return this.loading.has(path);\n }\n\n /**\n * Check if module failed to load\n */\n hasFailed(path) {\n return this.failed.has(path);\n }\n\n /**\n * Clear cache\n */\n clearCache(path = null) {\n if (path) {\n this.modules.delete(path);\n this.failed.delete(path);\n } else {\n this.modules.clear();\n this.failed.clear();\n }\n }\n\n /**\n * Get statistics\n */\n getStats() {\n return {\n loaded: this.modules.size,\n loading: this.loading.size,\n failed: this.failed.size,\n modules: Array.from(this.modules.keys())\n };\n }\n}\n\n/**\n * Create a code splitter\n */\nexport function createCodeSplitter(options = {}) {\n return new CodeSplitter(options);\n}\n\n/**\n * Lazy load a component\n * \n * @param {Function} loader - Function that returns import promise\n * @param {Object} [options] - Lazy loading options\n * @returns {Function} Lazy component\n */\nexport function lazy(loader, options = {}) {\n let modulePromise = null;\n let module = null;\n let error = null;\n\n return function LazyComponent(props = {}) {\n // If already loaded, return component\n if (module) {\n const Component = module.default || module;\n return Component(props);\n }\n\n // If error occurred, show error\n if (error) {\n if (options.errorComponent) {\n return options.errorComponent({ error, retry: () => {\n error = null;\n modulePromise = null;\n return LazyComponent(props);\n }});\n }\n return {\n div: {\n className: 'lazy-error',\n text: `Error loading component: ${error.message}`\n }\n };\n }\n\n // Start loading if not already\n if (!modulePromise) {\n modulePromise = loader()\n .then(mod => {\n module = mod;\n return mod;\n })\n .catch(err => {\n error = err;\n throw err;\n });\n }\n\n // Show loading state\n if (options.loadingComponent) {\n return options.loadingComponent(props);\n }\n\n return {\n div: {\n className: 'lazy-loading',\n text: options.loadingText || 'Loading...'\n }\n };\n };\n}\n\n/**\n * Split component into chunks\n */\nexport function splitComponent(componentPath, options = {}) {\n const splitter = new CodeSplitter(options);\n \n return lazy(\n () => splitter.import(componentPath),\n options\n );\n}\n\n/**\n * Create route-based code splitting\n */\nexport function createRouteSplitter(routes) {\n const splitter = new CodeSplitter();\n const routeMap = new Map();\n\n // Process routes\n for (const [path, config] of Object.entries(routes)) {\n if (typeof config === 'string') {\n // Simple path to component\n routeMap.set(path, {\n loader: () => splitter.import(config)\n });\n } else {\n // Full config\n routeMap.set(path, {\n loader: () => splitter.import(config.component),\n preload: config.preload || [],\n ...config\n });\n }\n }\n\n return {\n /**\n * Load route component\n */\n async loadRoute(path) {\n const route = routeMap.get(path);\n if (!route) {\n throw new Error(`Route not found: ${path}`);\n }\n\n // Preload dependencies\n if (route.preload && route.preload.length > 0) {\n splitter.prefetch(route.preload);\n }\n\n // Load main component\n return await route.loader();\n },\n\n /**\n * Preload route\n */\n preloadRoute(path) {\n const route = routeMap.get(path);\n if (route) {\n return route.loader();\n }\n },\n\n /**\n * Get all routes\n */\n getRoutes() {\n return Array.from(routeMap.keys());\n },\n\n /**\n * Get splitter instance\n */\n getSplitter() {\n return splitter;\n }\n };\n}\n\n/**\n * Bundle analyzer helper\n */\nexport class BundleAnalyzer {\n constructor() {\n this.chunks = new Map();\n this.loadTimes = new Map();\n }\n\n /**\n * Track chunk load\n */\n trackLoad(chunkName, size, loadTime) {\n this.chunks.set(chunkName, { size, loadTime });\n this.loadTimes.set(chunkName, loadTime);\n }\n\n /**\n * Get bundle statistics\n */\n getStats() {\n const chunks = Array.from(this.chunks.entries());\n const totalSize = chunks.reduce((sum, [, chunk]) => sum + chunk.size, 0);\n const avgLoadTime = chunks.reduce((sum, [, chunk]) => sum + chunk.loadTime, 0) / chunks.length;\n\n return {\n totalChunks: chunks.length,\n totalSize,\n averageLoadTime: avgLoadTime,\n chunks: chunks.map(([name, data]) => ({\n name,\n size: data.size,\n loadTime: data.loadTime,\n percentage: (data.size / totalSize * 100).toFixed(2)\n }))\n };\n }\n\n /**\n * Find largest chunks\n */\n getLargestChunks(limit = 10) {\n return Array.from(this.chunks.entries())\n .sort((a, b) => b[1].size - a[1].size)\n .slice(0, limit)\n .map(([name, data]) => ({ name, ...data }));\n }\n\n /**\n * Find slowest chunks\n */\n getSlowestChunks(limit = 10) {\n return Array.from(this.chunks.entries())\n .sort((a, b) => b[1].loadTime - a[1].loadTime)\n .slice(0, limit)\n .map(([name, data]) => ({ name, ...data }));\n }\n}\n\nexport default {\n CodeSplitter,\n createCodeSplitter,\n lazy,\n splitComponent,\n createRouteSplitter,\n BundleAnalyzer\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|