1
- const { basename, extname, posix , relative } = require ( 'path' ) ;
1
+ const { basename, extname, relative } = require ( 'path' ) ;
2
2
const { compile, preprocess } = require ( 'svelte' ) ;
3
3
const { getOptions } = require ( 'loader-utils' ) ;
4
- const { statSync, utimesSync, writeFileSync } = require ( 'fs' ) ;
5
- const { tmpdir } = require ( 'os' ) ;
4
+ const VirtualModulesPlugin = require ( 'webpack-virtual-modules' ) ;
6
5
7
6
const hotApi = require . resolve ( './lib/hot-api.js' ) ;
7
+ const virtualModules = new VirtualModulesPlugin ( ) ;
8
8
9
9
function makeHot ( id , code , hotOptions ) {
10
10
const options = JSON . stringify ( hotOptions ) ;
@@ -107,18 +107,18 @@ module.exports = function(source, map) {
107
107
options . preprocess . filename = options . filename ;
108
108
109
109
preprocess ( source , options . preprocess ) . then ( processed => {
110
- let { js, css, ast } = normalize ( compile ( processed . toString ( ) , options ) ) ;
110
+ let { js, css } = normalize ( compile ( processed . toString ( ) , options ) ) ;
111
111
112
112
if ( options . emitCss && css . code ) {
113
- const posixTmpdir = posixify ( tmpdir ( ) ) ;
114
- const tmpFile = posix . join ( posixTmpdir , 'svelte-' + ast . hash + '.css' ) ;
115
-
116
- css . code += '\n/*# sourceMappingURL=' + css . map . toUrl ( ) + '*/' ;
117
- js . code = js . code + `\nrequire(' ${ tmpFile } ');\n` ;
118
-
119
- writeFileSync ( tmpFile , css . code ) ;
120
- const { atime , mtime } = statSync ( tmpFile ) ;
121
- utimesSync ( tmpFile , new Date ( atime . getTime ( ) - 99999 ) , new Date ( mtime . getTime ( ) - 99999 ) ) ;
113
+ const cssFilepath = options . filename . replace (
114
+ / \. [ ^ / . ] + $ / ,
115
+ `. ${ Math . random ( )
116
+ . toString ( )
117
+ . slice ( 2 , 11 ) } .css`
118
+ ) ;
119
+ css . code += '\n/*# sourceMappingURL=' + css . map . toUrl ( ) + '*/'
120
+ js . code = js . code + `\nrequire(' ${ cssFilepath } ');\n`
121
+ virtualModules . writeModule ( cssFilepath , css . code )
122
122
}
123
123
124
124
if ( options . hotReload && ! isProduction && ! isServer ) {
@@ -134,3 +134,6 @@ module.exports = function(source, map) {
134
134
callback ( new Error ( `${ err . name } : ${ err . toString ( ) } ` ) ) ;
135
135
} ) ;
136
136
} ;
137
+
138
+ module . exports . plugin = virtualModules ;
139
+ module . exports . loader = __filename ;
0 commit comments