1
1
const path = require ( 'path' ) ;
2
2
const fs = require ( 'fs' ) ;
3
+ const crypto = require ( 'crypto' ) ;
3
4
const jsParser = require ( 'uglify-js' ) . parser ;
4
5
const jsUglify = require ( 'uglify-js' ) . uglify ;
5
6
const cssUglify = require ( 'uglifycss' ) ;
@@ -8,6 +9,8 @@ process.on('message', function(m) {
8
9
const opt = m . opt ;
9
10
const cwd = m . cwd ;
10
11
const assetName = m . assetName ;
12
+ const nameReg = / ^ ( [ ^ \@ ] * ) \@ ? ( [ ^ \. ] + ) ( \. ( j s | c s s ) ) $ / ;
13
+ let replacedAssets = [ ] ;
11
14
12
15
if ( / \. j s $ / . test ( assetName ) || / \. c s s $ / . test ( assetName ) ) {
13
16
const content = fs . readFileSync ( path . resolve ( cwd , assetName ) , { encoding : 'utf8' } ) ;
@@ -25,10 +28,26 @@ process.on('message', function(m) {
25
28
minifiedCode = jsUglify . gen_code ( ast , true ) ;
26
29
} else if ( path . extname ( assetName ) === '.css' ) {
27
30
minifiedCode = cssUglify . processString ( content ) ;
28
- }
31
+ }
29
32
30
- minifiedCode && fs . writeFileSync ( path . resolve ( cwd , assetName ) , minifiedCode , { encoding : 'utf8' } ) ;
33
+ if ( minifiedCode ) {
34
+ fs . writeFileSync ( path . resolve ( cwd , assetName ) , minifiedCode , { encoding : 'utf8' } ) ;
35
+
36
+ // 重新生成版本号, webpack 打的样式文件 hash 会根据所在目录不同而不同,造成 beta/prd 环境下版本号不一致
37
+ var matchInfo = assetName . match ( nameReg ) ,
38
+ version = matchInfo [ 2 ] ;
39
+
40
+ const nextVersion = md5 ( minifiedCode ) ;
41
+ const nextName = assetName . replace ( version , nextVersion ) ;
42
+ fs . renameSync ( path . resolve ( cwd , assetName ) , path . resolve ( cwd , nextName ) ) ;
43
+
44
+ replacedAssets = [ assetName , nextName ] ;
45
+ }
31
46
}
32
47
33
- process . send ( 'complete' ) ;
48
+ process . send ( replacedAssets ) ;
34
49
} ) ;
50
+
51
+ function md5 ( content ) {
52
+ return crypto . createHash ( 'md5' ) . update ( content ) . digest ( 'hex' ) ;
53
+ }
0 commit comments