Skip to content

Commit 0c5a51a

Browse files
authored
feat(perf): skip bundling for assets (#795)
1 parent c8accc9 commit 0c5a51a

27 files changed

+733
-752
lines changed

.gitignore

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,11 @@ logs
1111
node_modules
1212
temp
1313
tmp
14-
packages/shiki/src/assets/langs
15-
packages/shiki/src/assets/themes
16-
packages/shiki/src/assets/*.json
14+
packages/shiki/src/langs
15+
packages/shiki/src/themes
16+
packages/shiki/src/*.json
17+
packages/shiki/src/langs
18+
packages/shiki/src/themes
1719
cache
1820
.eslintcache
1921
report-engine-js-compat.json

eslint.config.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,17 @@ export default antfu(
2222
},
2323
},
2424
ignores: [
25-
'packages/shiki/src/assets/*.ts',
2625
'**/fixtures/**',
2726
'**/vendor/**',
2827
'**/test/out/**',
2928
'docs/languages.md',
3029
'docs/themes.md',
30+
// Generated Files
31+
'packages/shiki/src/langs/**',
32+
'packages/shiki/src/themes/**',
33+
'packages/shiki/src/langs-bundle-full.ts',
34+
'packages/shiki/src/langs-bundle-web.ts',
35+
'packages/shiki/src/themes.ts',
3136
],
3237
},
3338
{

packages/engine-javascript/test/compare.test.ts

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -46,51 +46,51 @@ export interface Cases {
4646
const cases: Cases[] = [
4747
{
4848
name: 'json-basic',
49-
theme: () => import('../../shiki/src/assets/themes/nord'),
50-
lang: () => import('../../shiki/src/assets/langs/json'),
49+
theme: () => import('../../shiki/src/themes/nord.mjs'),
50+
lang: () => import('../../shiki/src/langs/json.mjs'),
5151
cases: [
5252
'{"foo":{"bar":1}}',
5353
'[undefined, null, true, false, 0, 1, 1.1, "foo", [], {}]',
5454
],
5555
},
5656
{
5757
name: 'html-basic',
58-
theme: () => import('../../shiki/src/assets/themes/nord'),
59-
lang: () => import('../../shiki/src/assets/langs/html'),
58+
theme: () => import('../../shiki/src/themes/nord.mjs'),
59+
lang: () => import('../../shiki/src/langs/html.mjs'),
6060
cases: [
6161
'<div class="foo">bar</div>',
6262
'<!DOCTYPE html><html><head><title>foo</title></head><body>bar</body></html>',
6363
],
6464
},
6565
{
6666
name: 'ts-basic',
67-
theme: () => import('../../shiki/src/assets/themes/nord'),
68-
lang: () => import('../../shiki/src/assets/langs/typescript'),
67+
theme: () => import('../../shiki/src/themes/nord.mjs'),
68+
lang: () => import('../../shiki/src/langs/typescript.mjs'),
6969
cases: [
7070
'const foo: string = "bar"',
7171
],
7272
},
7373
{
7474
name: 'jsonc',
75-
theme: () => import('../../shiki/src/assets/themes/nord'),
76-
lang: () => import('../../shiki/src/assets/langs/jsonc'),
75+
theme: () => import('../../shiki/src/themes/nord.mjs'),
76+
lang: () => import('../../shiki/src/langs/jsonc.mjs'),
7777
cases: [
7878
'// comment\n{"foo":"bar"}',
7979
],
8080
},
8181
{
8282
name: 'vue',
83-
theme: () => import('../../shiki/src/assets/themes/vitesse-dark'),
84-
lang: () => import('../../shiki/src/assets/langs/vue'),
83+
theme: () => import('../../shiki/src/themes/vitesse-dark.mjs'),
84+
lang: () => import('../../shiki/src/langs/vue.mjs'),
8585
cases: [
8686
`<script setup>\nimport { ref } from 'vue'\n</script>`,
8787
`<template>\n<div>{{ foo }}</div>\n</template>`,
8888
],
8989
},
9090
{
9191
name: 'toml',
92-
theme: () => import('../../shiki/src/assets/themes/nord'),
93-
lang: () => import('../../shiki/src/assets/langs/toml'),
92+
theme: () => import('../../shiki/src/themes/nord.mjs'),
93+
lang: () => import('../../shiki/src/langs/toml.mjs'),
9494
cases: [
9595
[
9696
`# This is a TOML document`,
@@ -104,8 +104,8 @@ const cases: Cases[] = [
104104
},
105105
{
106106
name: 'sql',
107-
theme: () => import('../../shiki/src/assets/themes/nord'),
108-
lang: () => import('../../shiki/src/assets/langs/sql'),
107+
theme: () => import('../../shiki/src/themes/nord.mjs'),
108+
lang: () => import('../../shiki/src/langs/sql.mjs'),
109109
cases: [
110110
'SELECT * FROM foo',
111111
[
@@ -119,8 +119,8 @@ const cases: Cases[] = [
119119
{
120120
skip: true,
121121
name: 'markdown',
122-
theme: () => import('../../shiki/src/assets/themes/nord'),
123-
lang: () => import('../../shiki/src/assets/langs/markdown'),
122+
theme: () => import('../../shiki/src/themes/nord.mjs'),
123+
lang: () => import('../../shiki/src/langs/markdown.mjs'),
124124
cases: [
125125
[
126126
'# Header',

packages/shiki/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@
129129
"@types/hast": "catalog:"
130130
},
131131
"devDependencies": {
132+
"rollup-plugin-copy": "^3.5.0",
132133
"tm-grammars": "catalog:",
133134
"tm-themes": "catalog:",
134135
"vscode-oniguruma": "catalog:"

packages/shiki/rollup.config.mjs

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ const external = [
3535
'@shikijs/engine-oniguruma',
3636
'@shikijs/vscode-textmate',
3737
'shiki/wasm',
38+
/[/\\]src[/\\](langs|themes)[/\\]/g,
3839
]
3940

4041
const plugins = [
@@ -52,27 +53,20 @@ export default defineConfig([
5253
{
5354
input: [
5455
...entries,
55-
// add language files entries
56-
...fg.sync('src/assets/langs/*.js'),
5756
],
5857
output: {
5958
dir: 'dist',
6059
format: 'esm',
61-
entryFileNames: (f) => {
62-
if (f.facadeModuleId?.match(/[\\/]langs[\\/]/))
63-
return `langs/${f.name}.mjs`
64-
return '[name].mjs'
65-
},
66-
chunkFileNames: (f) => {
67-
if (f.moduleIds.some(i => i.match(/[\\/]langs[\\/]/)))
68-
return `langs/${f.name}.mjs`
69-
else if (f.moduleIds.some(i => i.match(/[\\/]themes[\\/]/)))
70-
return 'themes/[name].mjs'
71-
return 'chunks/[name].mjs'
72-
},
60+
entryFileNames: '[name].mjs',
7361
},
7462
plugins: [
7563
...plugins,
64+
copy({
65+
targets: [
66+
{ src: './src/langs', dest: 'dist' },
67+
{ src: './src/themes', dest: 'dist' },
68+
],
69+
}),
7670
],
7771
external,
7872
},

packages/shiki/scripts/prepare.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ import fs from 'fs-extra'
22
import { prepareLangs } from './prepare/langs'
33
import { prepareTheme } from './prepare/themes'
44

5-
await fs.ensureDir('./src/assets/langs')
6-
await fs.emptyDir('./src/assets/langs')
7-
await fs.ensureDir('./src/assets/themes')
8-
await fs.emptyDir('./src/assets/themes')
5+
await fs.ensureDir('./src/langs')
6+
await fs.emptyDir('./src/langs')
7+
await fs.ensureDir('./src/themes')
8+
await fs.emptyDir('./src/themes')
99
await prepareLangs()
1010
await prepareTheme()

packages/shiki/scripts/prepare/langs.ts

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -96,9 +96,8 @@ export async function prepareLangs() {
9696
console.log(json.name, json.embeddedLangs)
9797

9898
await fs.writeFile(
99-
`./src/assets/langs/${lang.name}.js`,
100-
`${COMMENT_HEAD}
101-
${deps.map(i => `import ${i.replace(/\W/g, '_')} from './${i}'`).join('\n')}
99+
`./src/langs/${lang.name}.mjs`,
100+
`${deps.map(i => `import ${i.replace(/\W/g, '_')} from './${i}.mjs'`).join('\n')}
102101
103102
const lang = Object.freeze(JSON.parse(${JSON.stringify(JSON.stringify(json))}))
104103
@@ -108,18 +107,17 @@ ${[
108107
' lang',
109108
].join(',\n') || ''}
110109
]
111-
`.replace(/\n{2,}/g, '\n\n'),
110+
`.replace(/\n{2,}/g, '\n\n').trimStart(),
112111
'utf-8',
113112
)
114113

115114
for (const alias of json.aliases || []) {
116115
if (isInvalidFilename(alias))
117116
continue
118117
await fs.writeFile(
119-
`./src/assets/langs/${alias}.js`,
120-
`${COMMENT_HEAD}
121-
// ${alias} is an alias of ${lang.name}
122-
export { default } from './${lang.name}'
118+
`./src/langs/${alias}.mjs`,
119+
`/* Alias ${alias} for ${lang.name} */
120+
export { default } from './${lang.name}.mjs'
123121
`,
124122
'utf-8',
125123
)
@@ -129,9 +127,8 @@ export { default } from './${lang.name}'
129127
if (isInvalidFilename(name))
130128
continue
131129
await fs.writeFile(
132-
`./src/assets/langs/${name}.d.ts`,
133-
`${COMMENT_HEAD}
134-
import type { LanguageRegistration } from '@shikijs/core'
130+
`./src/langs/${name}.d.mts`,
131+
`import type { LanguageRegistration } from '@shikijs/core'
135132
const langs: LanguageRegistration []
136133
export default langs
137134
`,
@@ -169,14 +166,14 @@ export default langs
169166
id: i.name,
170167
name: i.displayName || i.name,
171168
aliases: i.aliases,
172-
import: `__(() => import('./langs/${i.name}')) as DynamicImportLanguageRegistration__`,
169+
import: `__(() => import('./langs/${i.name}.mjs')) as DynamicImportLanguageRegistration__`,
173170
}) as const)
174171
.sort((a, b) => a.id.localeCompare(b.id))
175172

176173
const type = info.flatMap(i => [...i.aliases || [], i.id]).sort().map(i => ` | '${i}'`).join('\n')
177174

178175
await fs.writeFile(
179-
`src/assets/${fileName}.ts`,
176+
`src/${fileName}.ts`,
180177
`${COMMENT_HEAD}
181178
import type { DynamicImportLanguageRegistration, BundledLanguageInfo } from '@shikijs/core'
182179

packages/shiki/scripts/prepare/themes.ts

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,16 @@ export async function prepareTheme(): Promise<void> {
88
const theme = await fs.readJSON(`./node_modules/tm-themes/themes/${t.name}.json`)
99

1010
await fs.writeFile(
11-
`./src/assets/themes/${t.name}.js`,
12-
`${COMMENT_HEAD}
11+
`./src/themes/${t.name}.mjs`,
12+
`/* Theme: ${theme.name} */
1313
export default Object.freeze(JSON.parse(${JSON.stringify(JSON.stringify(theme))}))
1414
`,
1515
'utf-8',
1616
)
1717

1818
await fs.writeFile(
19-
`./src/assets/themes/${t.name}.d.ts`,
20-
`${COMMENT_HEAD}
21-
import type { ThemeRegistration } from '@shikijs/core'
22-
19+
`./src/themes/${t.name}.d.mts`,
20+
`import type { ThemeRegistration } from '@shikijs/core'
2321
const theme: ThemeRegistration
2422
export default theme
2523
`,
@@ -30,11 +28,11 @@ export default theme
3028
id: t.name,
3129
displayName: theme.displayName,
3230
type: theme.type,
33-
import: `__(() => import('./themes/${t.name}')) as unknown as DynamicImportThemeRegistration__`,
31+
import: `__(() => import('./themes/${t.name}.mjs')) as unknown as DynamicImportThemeRegistration__`,
3432
}
3533
}))
3634
await fs.writeFile(
37-
'src/assets/themes.ts',
35+
'src/themes.ts',
3836
`${COMMENT_HEAD}
3937
import type { DynamicImportThemeRegistration, BundledThemeInfo } from '@shikijs/core'
4038

0 commit comments

Comments
 (0)