@@ -15,19 +15,30 @@ export const compile = (files: MultipleFiles) => {
15
15
16
16
export const babelTransform = ( filename : string , code : string , files : MultipleFiles ) => {
17
17
let result = '' ;
18
+ const _code = beforBabelTransform ( filename , code ) ;
18
19
try {
19
- result = transform ( code , {
20
+ result = transform ( _code , {
20
21
presets : [ 'react' , 'typescript' ] ,
21
22
filename,
22
23
plugins : [ customResolver ( files ) ] ,
23
- retainLines : true ,
24
+ retainLines : true , // 保留行号, 方便调试
24
25
} ) . code ! ;
25
26
} catch ( e ) {
26
27
console . error ( 'compiler Error' , e ) ;
27
28
}
28
29
return result ;
29
30
} ;
30
31
32
+ // 兼容 jsx runtime 版本的 react, 自动注入 import React from 'react'
33
+ function beforBabelTransform ( filename : string , code : string ) {
34
+ let _code = code ;
35
+ const regexReact = / i m p o r t \s + R e a c t / ;
36
+ if ( filename . endsWith ( '.tsx' ) || ( filename . endsWith ( '.jsx' ) && ! regexReact . test ( code ) ) ) {
37
+ _code = `import React from 'react';\n${ code } ` ;
38
+ }
39
+ return _code ;
40
+ }
41
+
31
42
function customResolver ( files : MultipleFiles ) : PluginObj {
32
43
return {
33
44
visitor : {
@@ -46,11 +57,15 @@ function customResolver(files: MultipleFiles): PluginObj {
46
57
path . node . source . value = css2Js ( file ) ;
47
58
} else if ( file . name . endsWith ( '.json' ) ) {
48
59
path . node . source . value = json2Js ( file ) ;
60
+ } else if ( file . name . endsWith ( '.svg' ) ) {
61
+ path . node . source . value = file . value ;
49
62
} else {
50
63
// jsx/tsx 代码是 react+ts,需要经 babel 编译才能展示
51
- path . node . source . value = URL . createObjectURL (
52
- new Blob ( [ babelTransform ( file . name , file . value , files ) ] , { type : 'text/javascript' } ) ,
53
- ) ;
64
+ // 再次调用 babelTransform, 进行深度递归
65
+ const blob = new Blob ( [ babelTransform ( file . name , file . value , files ) ] , {
66
+ type : 'text/javascript' ,
67
+ } ) ;
68
+ path . node . source . value = URL . createObjectURL ( blob ) ;
54
69
}
55
70
}
56
71
} ,
0 commit comments