11import { join } from 'node:path'
2- import fs , { readFile } from 'node:fs/promises'
2+ import fs from 'node:fs/promises'
33import { existsSync } from 'node:fs'
4+ import { hash } from 'ohash'
45import { addPlugin , addServerPlugin , addTemplate , addTypeTemplate , createResolver , defineNuxtModule } from '@nuxt/kit'
56
67function emptyDir ( dir : string ) {
@@ -14,21 +15,51 @@ function emptyDir(dir: string) {
1415}
1516
1617// Module options TypeScript interface definition
17- export interface ModuleOptions { }
18+ export interface ModuleOptions {
19+ /**
20+ * @default true
21+ */
22+ minify : boolean
23+ /**
24+ * @default true
25+ */
26+ removeUnused : boolean
27+
28+ /**
29+ * @default automatically use built-in modules via other configurations by default
30+ * @description Optimise css module path
31+ * @example
32+ * ```
33+ * // style-extractor.mjs
34+ * export default options => {
35+ * return options.css + 'body { background: red }'
36+ * }
37+ *
38+ * // nuxt.config.ts
39+ * export default defineNuxtConfig({
40+ * styleExtractor: {
41+ * transformFile: 'style-extractor.mjs'
42+ * }
43+ * })
44+ * ```
45+ */
46+ transformFile : string
47+ }
1848
1949export default defineNuxtModule < ModuleOptions > ( {
2050 meta : {
2151 name : 'nuxt-style-extractor' ,
22- configKey : 'Extracts the style of the page as an external css when rendered on the server side | 提取服务端渲染时页面的 style 为外部 css ' ,
52+ configKey : 'styleExtractor ' ,
2353 } ,
2454 defaults : {
25- minify : false ,
55+ minify : true ,
2656 removeUnused : true ,
57+ transformFile : '' ,
2758 } ,
2859 async setup ( _options , nuxt ) {
2960 const resolver = createResolver ( import . meta. url )
3061
31- addPlugin ( resolver . resolve ( './runtime/inject-style-id .server' ) )
62+ addPlugin ( resolver . resolve ( './runtime/plugin .server' ) )
3263
3364 addServerPlugin ( resolver . resolve ( './runtime/server/plugins/style-extractor' ) )
3465
@@ -55,18 +86,43 @@ export default defineNuxtModule<ModuleOptions>({
5586 }
5687
5788 addTemplate ( {
58- filename : 'nuxt-style-extractor-options.mjs' ,
89+ filename : 'nuxt-style-extractor-config-hash.mjs' ,
90+ getContents ( ) {
91+ return `export const configHash = "${ hash ( _options ) } "`
92+ } ,
93+ } )
5994
95+ addTemplate ( {
96+ filename : 'nuxt-style-extractor-transform.mjs' ,
6097 getContents ( ) {
61- return `export default ${ JSON . stringify ( _options ) } `
98+ if ( _options . transformFile !== '' ) {
99+ return fs . readFile ( _options . transformFile , 'utf-8' )
100+ }
101+ return fs . readFile ( getDefaultTransformFile ( ) , 'utf-8' )
62102 } ,
63103 } )
64104
65105 addTypeTemplate ( {
66- filename : 'nuxt-style-extractor-options .d.ts' ,
106+ filename : 'nuxt-style-extractor.d.ts' ,
67107 getContents ( ) {
68- return readFile ( resolver . resolve ( './runtime/nuxt-style-extractor-options .d.ts' ) , 'utf-8' )
108+ return fs . readFile ( resolver . resolve ( './runtime/nuxt-style-extractor.d.ts' ) , 'utf-8' )
69109 } ,
70110 } )
111+
112+ function getDefaultTransformFile ( ) {
113+ if ( _options . minify && _options . removeUnused ) {
114+ return resolver . resolve ( './runtime/transforms/best.mjs' )
115+ }
116+
117+ if ( _options . minify ) {
118+ return resolver . resolve ( './runtime/transforms/minify.mjs' )
119+ }
120+
121+ if ( _options . removeUnused ) {
122+ return resolver . resolve ( './runtime/transforms/remove-unused.mjs' )
123+ }
124+
125+ return resolver . resolve ( './runtime/transforms/plain.mjs' )
126+ }
71127 } ,
72128} )
0 commit comments