Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/zengming00/go-server-js

javascript web server, js server, 一种新的javascript写服务端程序的方案,没有回调,完全不同于node.js,更像php,或者说是披着js皮的go
https://github.com/zengming00/go-server-js

go goja golang javascript js js-server server

Last synced: 11 days ago
JSON representation

javascript web server, js server, 一种新的javascript写服务端程序的方案,没有回调,完全不同于node.js,更像php,或者说是披着js皮的go

Awesome Lists containing this project

README

        

996.icu

# a js server
一种新的javascript写服务端程序的方案,没有回调,完全不同于node.js

这可能是最简单的服务器方案了,因为它不需要任何配置,只有一个文件,运行它就有了完整的服务器、数据库和缓存系统,并且可以运行在go语言支持的所有平台上,例如:路由器上,相对于其它语言开发的服务器软件而言是非常有优势的,我曾经在路由器上配置过php服务器,花了好几个小时的时间,并且无法及时更新到新版本。这不像pc机那么容易的。

优点:
1. 免安装,无需配置任何环境,自带sqlite数据库和一个简易的缓存系统
2. go语言开发,无限扩展功能,可以自由定制
3. 跨平台,支持linux、windows、mac,支持x86/arm/mips等指令集的cpu(运行在安卓手机、树莓派、路由器、国产龙芯。。。)
4. 完全不同于node.js,没有回调,程序更易维护和编写,推荐使用typescript

缺点:
1. 由于每次js都是从磁盘读取再执行,因此性能不高,和node.js完全不是一个级别的,目前能完全满足小应用的需求,在这里能找到一份测试报告:https://github.com/zengming00/go-server-js-testShop
2. api目前不够完善,我只是需要什么就往上面加什么,你也可以
3. 目前没有文档支持,没空写,哈哈
4. 没有debug功能,调试不方便,这是个很严重的问题,目前没有办法

写node一年了,感觉node的异步优势很少用到,坑爹的回调让人非常痛苦,虽然说有async/await但仍然会时不时接触到,用async/await其实还是在写同步的代码,所谓的异步并发优势只能很少数场合能用到,有的时候甚至是得不偿失的。

在不了解node之前,在我的想象中以为node是像php那样写的,学过之后发现完全不是这样的,我曾经去找过类似这种东西,但是没找到,也许是我的方法不对,网上有个fibjs,那不是我想要的。并且,我是在发布go-server-js之后才听说的

所以我决定自己做一个,为此我曾经注册了serverjs.cn域名,我尝试过用c语言来写,C语言门槛太高了只做了一个能够连上redis的东西,还得靠cgi模式来提供服务,最终放弃了,后来接触了go语言,于是有了实现它的可能,最早是用的otto,后来才用的goja。

从开始到完成0.0.2版本应该花了一个多月吧,基本上都是在学go语言和尝试一些功能细节,最后还花时间将我一年前写的一个nodejs写的商城用我自创的go-server-js技术重写了一遍( 项目地址:https://github.com/zengming00/go-server-js-testShop ),并且和go-server-js 0.0.2捆绑发布。

再后来,为了验证go-server-js写的项目能不能够方便的移植到原生go语言项目,我又把这个商城用go语言写了一遍( 项目地址:https://github.com/zengming00/go-testShop ),得益于当时选择照抄go语言的编程风格,只需要将go-server-js封装好的一些功能实现,js代码到go语言代码的转换是很方便的

# 下载试用 (download),下载后运行go-server-js,打开 http://127.0.0.1:8080/ 就是一个商城
https://github.com/zengming00/go-server-js/releases

## 入门之helloworld
整个服务器就是go-server-js这个文件,不需要任何其它东西,运行它会在当前目录下生成一个config.json,这个是用来修改一些服务器配置的,比如端口号之类的。

在当前目录下创建test.js内容为

```js
response.write('helloworld');
```
运行go-server-js然后在浏览器打开 http://127.0.0.1:8080/test.js 就可以看到helloworld了,修改文件后不需要重启服务器
更多的教程不如直接看附带的商城源码,一些api与go语言是完全一样的,因此为后期移植到原生go语言提供了极大便利

# 用go-server-js写的项目
一个商城:https://github.com/zengming00/go-server-js-testShop

wooyun本地镜像:https://github.com/zengming00/go-server-js-wooyun

# 用go-server-js写的项目移植为go语言代码,两种等效代码对比

https://github.com/zengming00/go-testShop

![两种等效代码对比](https://github.com/zengming00/go-testShop/raw/master/public/uploads/1.png)

## 获取源码
```
go get -v github.com/zengming00/go-server-js
```

默认不会编译sqlite,在windows下编译sqlite需要安装 TDM-GCC 或 mingw64 并 set CGO_ENABLED = 1

如果要编译sqlite,在windows下运行build.bat,在linux下运行build_linux.sh

## 内部实现功能时需要注意的地方
```go
// 在go语言中如果是返回一个error,要经过转换才能给js使用
err := db.Close()
if err != nil {
return runtime.ToValue(lib.NewError(runtime, err))
}
return nil

// 如果类型无法处理,应该用这种方式抛出
panic(runtime.NewTypeError("p0 is not a string type:%T", args[0]))

// 如果有多个返回值,应该返回一个对象供js使用
tx, err := db.Begin()
if err != nil {
return lib.MakeErrorValue(runtime, err)
}
return lib.MakeReturnValue(runtime, NewTx(runtime, tx))

// 动态参数
args := lib.GetAllArgs(&call)
err := rows.Scan(args...)

// go语言原生类型的传递
p0 := GetNativeType(runtime, &call, 0)
if err, ok := p0.(error); ok {
return runtime.ToValue(os.IsNotExist(err))
}
panic(runtime.NewTypeError("p0 is not error type:%T", p0))

// 注意函数签名的不同
func(call goja.FunctionCall) goja.Value {}
func(call goja.ConstructorCall) *Object {}
```

# docker
```Dockerfile
FROM scratch
COPY . /
EXPOSE 8080
CMD [ "/go-server-js" ]
```
```sh
$ docker pull zengming00/go-server-js
$ docker run -d --rm -p 80:8080 zengming00/go-server-js
```

# docker 编译 mips 环境
docker pull zengming00/golang-mips