Skip to content

Commit 7fc7d95

Browse files
author
hubert
committed
perf: add VueDemi as default globalVariables
1 parent 8be9c7b commit 7fc7d95

File tree

6 files changed

+43
-30
lines changed

6 files changed

+43
-30
lines changed

packages/module-loader/src/core/componentLoader.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { promisify } from '../utils/promisify';
55

66
// Types
77
import { isVue2, Vue2, App, Component } from 'vue-demi';
8-
import { ModuleLoader } from '../types';
8+
import { Resolver } from '../types';
99

1010
/** 验证组件导出是否正确 */
1111
function validateExportComponent(exports: any) {
@@ -48,12 +48,14 @@ function getComponentFromExport(scriptExports: any, componentName: string, globa
4848
* create module loader
4949
* @param resolver resolver
5050
*/
51-
export function createComponentLoader(App: App | typeof Vue2, resolver: ModuleLoader['resolver']) {
51+
export function createComponentLoader<Context>(App: App | typeof Vue2, resolver: Resolver<Context>) {
5252
return async function loader<T = any>(
5353
componentName: string,
5454
src: string,
5555
styles?: string | string[],
5656
): Promise<Component<T>> {
57+
const context = resolver.getContext();
58+
5759
// load styles
5860
if (styles) {
5961
if (typeof styles === 'string') {
@@ -64,6 +66,6 @@ export function createComponentLoader(App: App | typeof Vue2, resolver: ModuleLo
6466

6567
// exec script
6668
const scriptExports = await promisify(resolver.execScript<object>(src));
67-
return getComponentFromExport(scriptExports, componentName, resolver.context);
69+
return getComponentFromExport(scriptExports, componentName, context);
6870
};
6971
}

packages/module-loader/src/core/moduleLoader.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {
1111
InnerRegisterSubModule,
1212
Lifecycle,
1313
RegisterProperties,
14-
ModuleLoader,
14+
Resolver,
1515
} from '../types';
1616
import { Bootstrap, Mount, Unmount } from '../sub/types';
1717

@@ -74,7 +74,7 @@ function execLifecycle(lifecycles: Lifecycle | Lifecycle[], module: InnerRegistr
7474
* @param App instance from 'createApp' in Vue3, Vue constructor in Vue2
7575
* @param resolver resolver
7676
*/
77-
export function createModuleLoader(App: App | typeof Vue2, resolver: ModuleLoader['resolver']) {
77+
export function createModuleLoader<Context>(App: App | typeof Vue2, resolver: Resolver<Context>) {
7878
return function loader(
7979
/**
8080
* @internal
@@ -92,7 +92,8 @@ export function createModuleLoader(App: App | typeof Vue2, resolver: ModuleLoade
9292
},
9393
): Promise<void> {
9494
// eslint-disable-next-line @typescript-eslint/no-this-alias
95-
const _self = this;
95+
const _self = this,
96+
context = resolver.getContext();
9697

9798
return new Promise((resolve) => {
9899
// 按顺序同步执行
@@ -169,7 +170,7 @@ export function createModuleLoader(App: App | typeof Vue2, resolver: ModuleLoade
169170
bootstrap,
170171
mount: exportMount,
171172
unmount: exportUnmount,
172-
} = getLifecyclesFromExports(scriptExports, name, resolver.context);
173+
} = getLifecyclesFromExports(scriptExports, name, context);
173174
// bootstrap only exec in the first time
174175
await promisify(bootstrap?.call(_self, App));
175176
// exec in unmount

packages/module-loader/src/createLoader.ts

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@ type XOR<T, U> = T | U extends object ? (Without<T, U> & U) | (Without<U, T> & T
1414
* create module loader
1515
*/
1616
export function createLoader<Props extends Record<string, any> = any, Context = any>(
17-
options: XOR<
17+
options: {
18+
globalVariables?: Record<string, any>;
19+
} & XOR<
1820
{
1921
/**
2022
* remote module resolver, default to umd resolver
@@ -24,17 +26,21 @@ export function createLoader<Props extends Record<string, any> = any, Context =
2426
ResolverCreatorOptions<WindowProxy>
2527
> = {},
2628
) {
27-
const { resolver, ...resolverOptions } = options;
28-
const _resolver = resolver ?? (createUmdResolver(resolverOptions) as Resolver<any>);
29+
const { resolver: customResolver, globalVariables, ...resolverOptions } = options;
30+
const resolver = customResolver ?? (createUmdResolver(resolverOptions) as Resolver<any>);
31+
resolver.setGlobalVariables({
32+
...globalVariables,
33+
VueDemi,
34+
});
2935

3036
const loader: ModuleLoader<Props, Context> = VueDemi.markRaw({
3137
install(app) {
3238
// this allows calling registerSubModules() outside of a component setup after
3339
setActiveLoader(loader);
3440

3541
if (!VueDemi.isVue2) {
36-
const moduleLoader = createModuleLoader(app, _resolver);
37-
const componentLoader = createComponentLoader(app, _resolver);
42+
const moduleLoader = createModuleLoader(app, resolver);
43+
const componentLoader = createComponentLoader(app, resolver);
3844

3945
loader._a = app;
4046
loader._moduleLoader = moduleLoader;
@@ -55,7 +61,7 @@ export function createLoader<Props extends Record<string, any> = any, Context =
5561
removeErrorHandler.call(null, handler);
5662
return this;
5763
},
58-
resolver: Object.freeze(_resolver),
64+
resolver: Object.freeze(resolver),
5965
// it's actually undefined here
6066
// @ts-expect-error set in install when using Vue 3
6167
_a: null,

packages/module-loader/src/resolvers/cjs.ts

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,8 @@ import { Context as vmContext } from 'vm';
66
import { ClientRequest, IncomingMessage } from 'http';
77
import { ResolverCreatorOptions, Resolver } from '../types';
88

9-
function createSandbox(globalVariables: Record<string, any> = {}) {
9+
function createSandbox() {
1010
const sandbox: Record<string, any> = {
11-
...globalVariables,
1211
Buffer: Buffer,
1312
require: require,
1413
console: console,
@@ -24,7 +23,7 @@ function createSandbox(globalVariables: Record<string, any> = {}) {
2423
sandbox.exports = {};
2524
sandbox.module = {};
2625

27-
return {};
26+
return sandbox;
2827
}
2928

3029
function tryGetCwd(path: any) {
@@ -44,10 +43,13 @@ function tryGetCwd(path: any) {
4443
return cwd;
4544
}
4645

47-
export function createCjsResolver({ globalVariables }: ResolverCreatorOptions): Resolver<vmContext> {
48-
const proxy = createSandbox(globalVariables);
46+
export function createCjsResolver(_: ResolverCreatorOptions): Resolver<vmContext> {
47+
const proxy = createSandbox();
4948
return {
50-
context: proxy,
49+
getContext: () => proxy,
50+
setGlobalVariables(variables) {
51+
proxy.global = { ...proxy.global, ...variables };
52+
},
5153
execScript(entry) {
5254
return new Promise((resolve, reject) => {
5355
const http = require('http');

packages/module-loader/src/resolvers/umd.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -72,20 +72,21 @@ function noteGlobalProps(global: WindowProxy) {
7272
const scriptsCache = new Map<string, any>();
7373
const stylesCache = new Map<string, HTMLLinkElement>();
7474

75-
function createSandbox(globalVariables: Record<string, any> = {}) {
75+
function createSandbox() {
7676
// TODO: load in sandbox
7777
const global: WindowProxy = window;
78-
Object.assign(global, globalVariables);
7978
return global;
8079
}
8180

8281
export function createUmdResolver({
8382
container = (proxy) => proxy.document.body,
84-
globalVariables,
8583
}: ResolverCreatorOptions): Resolver<WindowProxy> {
86-
const proxy = createSandbox(globalVariables);
84+
const proxy = createSandbox();
8785
return {
88-
context: proxy,
86+
getContext: () => proxy,
87+
setGlobalVariables(variables) {
88+
Object.assign(proxy, variables);
89+
},
8990
execScript(entry) {
9091
if (scriptsCache.has(entry)) return Promise.resolve(scriptsCache.get(entry)); // 从 catch 中获取
9192

packages/module-loader/src/types.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -212,9 +212,14 @@ export type ErrorHandler = (error: Error, module: InnerRegistrableModule) => voi
212212
*/
213213
export interface Resolver<Context = any> {
214214
/**
215-
* execution context
215+
* get execution context
216216
*/
217-
context: Context;
217+
getContext: () => Context;
218+
/**
219+
* set global variables to extend to resolver context
220+
* @param variables global variables
221+
*/
222+
setGlobalVariables(variables: Record<string, any>): void;
218223
/**
219224
* execute script
220225
* @param entry remote script src
@@ -240,8 +245,4 @@ export interface ResolverCreatorOptions<Context = any> {
240245
* container container to append script, default is append to body in client side
241246
*/
242247
container?: string | ((proxy: Context) => Element);
243-
/**
244-
* global variables to extend to resolver context
245-
*/
246-
globalVariables?: Record<string, any>;
247248
}

0 commit comments

Comments
 (0)