{"id":23127938,"url":"https://github.com/zengming00/go-server-js","last_synced_at":"2025-08-17T05:31:22.728Z","repository":{"id":81168696,"uuid":"115072353","full_name":"zengming00/go-server-js","owner":"zengming00","description":" javascript web server, js server, 一种新的javascript写服务端程序的方案，没有回调，完全不同于node.js，更像php，或者说是披着js皮的go","archived":false,"fork":false,"pushed_at":"2021-07-04T01:38:23.000Z","size":361,"stargazers_count":90,"open_issues_count":3,"forks_count":16,"subscribers_count":9,"default_branch":"master","last_synced_at":"2025-04-05T01:24:52.306Z","etag":null,"topics":["go","goja","golang","javascript","js","js-server","server"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/zengming00.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-12-22T03:26:35.000Z","updated_at":"2025-02-13T11:26:29.000Z","dependencies_parsed_at":"2024-06-20T15:34:34.830Z","dependency_job_id":"7f3b785c-f59a-49d1-a23b-afcf74edb37c","html_url":"https://github.com/zengming00/go-server-js","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/zengming00/go-server-js","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zengming00%2Fgo-server-js","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zengming00%2Fgo-server-js/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zengming00%2Fgo-server-js/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zengming00%2Fgo-server-js/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zengming00","download_url":"https://codeload.github.com/zengming00/go-server-js/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zengming00%2Fgo-server-js/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":270810874,"owners_count":24650007,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-17T02:00:09.016Z","response_time":129,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["go","goja","golang","javascript","js","js-server","server"],"created_at":"2024-12-17T09:15:58.140Z","updated_at":"2025-08-17T05:31:22.168Z","avatar_url":"https://github.com/zengming00.png","language":"Go","funding_links":[],"categories":["Go"],"sub_categories":[],"readme":"\u003ca href=\"https://996.icu\"\u003e\u003cimg src=\"https://img.shields.io/badge/link-996.icu-red.svg\" alt=\"996.icu\" /\u003e\u003c/a\u003e\n\n# a js server\n一种新的javascript写服务端程序的方案，没有回调，完全不同于node.js\n\n这可能是最简单的服务器方案了，因为它不需要任何配置，只有一个文件，运行它就有了完整的服务器、数据库和缓存系统，并且可以运行在go语言支持的所有平台上，例如:路由器上，相对于其它语言开发的服务器软件而言是非常有优势的，我曾经在路由器上配置过php服务器，花了好几个小时的时间，并且无法及时更新到新版本。这不像pc机那么容易的。\n\n优点：\n1. 免安装，无需配置任何环境，自带sqlite数据库和一个简易的缓存系统\n2. go语言开发，无限扩展功能，可以自由定制\n3. 跨平台，支持linux、windows、mac，支持x86/arm/mips等指令集的cpu（运行在安卓手机、树莓派、路由器、国产龙芯。。。）\n4. 完全不同于node.js，没有回调，程序更易维护和编写，推荐使用typescript\n\n缺点：\n1. 由于每次js都是从磁盘读取再执行，因此性能不高，和node.js完全不是一个级别的，目前能完全满足小应用的需求，在这里能找到一份测试报告：https://github.com/zengming00/go-server-js-testShop\n2. api目前不够完善，我只是需要什么就往上面加什么，你也可以\n3. 目前没有文档支持，没空写，哈哈\n4. 没有debug功能，调试不方便，这是个很严重的问题，目前没有办法\n\n写node一年了，感觉node的异步优势很少用到，坑爹的回调让人非常痛苦，虽然说有async/await但仍然会时不时接触到，用async/await其实还是在写同步的代码，所谓的异步并发优势只能很少数场合能用到，有的时候甚至是得不偿失的。\n\n在不了解node之前，在我的想象中以为node是像php那样写的，学过之后发现完全不是这样的，我曾经去找过类似这种东西，但是没找到，也许是我的方法不对，网上有个fibjs，那不是我想要的。并且，我是在发布go-server-js之后才听说的\n\n所以我决定自己做一个，为此我曾经注册了serverjs.cn域名，我尝试过用c语言来写，C语言门槛太高了只做了一个能够连上redis的东西，还得靠cgi模式来提供服务，最终放弃了，后来接触了go语言，于是有了实现它的可能，最早是用的otto，后来才用的goja。\n\n从开始到完成0.0.2版本应该花了一个多月吧，基本上都是在学go语言和尝试一些功能细节，最后还花时间将我一年前写的一个nodejs写的商城用我自创的go-server-js技术重写了一遍（ 项目地址：https://github.com/zengming00/go-server-js-testShop ），并且和go-server-js 0.0.2捆绑发布。\n\n再后来，为了验证go-server-js写的项目能不能够方便的移植到原生go语言项目，我又把这个商城用go语言写了一遍（ 项目地址：https://github.com/zengming00/go-testShop ），得益于当时选择照抄go语言的编程风格，只需要将go-server-js封装好的一些功能实现，js代码到go语言代码的转换是很方便的\n\n# 下载试用 (download)，下载后运行go-server-js，打开 http://127.0.0.1:8080/ 就是一个商城\nhttps://github.com/zengming00/go-server-js/releases\n\n## 入门之helloworld\n整个服务器就是go-server-js这个文件，不需要任何其它东西，运行它会在当前目录下生成一个config.json，这个是用来修改一些服务器配置的，比如端口号之类的。\n\n在当前目录下创建test.js内容为\n\n```js\nresponse.write('helloworld');\n```\n运行go-server-js然后在浏览器打开 http://127.0.0.1:8080/test.js 就可以看到helloworld了，修改文件后不需要重启服务器\n更多的教程不如直接看附带的商城源码，一些api与go语言是完全一样的，因此为后期移植到原生go语言提供了极大便利\n\n# 用go-server-js写的项目\n一个商城：https://github.com/zengming00/go-server-js-testShop\n\nwooyun本地镜像：https://github.com/zengming00/go-server-js-wooyun\n\n# 用go-server-js写的项目移植为go语言代码，两种等效代码对比\n\nhttps://github.com/zengming00/go-testShop\n\n![两种等效代码对比](https://github.com/zengming00/go-testShop/raw/master/public/uploads/1.png)\n\n\n## 获取源码\n```\ngo get -v github.com/zengming00/go-server-js\n```\n\n默认不会编译sqlite，在windows下编译sqlite需要安装 TDM-GCC 或 mingw64 并 set CGO_ENABLED = 1\n\n如果要编译sqlite，在windows下运行build.bat，在linux下运行build_linux.sh\n\n\n## 内部实现功能时需要注意的地方\n```go\n        // 在go语言中如果是返回一个error，要经过转换才能给js使用\n       err := db.Close()\n       if err != nil {\n           return runtime.ToValue(lib.NewError(runtime, err))\n       }\n       return nil\n\t\n        // 如果类型无法处理，应该用这种方式抛出\n       panic(runtime.NewTypeError(\"p0 is not a string type:%T\", args[0]))\n\t\n        // 如果有多个返回值，应该返回一个对象供js使用\n       tx, err := db.Begin()\n       if err != nil {\n           return lib.MakeErrorValue(runtime, err)\n       }\n       return lib.MakeReturnValue(runtime, NewTx(runtime, tx))\n\t\t\n        // 动态参数\n       args := lib.GetAllArgs(\u0026call)\n       err := rows.Scan(args...)\n       \n        // go语言原生类型的传递\n        p0 := GetNativeType(runtime, \u0026call, 0)\n        if err, ok := p0.(error); ok {\n            return runtime.ToValue(os.IsNotExist(err))\n        }\n        panic(runtime.NewTypeError(\"p0 is not error type:%T\", p0))\n\n        // 注意函数签名的不同\n        func(call goja.FunctionCall) goja.Value {}\n        func(call goja.ConstructorCall) *Object {}\n```\n\n# docker\n```Dockerfile\nFROM scratch\nCOPY . /\nEXPOSE 8080\nCMD [ \"/go-server-js\" ]\n```\n```sh\n$ docker pull zengming00/go-server-js\n$ docker run -d --rm -p 80:8080 zengming00/go-server-js\n```\n\n# docker 编译 mips 环境\ndocker pull zengming00/golang-mips\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzengming00%2Fgo-server-js","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzengming00%2Fgo-server-js","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzengming00%2Fgo-server-js/lists"}