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

posted on 2020-06-29 21:26  荣锋亮  阅读(1073)  评论(0编辑  收藏  举报

导航