diff --git a/gojs.go b/gojs.go index 83aad27..401b6c2 100644 --- a/gojs.go +++ b/gojs.go @@ -79,6 +79,7 @@ type PreCompiledCode struct { CodeLines map[string][]string RealCodeLines map[string][]string Imports map[string]string + ImportedVar map[string]string } type RequirePlugins struct { @@ -141,8 +142,12 @@ func makeImport(moduleName, currentPath string, imported *map[string]string, log if importCode == "" { return "", "", "", searchList, nil } - + //importVar = (*fileToVar)[importFile] + //if importVar == "" { importVar = fmt.Sprintf("_import_%d_%s", len(*imported), u.UniqueId()) + // (*fileToVar)[importFile] = importVar + // fmt.Println("_import_=====", importFile, importVar) + //} (*imported)[importFile] = importVar importCode = exportMatcher.ReplaceAllStringFunc(importCode, func(exportStr string) string { 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), RealCodeLines: make(map[string][]string), Imports: make(map[string]string), + ImportedVar: make(map[string]string), } var outErr error - imported := make(map[string]string) tryPlugins := map[string]bool{} + //fmt.Println(filename, "===============\n", cc.FixedCode, "\n=================") cc.FixedCode = importMatcher.ReplaceAllStringFunc(cc.FixedCode, func(importStr string) string { m := importMatcher.FindStringSubmatch(importStr) - importVar := imported[m[2]] + importVar := cc.ImportedVar[m[2]] if importVar == "" { baseName := path.Base(m[2]) jsFile := m[2] @@ -207,7 +213,7 @@ func PreCompile(code, filename string, logger *log.Logger) (*PreCompiledCode, er return "" } } 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 != "" { cc.Imports[importFile] = importCode // merge plugins from new import @@ -253,6 +259,7 @@ func PreCompile(code, filename string, logger *log.Logger) (*PreCompiledCode, er return "let " + m[1] + " = " + importVar } }) + //fmt.Println(filename, "^^^^^^^^^^^^^^^^^^^\n", cc.FixedCode, "\n^^^^^^^^^^^^^^^^^^^==") cc.FixedCode = flowMethodTypeMatcher.ReplaceAllString(cc.FixedCode, ") {") cc.FixedCode = functionArgsForFlowMatcher.ReplaceAllStringFunc(cc.FixedCode, func(str string) string { @@ -309,13 +316,17 @@ func (rt *JSRuntime) runPreCompiled(cc *PreCompiledCode, isClosure bool, setToVa } for impFilename, impCode := range cc.Imports { - if r, err := rt.JsCtx.EvalFile(impCode, impFilename); err == nil { - r.Free() - } else { - // 检查错误 - stack := rt.getJSError(err) - rt.logger.Error(err.Error(), "stack", stack) - return nil, &JSError{error: err} + importVar := rt.imported[impFilename] + if importVar == "" { + importVar = cc.ImportedVar[impFilename] + if importVar == "" { + importVar = fmt.Sprintf("_import_%d_%s", len(rt.imported), u.UniqueId()) + cc.ImportedVar[impFilename] = importVar + } + if _, err := rt.run(impCode, true, importVar, impFilename); err != nil { + return nil, &JSError{error: err} + } + rt.imported[impFilename] = importVar } }