Skip to content

Commit e505df6

Browse files
committed
fix: externalize shared VChart factory registry
1 parent 6a31ff5 commit e505df6

6 files changed

Lines changed: 164 additions & 38 deletions

File tree

packages/vchart/bundler.config.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,12 +69,33 @@ const umdEntries = Object.keys(crossEnvs)
6969
.filter((input, index, arr) => arr.indexOf(input, 0) === index);
7070

7171
const multiEnvRuntimeEntries = new Set(['index-lark', 'index-wx', 'index-wx-simple', ...esEntries]);
72+
const factoryRegistryExternalId = '@visactor/vchart/esm/core/factory-registry';
7273

7374
function isBrowserRuntimeEntry(entry) {
7475
const entryName = path.basename(entry, path.extname(entry));
7576
return !multiEnvRuntimeEntries.has(entryName);
7677
}
7778

79+
function externalizeFactoryRegistryForEsTotal() {
80+
return {
81+
name: 'externalize-vchart-factory-registry',
82+
resolveId(source, importer) {
83+
if (
84+
source === './factory-registry' &&
85+
importer &&
86+
path.normalize(importer).endsWith(path.normalize('src/core/factory.ts'))
87+
) {
88+
return {
89+
id: factoryRegistryExternalId,
90+
external: true
91+
};
92+
}
93+
94+
return null;
95+
}
96+
};
97+
}
98+
7899
/**
79100
* @type {import('@internal/bundler').Config}
80101
*/
@@ -98,6 +119,9 @@ module.exports = {
98119
rollupOptions: {
99120
plugins
100121
},
122+
esTotalRollupOptions: {
123+
prePlugins: [externalizeFactoryRegistryForEsTotal()]
124+
},
101125
nodeResolveOptions: entry =>
102126
isBrowserRuntimeEntry(entry)
103127
? {
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
import type { Transform, Parser } from '@visactor/vdataset';
2+
// eslint-disable-next-line no-duplicate-imports
3+
import { fields, filter, fold, csvParser, dsvParser, tsvParser } from '@visactor/vdataset';
4+
import type { IChartConstructor } from '../chart/interface';
5+
import type { ISeriesConstructor } from '../series/interface';
6+
import type { IComponentConstructor } from '../component/interface';
7+
import type { MarkConstructor } from '../mark/interface';
8+
import type { IRegionConstructor } from '../region/interface';
9+
import type { ILayoutConstructor } from '../layout/interface';
10+
import type { IChartPluginConstructor } from '../plugin/chart/interface';
11+
import type { IComponentPluginConstructor } from '../plugin/components/interface';
12+
import type { IGraphic } from '@visactor/vrender-core';
13+
import type { GrammarTransformOption, IStageEventPlugin, VRenderComponentOptions } from './interface';
14+
import type { MarkAnimationSpec } from '../animation/interface';
15+
import type { ITriggerConstructor } from '../interaction/interface/trigger';
16+
import type { IComposedEventConstructor } from '../index-harmony-simple';
17+
import type { ITooltipProcessorConstructor } from '../component/tooltip/processor/interface';
18+
import type { IVChartPluginConstructor } from '../plugin/vchart';
19+
20+
export interface IFactoryRegistry {
21+
charts: { [key: string]: IChartConstructor };
22+
series: { [key: string]: ISeriesConstructor };
23+
components: {
24+
[key: string]: {
25+
cmp: IComponentConstructor;
26+
alwaysCheck?: boolean;
27+
createOrder: number;
28+
};
29+
};
30+
graphicComponents: Record<string, (attrs: any, options?: VRenderComponentOptions) => IGraphic>;
31+
marks: { [key: string]: MarkConstructor };
32+
regions: { [key: string]: IRegionConstructor };
33+
animations: { [key: string]: (params?: any, preset?: any) => MarkAnimationSpec };
34+
implements: { [key: string]: (...args: any) => void };
35+
chartPlugin: { [key: string]: IChartPluginConstructor };
36+
vChartPlugin: { [key: string]: IVChartPluginConstructor };
37+
componentPlugin: { [key: string]: IComponentPluginConstructor };
38+
transforms: { [key: string]: Transform };
39+
dataParser: { [key: string]: Parser };
40+
layout: { [key: string]: ILayoutConstructor };
41+
grammarTransforms: Record<string, GrammarTransformOption>;
42+
stageEventPlugins: Record<string, IStageEventPlugin<any>>;
43+
interactionTriggers: Record<string, ITriggerConstructor>;
44+
composedEventMap: Record<string, IComposedEventConstructor>;
45+
tooltipProcessors: Record<string, ITooltipProcessorConstructor>;
46+
formatter?: (text: string | number | string[] | number[], datum: any, formatter: string | string[]) => any;
47+
}
48+
49+
export const factoryRegistry: IFactoryRegistry = {
50+
charts: {},
51+
series: {},
52+
components: {},
53+
graphicComponents: {},
54+
marks: {},
55+
regions: {},
56+
animations: {},
57+
implements: {},
58+
chartPlugin: {},
59+
vChartPlugin: {},
60+
componentPlugin: {},
61+
transforms: {
62+
// buildIn transforms
63+
fields,
64+
filter,
65+
fold
66+
},
67+
dataParser: {
68+
// buildIn parser
69+
csv: csvParser,
70+
dsv: dsvParser,
71+
tsv: tsvParser
72+
},
73+
layout: {},
74+
grammarTransforms: {},
75+
stageEventPlugins: {},
76+
interactionTriggers: {},
77+
composedEventMap: {},
78+
tooltipProcessors: {},
79+
formatter: undefined
80+
};

packages/vchart/src/core/factory.ts

Lines changed: 24 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,6 @@ import { MarkTypeEnum } from '../mark/interface/type';
1313
import type { IRegion, IRegionConstructor } from '../region/interface';
1414
import type { IBaseModelSpecTransformer, IBaseModelSpecTransformerOption, IModelOption } from '../model/interface';
1515
import type { Transform, Parser } from '@visactor/vdataset';
16-
// eslint-disable-next-line no-duplicate-imports
17-
import { fields, filter, fold, csvParser, dsvParser, tsvParser } from '@visactor/vdataset';
1816
import type { ILayoutConstructor } from '../layout/interface';
1917
import type { IChartPluginConstructor } from '../plugin/chart/interface';
2018
import type { IComponentPluginConstructor } from '../plugin/components/interface';
@@ -26,44 +24,37 @@ import type { IComposedEventConstructor } from '../index-harmony-simple';
2624
import type { ITooltipProcessorConstructor } from '../component/tooltip/processor/interface';
2725
import type { ITooltip } from '../component';
2826
import type { IVChartPluginConstructor } from '../plugin/vchart';
27+
import { factoryRegistry } from './factory-registry';
2928

3029
export class Factory {
31-
private static _charts: { [key: string]: IChartConstructor } = {};
32-
private static _series: { [key: string]: ISeriesConstructor } = {};
30+
private static _charts: { [key: string]: IChartConstructor } = factoryRegistry.charts;
31+
private static _series: { [key: string]: ISeriesConstructor } = factoryRegistry.series;
3332
private static _components: {
3433
[key: string]: {
3534
cmp: IComponentConstructor;
3635
alwaysCheck?: boolean;
3736
createOrder: number;
3837
};
39-
} = {};
40-
private static _graphicComponents: Record<string, (attrs: any, options?: VRenderComponentOptions) => IGraphic> = {};
41-
private static _marks: { [key: string]: MarkConstructor } = {};
42-
private static _regions: { [key: string]: IRegionConstructor } = {};
43-
private static _animations: { [key: string]: (params?: any, preset?: any) => MarkAnimationSpec } = {};
44-
private static _implements: { [key: string]: (...args: any) => void } = {};
45-
private static _chartPlugin: { [key: string]: IChartPluginConstructor } = {};
46-
private static _vChartPlugin: { [key: string]: IVChartPluginConstructor } = {};
47-
private static _componentPlugin: { [key: string]: IComponentPluginConstructor } = {};
38+
} = factoryRegistry.components;
39+
private static _graphicComponents: Record<string, (attrs: any, options?: VRenderComponentOptions) => IGraphic> =
40+
factoryRegistry.graphicComponents;
41+
private static _marks: { [key: string]: MarkConstructor } = factoryRegistry.marks;
42+
private static _regions: { [key: string]: IRegionConstructor } = factoryRegistry.regions;
43+
private static _animations: { [key: string]: (params?: any, preset?: any) => MarkAnimationSpec } =
44+
factoryRegistry.animations;
45+
private static _implements: { [key: string]: (...args: any) => void } = factoryRegistry.implements;
46+
private static _chartPlugin: { [key: string]: IChartPluginConstructor } = factoryRegistry.chartPlugin;
47+
private static _vChartPlugin: { [key: string]: IVChartPluginConstructor } = factoryRegistry.vChartPlugin;
48+
private static _componentPlugin: { [key: string]: IComponentPluginConstructor } = factoryRegistry.componentPlugin;
4849
private static _formatter: (
4950
text: string | number | string[] | number[],
5051
datum: any,
5152
formatter: string | string[]
5253
) => any;
5354

54-
static transforms: { [key: string]: Transform } = {
55-
// buildIn transforms
56-
fields: fields,
57-
filter: filter,
58-
fold: fold
59-
};
60-
static dataParser: { [key: string]: Parser } = {
61-
// buildIn parser
62-
csv: csvParser,
63-
dsv: dsvParser,
64-
tsv: tsvParser
65-
};
66-
static _layout: { [key: string]: ILayoutConstructor } = {};
55+
static transforms: { [key: string]: Transform } = factoryRegistry.transforms;
56+
static dataParser: { [key: string]: Parser } = factoryRegistry.dataParser;
57+
static _layout: { [key: string]: ILayoutConstructor } = factoryRegistry.layout;
6758

6859
static registerChart(key: string, chart: IChartConstructor) {
6960
Factory._charts[key] = chart;
@@ -98,7 +89,7 @@ export class Factory {
9889
Factory.transforms[key] = transform;
9990
}
10091

101-
private static _grammarTransforms: Record<string, GrammarTransformOption> = {};
92+
private static _grammarTransforms: Record<string, GrammarTransformOption> = factoryRegistry.grammarTransforms;
10293

10394
static registerGrammarTransform(type: string, transform: GrammarTransformOption) {
10495
Factory._grammarTransforms[type] = transform;
@@ -288,13 +279,14 @@ export class Factory {
288279

289280
static registerFormatter(func: typeof Factory['_formatter']) {
290281
this._formatter = func;
282+
factoryRegistry.formatter = func;
291283
}
292284

293285
static getFormatter() {
294-
return this._formatter;
286+
return factoryRegistry.formatter ?? this._formatter;
295287
}
296288

297-
private static _stageEventPlugins: Record<string, IStageEventPlugin<any>> = {};
289+
private static _stageEventPlugins: Record<string, IStageEventPlugin<any>> = factoryRegistry.stageEventPlugins;
298290

299291
static registerStageEventPlugin = (type: string, Plugin: IStageEventPlugin<any>) => {
300292
Factory._stageEventPlugins[type] = Plugin;
@@ -304,7 +296,7 @@ export class Factory {
304296
return Factory._stageEventPlugins[type];
305297
};
306298

307-
private static _interactionTriggers: Record<string, ITriggerConstructor> = {};
299+
private static _interactionTriggers: Record<string, ITriggerConstructor> = factoryRegistry.interactionTriggers;
308300

309301
static registerInteractionTrigger = (interactionType: string, interaction: ITriggerConstructor) => {
310302
Factory._interactionTriggers[interactionType] = interaction;
@@ -323,7 +315,7 @@ export class Factory {
323315
return !!Factory._interactionTriggers[interactionType];
324316
}
325317

326-
private static _composedEventMap: Record<string, IComposedEventConstructor> = {};
318+
private static _composedEventMap: Record<string, IComposedEventConstructor> = factoryRegistry.composedEventMap;
327319

328320
static registerComposedEvent = (eType: string, composedEvent: IComposedEventConstructor) => {
329321
Factory._composedEventMap[eType] = composedEvent;
@@ -333,7 +325,7 @@ export class Factory {
333325
return Factory._composedEventMap[eType];
334326
}
335327

336-
private static _tooltipProcessors: Record<string, ITooltipProcessorConstructor> = {};
328+
private static _tooltipProcessors: Record<string, ITooltipProcessorConstructor> = factoryRegistry.tooltipProcessors;
337329
static registerTooltipProcessor = (type: string, processor: ITooltipProcessorConstructor) => {
338330
Factory._tooltipProcessors[type] = processor;
339331
};

tools/bundler/src/bootstrap.ts

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import ms from 'ms';
44
import watcher from 'glob-watcher';
55
import { DebugConfig } from './logic/debug';
66
import { parserCLIArgs, getDefaultConfig, getFinalConfig, loadConfigFile, DEFAULT_CONFIG_FILE } from './logic/config';
7-
import type { _ModuleKind } from './logic/config';
7+
import type { _ModuleKind, Config } from './logic/config';
88
import { loadPackageJson } from './logic/package';
99
import Undertaker, { Task } from 'undertaker';
1010
import Spinnies from '@trufflesuite/spinnies';
@@ -32,6 +32,19 @@ enum Tasks {
3232
// COPY_DIST = "Copy dist",
3333
COPY_FILES = 'Copy files'
3434
}
35+
36+
function mergeRollupOptions(
37+
base: Config['rollupOptions'],
38+
extra: Config['esTotalRollupOptions']
39+
): Config['rollupOptions'] {
40+
return {
41+
...base,
42+
...extra,
43+
prePlugins: [...(base.prePlugins ?? []), ...(extra.prePlugins ?? [])],
44+
plugins: [...((base.plugins ?? []) as any[]), ...((extra.plugins ?? []) as any[])]
45+
};
46+
}
47+
3548
async function bootstrap() {
3649
const args = parserCLIArgs(process.argv.slice(2));
3750
DebugConfig('CLI args', args);
@@ -104,7 +117,18 @@ async function bootstrap() {
104117
return;
105118
} else if (format === 'es' && config.esTotalFile) {
106119
subBuildTasks.push(`${taskName}_total`);
107-
_task(`${taskName}_total`, () => buildES({ ...config, minify: false }, PROJECT_ROOT, rawPackageJson, false));
120+
_task(`${taskName}_total`, () =>
121+
buildES(
122+
{
123+
...config,
124+
minify: false,
125+
rollupOptions: mergeRollupOptions(config.rollupOptions, config.esTotalRollupOptions)
126+
},
127+
PROJECT_ROOT,
128+
rawPackageJson,
129+
false
130+
)
131+
);
108132
}
109133

110134
_task(taskName, () =>

tools/bundler/src/logic/config.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import ArgsParser, { Arguments } from 'yargs-parser';
22
import type { RawPackageJson } from './package';
3-
import type { RollupOptions } from 'rollup';
3+
import type { Plugin, RollupOptions } from 'rollup';
44
import type { Alias } from '@rollup/plugin-alias';
55
import type { RollupNodeResolveOptions } from '@rollup/plugin-node-resolve';
66

@@ -102,7 +102,9 @@ export interface Config {
102102
// 构建 UMD 产物时,传递给 @rollup/plugin-alias 作为 entries 的选项
103103
alias: Array<Alias>;
104104
// 额外的 rollup 配置项
105-
rollupOptions: Omit<RollupOptions, 'output'>;
105+
rollupOptions: Omit<RollupOptions, 'output'> & { prePlugins?: Plugin[] };
106+
// 仅用于 esTotalFile 产物的额外 rollup 配置项
107+
esTotalRollupOptions: Omit<RollupOptions, 'output'> & { prePlugins?: Plugin[] };
106108
// 传给 @rollup/plugin-node-resolve 的配置项
107109
nodeResolveOptions:
108110
| RollupNodeResolveOptions
@@ -159,6 +161,7 @@ export function getDefaultConfig(): Config {
159161
external: [],
160162
alias: [],
161163
rollupOptions: {},
164+
esTotalRollupOptions: {},
162165
nodeResolveOptions: {},
163166
preTasks: {},
164167
postTasks: {},

tools/bundler/src/logic/rollup.config.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,14 @@ export function getRollupOptions(
4242
babelPlugins: BabelPlugins,
4343
config: Config
4444
): RollupOptions {
45+
const { prePlugins = [], plugins = [], ...rollupOptions } = config.rollupOptions;
46+
4547
return {
4648
input: entry,
4749
external: getExternal(rawPackageJson, config.external),
48-
...config.rollupOptions,
50+
...rollupOptions,
4951
plugins: [
52+
...prePlugins,
5053
resolve(getNodeResolveOptions(entry, config)),
5154
commonjs(),
5255
babel({ ...babelPlugins, babelHelpers: 'bundled' }),
@@ -68,7 +71,7 @@ export function getRollupOptions(
6871
}),
6972
Alias({ entries: config.alias }),
7073
...(config.minify ? [terser()] : []),
71-
...((config.rollupOptions.plugins as Plugin[]) || [])
74+
...(plugins as Plugin[])
7275
]
7376
};
7477
}

0 commit comments

Comments
 (0)