• 使用rollup 转换commonjs 模块为es6 模块,方便的支持graalvm 模块兼容


    graalvm 是直接支持es6模块的,以前有写过基于require 模块模式的npm包加载处理(jvm-npm)以下是我们
    基于rollup 转换comomjs 模块为es6 模块,方便的扩展java 的能力

    场景说明

    npm 包含了一个很不错的json-mask 包,但是我们希望java可以直接集成使用,所以我们希望使用java 的graalvm js 引擎处理

    集成说明

    因为graalvm直接支持es6模块,我们直接使用es6模块就可以了,但是因为json-mask 是commonjs 模块的,我们需要一种机制进行转换
    rollup 是一个不错的选择

    转换json-mask 为es6 模块

    • 项目结构
     
    ├── mymask.js
    ├── package.json
    ├── rollup.config.js
    └── yarn.lock
    • package.json
    {
      "name": "p",
      "version": "1.0.0",
      "main": "index.js",
      "license": "MIT",
      "devDependencies": {
        "@babel/preset-env": "^7.11.0",
        "@babel/core": "^7.11.4",
        "@rollup/plugin-commonjs": "^15.0.0",
        "@rollup/plugin-node-resolve": "^9.0.0",
        "rollup": "^2.26.8",
        "@rollup/plugin-babel": "^5.2.0"
      },
      "scripts": {
        "demoapp": "rollup -c rollup.config.js "
      },
      "dependencies": {
        "json-mask": "^1.0.1"
      }
    }
    • rollup.config.js
    import commonjs from '@rollup/plugin-commonjs';
    import resolve from '@rollup/plugin-node-resolve';
    import { getBabelOutputPlugin } from '@rollup/plugin-babel';
    export default {
        input: 'mymask.js',
        output: [{
            dir: 'app',
            format: 'es',
            plugins: [getBabelOutputPlugin({ presets: ['@babel/preset-env'] })]
        }],
        plugins: [resolve(), commonjs()]
    };
    • mymask.js
    const mask = require("json-mask")
    module.exports = {
        maskfn: function (datas, fields) {
            return mask(datas, fields)
        }
    }

    java 集成

    • 项目结构

    • 代码集成
        Engine engine = Engine.newBuilder().option("js.load-from-url","true").allowExperimentalOptions(true).build();
        public static  void es6Rollup(Engine engine) throws IOException {
            Context context = Context.newBuilder().allowAllAccess(true).allowHostClassLoading(true).allowIO(true).allowNativeAccess(true).engine(engine).build();
            Source mysource = Source.newBuilder("js","import  mymask  from "src/main/resources/mymask.js"
    " +
                    "var fields = 'url,object(content,attachments/url)';
    " +
                    "var originalObj = {
    " +
                    "    id: 'z12gtjhq3qn2xxl2o224exwiqruvtda0i',
    " +
                    "    url: 'https://plus.google.com/102817283354809142195/posts/F97fqZwJESL',
    " +
                    "    object: {
    " +
                    "        objectType: 'note',
    " +
                    "        content:
    " +
                    "            'A picture... of a space ship... launched from earth 40 years ago.',
    " +
                    "        attachments: [
    " +
                    "            {
    " +
                    "                objectType: 'image',
    " +
                    "                url: 'http://apod.nasa.gov/apod/ap110908.html',
    " +
                    "                image: { height: 284,  506 }
    " +
                    "            }
    " +
                    "        ]
    " +
                    "    },
    " +
                    "    provider: { title: 'Google+' }
    " +
                    "};
    " +
                    "
    " +
                    "console.log(JSON.stringify(mymask.maskfn(originalObj,fields)));","utf-8").mimeType("application/javascript+module").build();
            context.eval(mysource);
        }
    • 运行效果

    说明

    一些额外的说明,nginx 的njs 也是支持js ,但是目前在js 的兼容上不是很好,有些特性是不支持的,还是有待提升的,graalvm 就很不错了

    参考资料

    https://github.com/rollup/plugins/tree/master/packages/commonjs
    https://github.com/graalvm/graaljs/blob/master/docs/user/JavaScriptCompatibility.md
    https://www.cnblogs.com/rongfengliang/p/13582315.html
    https://github.com/nemtsov/json-mask

  • 相关阅读:
    HDOJ骨头的诱惑
    DP Big Event in HDU
    hoj1078
    poj2728
    hoj1195
    poj2739
    poj2726
    海量并发也没那么可怕,运维准点下班全靠它!
    云上安全工作乱如麻,等保2.0来一下
    实践案例丨教你一键构建部署发布前端和Node.js服务
  • 原文地址:https://www.cnblogs.com/rongfengliang/p/13584488.html
Copyright © 2020-2023  润新知