goja 加载三方npm 模块
前边有简单介绍过关于goja require 加载三方模块的说明(只是简单的all-in-one 模式的)以下是基于node 实现制作包含依赖
文件
核心的技术
基于browserify&&babelify制作一个all-in-one 的js 文件,同时对于依赖的一些js 新特性基于babel 的es5处理,而且因为默认goja
没有包含console,所以添加了一个babel plugin移除console 的语句,注意没有使用bable7,而是使用了bable6
- package.json
{
"name": "gojs-requirejs-app",
"version": "1.0.0",
"main": "index.js",
"license": "MIT",
"dependencies": {
"babel-core": "^6.26.3",
"babel-plugin-transform-es2015-modules-umd": "^6.24.1",
"babel-plugin-transform-remove-console": "^6.9.4",
"babel-preset-es2015": "^6.24.1",
"babelify": "8",
"browserify": "^16.5.1",
"shortid": "^2.2.15"
},
"scripts": {
"start": "node app.js"
}
}
- app.js
demo 是一个shortid 的例子
var fs = require("fs");
var browserify = require("browserify");
let moduleName = "shortid"
browserify({ ignoreMissing: true, standalone: moduleName })
.transform(
"babelify", {
presets: ["babel-preset-es2015"],
plugins:["babel-plugin-transform-remove-console"],
compact:true
}
)
.require(require.resolve(moduleName),{ entry: true })
.bundle()
.pipe(fs.createWriteStream(`${moduleName}.js`));
goja 代码集成使用
原理与以前介绍的一样,go-bindata+init 添加全局对象
- 生成shortid.js
yarn && yarn start
- 生成go-bindata代码
go-bindata dalong.js app.js underscore-min.js shortid.js
- engine 加载shortid
package main
import (
"fmt"
"github.com/dop251/goja"
)
// MyVM myjvm
type MyVM struct {
jsRuntime *goja.Runtime
script string
}
func (vm *MyVM) init() {
vm.jsRuntime.Set("login", func(name, password string) string {
return fmt.Sprintf("%s-%s", name, password)
})
// load underscore for global user
m, _ := myrequire.Require("underscore-min.js")
vm.jsRuntime.Set("_", m)
shortid, _ := myrequire.Require("shortid.js")
vm.jsRuntime.Set("shortid", shortid)
}
// Exec script
func (vm *MyVM) Exec() (goja.Value, error) {
return vm.jsRuntime.RunString(vm.script)
}
- js 引用
var dalong = require("dalong.js")
var users = [
{
name:"dalong",
age:333
},
{
name:"rong",
age:22
},
{
name:"mydemo",
age:44
},
{
name: shortid.generate(),
age:80
}
]
var evens = _.filter(users, function(user){ return user.age % 2 == 0; });
module.exports = {
version:"v1",
type_info:"system",
token: dalong("dalong","demoapp"),
filteruser: JSON.stringify(evens),
id:shortid.generate(),
id2:shortid.generate()
}
- golang 代码使用
package main
import (
"fmt"
"log"
)
func main() {
value, _ := myvm.Exec()
fmt.Println(value)
m, err := myrequire.Require("app.js")
if err != nil {
log.Panic(err)
} else {
ob := m.ToObject(myvm.jsRuntime)
fmt.Println(ob.Get("filteruser").String())
fmt.Println(ob.Get("id").String())
fmt.Println(ob.Get("id2").String())
}
}
运行效果
- 命令
go run main.go init.go bindata.go myvm.go
- 效果
说明
以上是一个比较靠谱的方案,但是不能保证所有的依赖模块都是可以运行的(可能依赖特定nodejs 特性了)
参考资料
https://github.com/dop251/goja
https://github.com/rongfengliang/goja-require-learning
https://www.npmjs.com/package/browserify
https://www.npmjs.com/package/shortid
https://github.com/langateam/node-plv8
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
2017-06-29 keycloak 了解
2017-06-29 apiman 安装&&使用
2017-06-29 apiman 一个apigateway