init
This commit is contained in:
parent
d09216bc99
commit
72bdcfd535
31
README.md
31
README.md
@ -1,2 +1,31 @@
|
||||
# gode
|
||||
A test project to implement a Node like javascript environment based on Golang
|
||||
|
||||
A test project to implement a Node like javascript environment based on goja
|
||||
|
||||
# Example
|
||||
|
||||
```golang
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/81120/gode/core"
|
||||
)
|
||||
|
||||
func main() {
|
||||
gode := core.New()
|
||||
gode.RegisterBuildInModule()
|
||||
|
||||
r := gode.GetRts()
|
||||
v, err := r.RunString(`
|
||||
var t = require('./test.js');
|
||||
t.test();
|
||||
`)
|
||||
if err != nil {
|
||||
fmt.Print(err)
|
||||
} else {
|
||||
fmt.Println(v)
|
||||
}
|
||||
}
|
||||
```
|
||||
|
21
core/console.go
Normal file
21
core/console.go
Normal file
@ -0,0 +1,21 @@
|
||||
package core
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
js "github.com/dop251/goja"
|
||||
)
|
||||
|
||||
func log(call js.FunctionCall) js.Value {
|
||||
str := call.Argument(0)
|
||||
fmt.Print(str.String())
|
||||
return str
|
||||
}
|
||||
|
||||
// RegisterConsole register a console.log to runtime
|
||||
func RegisterConsole(c *Core) {
|
||||
r := c.GetRts()
|
||||
o := r.NewObject()
|
||||
o.Set("log", log)
|
||||
r.Set("console", o)
|
||||
}
|
1
core/event-loop.go
Normal file
1
core/event-loop.go
Normal file
@ -0,0 +1 @@
|
||||
package core
|
52
core/loader.go
Normal file
52
core/loader.go
Normal file
@ -0,0 +1,52 @@
|
||||
package core
|
||||
|
||||
import (
|
||||
"io/ioutil"
|
||||
"path/filepath"
|
||||
|
||||
js "github.com/dop251/goja"
|
||||
)
|
||||
|
||||
func moduleTemplate(c string) string {
|
||||
return "(function(module, exports) {" + c + "\n})"
|
||||
}
|
||||
|
||||
func createModule(c *Core) *js.Object {
|
||||
r := c.GetRts()
|
||||
m := r.NewObject()
|
||||
e := r.NewObject()
|
||||
m.Set("exports", e)
|
||||
|
||||
return m
|
||||
}
|
||||
|
||||
func loadModule(c *Core, p string) *js.Program {
|
||||
p = filepath.Clean(p)
|
||||
pkg := c.Pkg[p]
|
||||
if pkg == nil {
|
||||
code, _ := ioutil.ReadFile(p)
|
||||
text := moduleTemplate(string(code))
|
||||
pkg, _ = js.Compile(p, text, false)
|
||||
c.Pkg[p] = pkg
|
||||
}
|
||||
return pkg
|
||||
}
|
||||
|
||||
// RegisterLoader register a simple commonjs style loader to runtime
|
||||
func RegisterLoader(c *Core) {
|
||||
r := c.GetRts()
|
||||
|
||||
r.Set("require", func(call js.FunctionCall) js.Value {
|
||||
p := call.Argument(0).String()
|
||||
prg := loadModule(c, p)
|
||||
|
||||
f, _ := r.RunProgram(prg)
|
||||
g, _ := js.AssertFunction(f)
|
||||
|
||||
m := createModule(c)
|
||||
jsExports := m.Get("exports")
|
||||
g(jsExports, m, jsExports)
|
||||
|
||||
return m.Get("exports")
|
||||
})
|
||||
}
|
33
core/rts.go
Normal file
33
core/rts.go
Normal file
@ -0,0 +1,33 @@
|
||||
package core
|
||||
|
||||
import (
|
||||
js "github.com/dop251/goja"
|
||||
)
|
||||
|
||||
// Core is the basic struct of gode
|
||||
type Core struct {
|
||||
Rts *js.Runtime
|
||||
Pkg map[string]*js.Program
|
||||
}
|
||||
|
||||
// New create a *Core
|
||||
func New() *Core {
|
||||
vm := js.New()
|
||||
pkg := make(map[string]*js.Program)
|
||||
|
||||
return &Core{
|
||||
Rts: vm,
|
||||
Pkg: pkg,
|
||||
}
|
||||
}
|
||||
|
||||
// GetRts get the object of javascript runtime
|
||||
func (c *Core) GetRts() *js.Runtime {
|
||||
return c.Rts
|
||||
}
|
||||
|
||||
// RegisterBuildInModule register some build in modules to the runtime
|
||||
func (c *Core) RegisterBuildInModule() {
|
||||
RegisterConsole(c)
|
||||
RegisterLoader(c)
|
||||
}
|
10
go.mod
Normal file
10
go.mod
Normal file
@ -0,0 +1,10 @@
|
||||
module github.com/81120/gode
|
||||
|
||||
go 1.13
|
||||
|
||||
require (
|
||||
github.com/dlclark/regexp2 v1.2.0 // indirect
|
||||
github.com/dop251/goja v0.0.0-20190912223329-aa89e6a4c733
|
||||
github.com/go-sourcemap/sourcemap v2.1.2+incompatible // indirect
|
||||
golang.org/x/text v0.3.2 // indirect
|
||||
)
|
9
go.sum
Normal file
9
go.sum
Normal file
@ -0,0 +1,9 @@
|
||||
github.com/dlclark/regexp2 v1.2.0 h1:8sAhBGEM0dRWogWqWyQeIJnxjWO6oIjl8FKqREDsGfk=
|
||||
github.com/dlclark/regexp2 v1.2.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc=
|
||||
github.com/dop251/goja v0.0.0-20190912223329-aa89e6a4c733 h1:cyNc40Dx5YNEO94idePU8rhVd3dn+sd04Arh0kDBAaw=
|
||||
github.com/dop251/goja v0.0.0-20190912223329-aa89e6a4c733/go.mod h1:Mw6PkjjMXWbTj+nnj4s3QPXq1jaT0s5pC0iFD4+BOAA=
|
||||
github.com/go-sourcemap/sourcemap v2.1.2+incompatible h1:0b/xya7BKGhXuqFESKM4oIiRo9WOt2ebz7KxfreD6ug=
|
||||
github.com/go-sourcemap/sourcemap v2.1.2+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg=
|
||||
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
|
||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
23
main.go
Normal file
23
main.go
Normal file
@ -0,0 +1,23 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/81120/gode/core"
|
||||
)
|
||||
|
||||
func main() {
|
||||
gode := core.New()
|
||||
gode.RegisterBuildInModule()
|
||||
|
||||
r := gode.GetRts()
|
||||
v, err := r.RunString(`
|
||||
var t = require('./test.js');
|
||||
t.test();
|
||||
`)
|
||||
if err != nil {
|
||||
fmt.Print(err)
|
||||
} else {
|
||||
fmt.Println(v)
|
||||
}
|
||||
}
|
8
test.js
Normal file
8
test.js
Normal file
@ -0,0 +1,8 @@
|
||||
function test() {
|
||||
console.log('hello world\n');
|
||||
return 'Hello Golang~';
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
test: test,
|
||||
};
|
Loading…
Reference in New Issue
Block a user