Skip to content

Commit 940b97c

Browse files
KazariEXjohnsoncodehk
authored andcommitted
feat(language-service): process references data at runtime to reduce bundle size (#5054)
1 parent f03a02f commit 940b97c

File tree

4 files changed

+131
-65
lines changed

4 files changed

+131
-65
lines changed

.github/workflows/update-html-data.yml

+3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
name: update-html-data
22

33
on:
4+
push:
5+
branches:
6+
- 'master'
47
workflow_dispatch:
58
schedule:
69
- cron: '0 0 * * *'
+54
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
[
2+
{
3+
"name": "en",
4+
"url": "https://vuejs.org/"
5+
},
6+
{
7+
"name": "zh-cn",
8+
"url": "https://cn.vuejs.org/"
9+
},
10+
{
11+
"name": "zh-hk",
12+
"url": "https://zh-hk.vuejs.org/"
13+
},
14+
{
15+
"name": "ja",
16+
"url": "https://ja.vuejs.org/"
17+
},
18+
{
19+
"name": "ua",
20+
"url": "https://ua.vuejs.org/"
21+
},
22+
{
23+
"name": "fr",
24+
"url": "https://fr.vuejs.org/"
25+
},
26+
{
27+
"name": "ko",
28+
"url": "https://ko.vuejs.org/"
29+
},
30+
{
31+
"name": "pt",
32+
"url": "https://pt.vuejs.org/"
33+
},
34+
{
35+
"name": "bn",
36+
"url": "https://bn.vuejs.org/"
37+
},
38+
{
39+
"name": "it",
40+
"url": "https://it.vuejs.org/"
41+
},
42+
{
43+
"name": "cs",
44+
"url": "https://cs.vuejs.org/"
45+
},
46+
{
47+
"name": "ru",
48+
"url": "https://ru.vuejs.org/"
49+
},
50+
{
51+
"name": "fa",
52+
"url": "https://fa.vuejs.org/"
53+
}
54+
]

packages/language-service/lib/plugins/data.ts

+52-20
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import type * as html from 'vscode-html-languageservice';
22

3+
let locale: { name: string, url: string; }[];
4+
35
export function loadTemplateData(lang: string) {
46

57
lang = lang.toLowerCase();
@@ -37,6 +39,8 @@ export function loadTemplateData(lang: string) {
3739
data = require('../../data/template/en.json');
3840
}
3941

42+
resolveReferences(data);
43+
4044
for (const attr of [...data.globalAttributes ?? []]) {
4145
if (!attr.name.startsWith('v-')) {
4246
data.globalAttributes?.push(
@@ -67,68 +71,96 @@ export function loadLanguageBlocks(lang: string): html.HTMLDataV1 {
6771

6872
lang = lang.toLowerCase();
6973

74+
let data: html.HTMLDataV1;
75+
7076
if (lang === 'ja') {
71-
return require('../../data/language-blocks/ja.json');
77+
data = require('../../data/language-blocks/ja.json');
7278
}
7379
else if (lang === 'fr') {
74-
return require('../../data/language-blocks/fr.json');
80+
data = require('../../data/language-blocks/fr.json');
7581
}
7682
else if (lang === 'ko') {
77-
return require('../../data/language-blocks/ko.json');
83+
data = require('../../data/language-blocks/ko.json');
7884
}
7985
else if (lang === 'pt-br') {
80-
return require('../../data/language-blocks/pt.json');
86+
data = require('../../data/language-blocks/pt.json');
8187
}
8288
else if (lang === 'zh-cn') {
83-
return require('../../data/language-blocks/zh-cn.json');
89+
data = require('../../data/language-blocks/zh-cn.json');
8490
}
8591
else if (lang === 'zh-tw') {
86-
return require('../../data/language-blocks/zh-hk.json');
92+
data = require('../../data/language-blocks/zh-hk.json');
8793
}
8894
else if (lang === 'it') {
89-
return require('../../data/language-blocks/it.json');
95+
data = require('../../data/language-blocks/it.json');
9096
}
9197
else if (lang === 'cs') {
92-
return require('../../data/language-blocks/cs.json');
98+
data = require('../../data/language-blocks/cs.json');
9399
}
94100
else if (lang === 'ru') {
95-
return require('../../data/language-blocks/ru.json');
101+
data = require('../../data/language-blocks/ru.json');
102+
}
103+
else {
104+
data = require('../../data/language-blocks/en.json');
96105
}
97106

98-
return require('../../data/language-blocks/en.json');
107+
resolveReferences(data);
108+
109+
return data;
99110
}
100111

101112
export function loadModelModifiersData(lang: string): html.HTMLDataV1 {
102113

103114
lang = lang.toLowerCase();
104115

116+
let data: html.HTMLDataV1;
117+
105118
if (lang === 'ja') {
106-
return require('../../data/model-modifiers/ja.json');
119+
data = require('../../data/model-modifiers/ja.json');
107120
}
108121
else if (lang === 'fr') {
109-
return require('../../data/model-modifiers/fr.json');
122+
data = require('../../data/model-modifiers/fr.json');
110123
}
111124
else if (lang === 'ko') {
112-
return require('../../data/model-modifiers/ko.json');
125+
data = require('../../data/model-modifiers/ko.json');
113126
}
114127
else if (lang === 'pt-br') {
115-
return require('../../data/model-modifiers/pt.json');
128+
data = require('../../data/model-modifiers/pt.json');
116129
}
117130
else if (lang === 'zh-cn') {
118-
return require('../../data/model-modifiers/zh-cn.json');
131+
data = require('../../data/model-modifiers/zh-cn.json');
119132
}
120133
else if (lang === 'zh-tw') {
121-
return require('../../data/model-modifiers/zh-hk.json');
134+
data = require('../../data/model-modifiers/zh-hk.json');
122135
}
123136
else if (lang === 'it') {
124-
return require('../../data/model-modifiers/it.json');
137+
data = require('../../data/model-modifiers/it.json');
125138
}
126139
else if (lang === 'cs') {
127-
return require('../../data/model-modifiers/cs.json');
140+
data = require('../../data/model-modifiers/cs.json');
128141
}
129142
else if (lang === 'ru') {
130-
return require('../../data/model-modifiers/ru.json');
143+
data = require('../../data/model-modifiers/ru.json');
131144
}
145+
else {
146+
data = require('../../data/model-modifiers/en.json');
147+
}
148+
149+
resolveReferences(data);
132150

133-
return require('../../data/model-modifiers/en.json');
151+
return data;
152+
}
153+
154+
function resolveReferences(data: html.HTMLDataV1) {
155+
locale ??= require('../../data/locale.json');
156+
157+
for (const item of [...data.globalAttributes ?? [], ...data.tags ?? []]) {
158+
if (typeof item.references === 'string') {
159+
const relativeUrl = item.references as string;
160+
item.references = locale.map(({ name, url }) => ({
161+
name,
162+
url: url + relativeUrl
163+
}));
164+
}
165+
}
134166
}

packages/language-service/scripts/update-html-data.js

+22-45
Original file line numberDiff line numberDiff line change
@@ -84,12 +84,22 @@ const langs = [
8484

8585
for (const lang of langs) {
8686
if (lang.supported) {
87+
localeWorker(lang);
8788
templateWorker(lang);
8889
sfcWorker(lang);
8990
modelWorker(lang);
9091
}
9192
}
9293

94+
function localeWorker(lang) {
95+
96+
const data = langs.map(({ name, url }) => ({ name, url }));
97+
98+
const writePath = path.resolve(__dirname, '../data/locale.json');
99+
fs.writeFileSync(writePath, JSON.stringify(data, null, 2));
100+
console.log(writePath);
101+
}
102+
93103
async function sfcWorker(lang) {
94104

95105
const sfcDoc = await fetchText(lang.repoUrl + 'HEAD/src/api/sfc-spec.md', lang.url);
@@ -115,10 +125,7 @@ async function sfcWorker(lang) {
115125
// { name: 'gql' },
116126
// { name: 'graphql' },
117127
],
118-
references: langs.map(lang => ({
119-
name: lang.name,
120-
url: `${lang.url}api/sfc-spec.html#pre-processors`,
121-
})),
128+
references: 'api/sfc-spec.html#pre-processors',
122129
};
123130
/**
124131
* @type {import('vscode-html-languageservice').IAttributeData}
@@ -129,10 +136,7 @@ async function sfcWorker(lang) {
129136
kind: 'markdown',
130137
value: sfcDoc.split('\n## ')[5].split('\n').slice(1).join('\n').trim(),
131138
},
132-
references: langs.map(lang => ({
133-
name: lang.name,
134-
url: `${lang.url}api/sfc-spec.html#src-imports`,
135-
})),
139+
references: 'api/sfc-spec.html#src-imports',
136140
};
137141
const languageBlocks = sfcDoc
138142
.split('\n## ')[2]
@@ -151,10 +155,7 @@ async function sfcWorker(lang) {
151155
kind: 'markdown',
152156
value: lines.slice(1).join('\n'),
153157
},
154-
references: langs.map(lang => ({
155-
name: lang.name,
156-
url: `${lang.url}api/sfc-spec.html#${normalizeHash(name)}`,
157-
})),
158+
references: `api/sfc-spec.html#${normalizeHash(name)}`,
158159
};
159160
if (name === 'template') {
160161
data.attributes.push({
@@ -196,10 +197,7 @@ async function sfcWorker(lang) {
196197
kind: 'markdown',
197198
value: cssFeaturesDoc.split('\n## ')[1].split('\n').slice(1).join('\n').trim(),
198199
},
199-
references: langs.map(lang => ({
200-
name: lang.name,
201-
url: `${lang.url}api/sfc-css-features.html#scoped-css`,
202-
})),
200+
references: 'api/sfc-css-features.html#scoped-css',
203201
});
204202
data.attributes.push({
205203
name: 'module',
@@ -208,10 +206,7 @@ async function sfcWorker(lang) {
208206
kind: 'markdown',
209207
value: cssFeaturesDoc.split('\n## ')[2].split('\n').slice(1).join('\n').trim(),
210208
},
211-
references: langs.map(lang => ({
212-
name: lang.name,
213-
url: `${lang.url}api/sfc-css-features.html#css-modules`,
214-
})),
209+
references: 'api/sfc-css-features.html#css-modules',
215210
});
216211
}
217212
return data;
@@ -265,10 +260,7 @@ async function modelWorker(lang) {
265260
kind: 'markdown',
266261
value: lines.slice(1).join('\n').trim(),
267262
},
268-
references: langs.map(lang => ({
269-
name: lang.name,
270-
url: `${lang.url}guide/essentials/forms.html#${normalizeHash(name)}`,
271-
})),
263+
references: `guide/essentials/forms.html#${normalizeHash(name)}`,
272264
};
273265
return data;
274266
});
@@ -310,10 +302,7 @@ async function templateWorker(lang) {
310302
value: lines.slice(1).join('\n'),
311303
},
312304
attributes: [],
313-
references: langs.map(lang => ({
314-
name: lang.name,
315-
url: `${lang.url}api/built-in-components.html#${normalizeHash(name)}`,
316-
})),
305+
references: `api/built-in-components.html#${normalizeHash(name)}`,
317306
};
318307
return data;
319308
});
@@ -333,10 +322,7 @@ async function templateWorker(lang) {
333322
value: lines.slice(1).join('\n'),
334323
},
335324
attributes: [],
336-
references: langs.map(lang => ({
337-
name: lang.name,
338-
url: `${lang.url}api/built-in-special-elements.html#${normalizeHash(name)}`,
339-
})),
325+
references: `api/built-in-special-elements.html#${normalizeHash(name)}`,
340326
};
341327
return data;
342328
});
@@ -361,10 +347,7 @@ async function templateWorker(lang) {
361347
kind: 'markdown',
362348
value: lines.slice(1).join('\n').trim(),
363349
},
364-
references: langs.map(lang => ({
365-
name: lang.name,
366-
url: `${lang.url}api/built-in-directives.html#${normalizeHash(name)}`,
367-
})),
350+
references: `api/built-in-directives.html#${normalizeHash(name)}`,
368351
};
369352
return data;
370353
});
@@ -383,10 +366,7 @@ async function templateWorker(lang) {
383366
kind: 'markdown',
384367
value: lines.slice(1).join('\n').trim(),
385368
},
386-
references: langs.map(lang => ({
387-
name: lang.name,
388-
url: `${lang.url}api/built-in-special-attributes.html#${normalizeHash(name)}`,
389-
})),
369+
references: `api/built-in-special-attributes.html#${normalizeHash(name)}`,
390370
};
391371
return data;
392372
});
@@ -397,18 +377,15 @@ async function templateWorker(lang) {
397377
const lines = section.split('\n');
398378
const name = 'data-allow-mismatch';
399379
/**
400-
* @type {import('vscode-html-languageservice').ITagData}
380+
* @type {import('vscode-html-languageservice').IAttributeData}
401381
*/
402382
const data = {
403383
name,
404384
description: {
405385
kind: 'markdown',
406386
value: lines.slice(1).join('\n'),
407387
},
408-
references: langs.map(lang => ({
409-
name: lang.name,
410-
url: `${lang.url}api/ssr.html#${normalizeHash(name)}`,
411-
})),
388+
references: `api/ssr.html#${normalizeHash(name)}`,
412389
};
413390
return data;
414391
})[0];

0 commit comments

Comments
 (0)