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

摘要:
Graalum直接支持es6模块。我们之前已经基于require模块模式编写了npm包加载过程(jvm-npm)。下面是我们如何基于回滚将comomjs模块转换为es6模块。方便扩展java功能的场景表明,npm包含一个非常好的json掩码包,但我们希望java可以直接集成,所以我们希望使用java的grailvm-js引擎来处理集成指令。因为grailvm直接支持es6模块,所以我们直接使用e

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 集成

  • 项目结构

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

  • 代码集成
    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);
    }
  • 运行效果

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

说明

一些额外的说明,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

免责声明:文章转载自《使用rollup 转换commonjs 模块为es6 模块,方便的支持graalvm 模块兼容》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Linux菜鸟入门级命令大全前端规范标准-切片下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

前端模块化详解(完整版)

前言 在JavaScript发展初期就是为了实现简单的页面交互逻辑,寥寥数语即可;如今CPU、浏览器性能得到了极大的提升,很多页面逻辑迁移到了客户端(表单验证等),随着web2.0时代的到来,Ajax技术得到广泛应用,jQuery等前端库层出不穷,前端代码日益膨胀,此时在JS方面就会考虑使用模块化规范去管理。本文内容主要有理解模块化,为什么要模块化,模块化...

深入 CommonJs 与 ES6 Module

目前主流的模块规范 UMD CommonJs es6 module umd 模块(通用模块) (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? module.exports =...

javascript 模块化开发(一)

什么是模块化 将一组模块(及其依赖项)以正确的顺序拼接到一个文件(或一组文件)中的过程。 传统的模块化做法。 模块是实现特定功能的一组属性和方法的封装。 将模块写成一个对象,所有的模块成员都放到这个对象里面。 var module1 = new Object({ _count:0, f1:function(){}, f2:function(){...