• 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

  • 相关阅读:
    《计算机图形学》学习笔记 0
    最全面的百度地图JavaScript离线版开发
    android 中文api
    SQL Compare数据库比较工具 完全破解+使用教程
    Android系统自带样式(android:theme)
    android studio 导入第三方库的记录
    web在线打印,打印阅览,打印维护,打印设计
    Oracle如何实现跨库查询
    WPF自适应窗体实现小结
    【转】WCF OpenTimeout, CloseTimeout, SendTimeout, ReceiveTimeout
  • 原文地址:https://www.cnblogs.com/rongfengliang/p/13210437.html
Copyright © 2020-2023  润新知