Skip to content

Commit 772b2f7

Browse files
authored
feat: enable usage of function as library fileName, close #3585 (#3625)
1 parent 02e244d commit 772b2f7

File tree

6 files changed

+54
-10
lines changed

6 files changed

+54
-10
lines changed

docs/config/index.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -621,10 +621,10 @@ createServer()
621621

622622
### build.lib
623623

624-
- **Type:** `{ entry: string, name?: string, formats?: ('es' | 'cjs' | 'umd' | 'iife')[], fileName?: string }`
624+
- **Type:** `{ entry: string, name?: string, formats?: ('es' | 'cjs' | 'umd' | 'iife')[], fileName?: string | ((format: ModuleFormat) => string) }`
625625
- **Related:** [Library Mode](/guide/build#library-mode)
626626

627-
Build as a library. `entry` is required since the library cannot use HTML as entry. `name` is the exposed global variable and is required when `formats` includes `'umd'` or `'iife'`. Default `formats` are `['es', 'umd']`. `fileName` is the name of the package file output, default `fileName` is the name option of package.json
627+
Build as a library. `entry` is required since the library cannot use HTML as entry. `name` is the exposed global variable and is required when `formats` includes `'umd'` or `'iife'`. Default `formats` are `['es', 'umd']`. `fileName` is the name of the package file output, default `fileName` is the name option of package.json, it can also be defined as function taking the `format` as an argument.
628628

629629
### build.manifest
630630

docs/guide/build.md

+2-1
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,8 @@ module.exports = {
108108
build: {
109109
lib: {
110110
entry: path.resolve(__dirname, 'lib/main.js'),
111-
name: 'MyLib'
111+
name: 'MyLib',
112+
fileName: format => `my-lib.${format}.js`
112113
},
113114
rollupOptions: {
114115
// make sure to externalize deps that shouldn't be bundled
+2-3
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
<!-- the production demo page, copied into dist/ -->
2-
32
<div class="es"></div>
43
<div class="umd"></div>
54

65
<script type="module">
7-
import myLib from './my-lib.es.js'
6+
import myLib from './my-lib-custom-filename.es.js'
87

98
myLib('.es')
109
</script>
1110

12-
<script src="./my-lib.umd.js"></script>
11+
<script src="./my-lib-custom-filename.umd.js"></script>
1312
<script>
1413
MyLib('.umd')
1514
</script>

packages/playground/lib/vite.config.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ module.exports = {
88
build: {
99
lib: {
1010
entry: path.resolve(__dirname, 'src/main.js'),
11-
name: 'MyLib'
11+
name: 'MyLib',
12+
fileName: (format) => `my-lib-custom-filename.${format}.js`
1213
}
1314
},
1415
plugins: [
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import { resolveLibFilename } from '../build'
2+
3+
describe('resolveLibFilename', () => {
4+
test('custom filename function', () => {
5+
const filename = resolveLibFilename(
6+
{
7+
fileName: (format) => `custom-filename-function.${format}.js`,
8+
entry: 'mylib.js'
9+
},
10+
'es',
11+
'mylib'
12+
)
13+
14+
expect(filename).toBe('custom-filename-function.es.js')
15+
})
16+
17+
test('custom filename string', () => {
18+
const filename = resolveLibFilename(
19+
{ fileName: 'custom-filename', entry: 'mylib.js' },
20+
'es',
21+
'mylib'
22+
)
23+
24+
expect(filename).toBe('custom-filename.es.js')
25+
})
26+
27+
test('package name as filename', () => {
28+
const filename = resolveLibFilename({ entry: 'mylib.js' }, 'es', 'mylib')
29+
30+
expect(filename).toBe('mylib.es.js')
31+
})
32+
})

packages/vite/src/node/build.ts

+14-3
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ import Rollup, {
1515
GetModuleInfo,
1616
WatcherOptions,
1717
RollupWatcher,
18-
RollupError
18+
RollupError,
19+
ModuleFormat
1920
} from 'rollup'
2021
import { buildReporterPlugin } from './plugins/reporter'
2122
import { buildHtmlPlugin } from './plugins/html'
@@ -198,7 +199,7 @@ export interface LibraryOptions {
198199
entry: string
199200
name?: string
200201
formats?: LibraryFormats[]
201-
fileName?: string
202+
fileName?: string | ((format: ModuleFormat) => string)
202203
}
203204

204205
export type LibraryFormats = 'es' | 'cjs' | 'umd' | 'iife'
@@ -425,7 +426,7 @@ async function doBuild(
425426
entryFileNames: ssr
426427
? `[name].js`
427428
: libOptions
428-
? `${libOptions.fileName || pkgName}.${output.format || `es`}.js`
429+
? resolveLibFilename(libOptions, output.format || 'es', pkgName)
429430
: path.posix.join(options.assetsDir, `[name].[hash].js`),
430431
chunkFileNames: libOptions
431432
? `[name].js`
@@ -621,6 +622,16 @@ function staticImportedByEntry(
621622
return someImporterIs
622623
}
623624

625+
export function resolveLibFilename(
626+
libOptions: LibraryOptions,
627+
format: ModuleFormat,
628+
pkgName: string
629+
): string {
630+
return typeof libOptions.fileName === 'function'
631+
? libOptions.fileName(format)
632+
: `${libOptions.fileName || pkgName}.${format}.js`
633+
}
634+
624635
function resolveBuildOutputs(
625636
outputs: OutputOptions | OutputOptions[] | undefined,
626637
libOptions: LibraryOptions | false,

0 commit comments

Comments
 (0)