fix precompile bug

This commit is contained in:
Star 2024-05-27 16:52:19 +08:00
parent c43a7e3404
commit f5b845f1ef

31
gojs.go
View File

@ -79,6 +79,7 @@ type PreCompiledCode struct {
CodeLines map[string][]string CodeLines map[string][]string
RealCodeLines map[string][]string RealCodeLines map[string][]string
Imports map[string]string Imports map[string]string
ImportedVar map[string]string
} }
type RequirePlugins struct { type RequirePlugins struct {
@ -141,8 +142,12 @@ func makeImport(moduleName, currentPath string, imported *map[string]string, log
if importCode == "" { if importCode == "" {
return "", "", "", searchList, nil return "", "", "", searchList, nil
} }
//importVar = (*fileToVar)[importFile]
//if importVar == "" {
importVar = fmt.Sprintf("_import_%d_%s", len(*imported), u.UniqueId()) importVar = fmt.Sprintf("_import_%d_%s", len(*imported), u.UniqueId())
// (*fileToVar)[importFile] = importVar
// fmt.Println("_import_=====", importFile, importVar)
//}
(*imported)[importFile] = importVar (*imported)[importFile] = importVar
importCode = exportMatcher.ReplaceAllStringFunc(importCode, func(exportStr string) string { importCode = exportMatcher.ReplaceAllStringFunc(importCode, func(exportStr string) string {
if strings.Contains(exportStr, "export default") { if strings.Contains(exportStr, "export default") {
@ -173,14 +178,15 @@ func PreCompile(code, filename string, logger *log.Logger) (*PreCompiledCode, er
CodeLines: make(map[string][]string), CodeLines: make(map[string][]string),
RealCodeLines: make(map[string][]string), RealCodeLines: make(map[string][]string),
Imports: make(map[string]string), Imports: make(map[string]string),
ImportedVar: make(map[string]string),
} }
var outErr error var outErr error
imported := make(map[string]string)
tryPlugins := map[string]bool{} tryPlugins := map[string]bool{}
//fmt.Println(filename, "===============\n", cc.FixedCode, "\n=================")
cc.FixedCode = importMatcher.ReplaceAllStringFunc(cc.FixedCode, func(importStr string) string { cc.FixedCode = importMatcher.ReplaceAllStringFunc(cc.FixedCode, func(importStr string) string {
m := importMatcher.FindStringSubmatch(importStr) m := importMatcher.FindStringSubmatch(importStr)
importVar := imported[m[2]] importVar := cc.ImportedVar[m[2]]
if importVar == "" { if importVar == "" {
baseName := path.Base(m[2]) baseName := path.Base(m[2])
jsFile := m[2] jsFile := m[2]
@ -207,7 +213,7 @@ func PreCompile(code, filename string, logger *log.Logger) (*PreCompiledCode, er
return "" return ""
} }
} else { } else {
if varName, importCode, importFile, searchList, err := makeImport(m[2], filepath.Dir(cc.Filename), &imported, logger); err == nil { if varName, importCode, importFile, searchList, err := makeImport(m[2], filepath.Dir(cc.Filename), &cc.ImportedVar, logger); err == nil {
if varName != "" && importCode != "" && importFile != "" { if varName != "" && importCode != "" && importFile != "" {
cc.Imports[importFile] = importCode cc.Imports[importFile] = importCode
// merge plugins from new import // merge plugins from new import
@ -253,6 +259,7 @@ func PreCompile(code, filename string, logger *log.Logger) (*PreCompiledCode, er
return "let " + m[1] + " = " + importVar return "let " + m[1] + " = " + importVar
} }
}) })
//fmt.Println(filename, "^^^^^^^^^^^^^^^^^^^\n", cc.FixedCode, "\n^^^^^^^^^^^^^^^^^^^==")
cc.FixedCode = flowMethodTypeMatcher.ReplaceAllString(cc.FixedCode, ") {") cc.FixedCode = flowMethodTypeMatcher.ReplaceAllString(cc.FixedCode, ") {")
cc.FixedCode = functionArgsForFlowMatcher.ReplaceAllStringFunc(cc.FixedCode, func(str string) string { cc.FixedCode = functionArgsForFlowMatcher.ReplaceAllStringFunc(cc.FixedCode, func(str string) string {
@ -309,14 +316,18 @@ func (rt *JSRuntime) runPreCompiled(cc *PreCompiledCode, isClosure bool, setToVa
} }
for impFilename, impCode := range cc.Imports { for impFilename, impCode := range cc.Imports {
if r, err := rt.JsCtx.EvalFile(impCode, impFilename); err == nil { importVar := rt.imported[impFilename]
r.Free() if importVar == "" {
} else { importVar = cc.ImportedVar[impFilename]
// 检查错误 if importVar == "" {
stack := rt.getJSError(err) importVar = fmt.Sprintf("_import_%d_%s", len(rt.imported), u.UniqueId())
rt.logger.Error(err.Error(), "stack", stack) cc.ImportedVar[impFilename] = importVar
}
if _, err := rt.run(impCode, true, importVar, impFilename); err != nil {
return nil, &JSError{error: err} return nil, &JSError{error: err}
} }
rt.imported[impFilename] = importVar
}
} }
if r, err := rt.JsCtx.EvalFile(fixedCode, cc.Filename); err == nil { if r, err := rt.JsCtx.EvalFile(fixedCode, cc.Filename); err == nil {