HarlonWang / quickjs-wrapper

QuickJS wrapper for Android/JVM

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

ModuleLoader 加载ByteCode后的模块那么路径就会有问题

18si opened this issue · comments

commented

module_a.js

export function name(){ }

module_b.js

import name from "./module_a.js"

export function name(){ return name() }

然后用 qjsc 编译得到 a 和 b 的 ByteCode。
加载 模块

context.setModuleLoader(new ModuleLoader() {
     @Override
     public boolean isBytecodeMode() {
         return true;
     }

     @Override
     public String getModuleStringCode(String moduleName) {
         return Es6ModuleLoader.get().getModuleStringCode(moduleName);
     }

     @Override
     public byte[] getModuleBytecode(String moduleName) {
		//这里 moduleName 都是相对路径
		//module_a.js  是 http://……/module_a.js 正确
		//module_b.js 是 ./module_b.js 这里就变成了相对路径了、由于没有 base_module_name 所以没有办法合并路径了
     }
});
context.evaluateModule("import * as all from 'http://……/module_a.js'")

没太明白你的问题是什么?或者再描述下你的诉求是什么吗?moduleName 是根据 import 里的路径进行返回的,路径填的是什么,返回的就是什么,你说的合并路径和 base_module_name 指的是什么呢,可以再解释下不

commented

就是 直接使用 qjsc.exe 编译得到字节码,里面的路径都是相对路径。

getModuleBytecode 返回的ByteCode也全部都是相对路径,就导致加载失败了。

只有用 context.compileModule() 编译才能加载

以前旧版本有一个 convertModuleName 来处理模块路径问题,现在新版本没有了。能否加上 convertModuleName 自己处理路径?

以前 ModuleLoader 实现有问题,会导致 moudule 代码重复执行,所以就重构了下,顺带把 convertMouduleName 也去掉了,你可以把之前的 convertMouduleName 逻辑拿过来,放在 getBytecode 方法里执行,不过我不确定那个 baseModuleName 是否有用,你之前有需要用到这个吗?如果没有用到,那就没什么问题。

commented

baseModuleName 有用到,import "http://.../module_a.js" ,a里面 import ./module_b.js`
如果有 baseModuleName 就可以 resolve 两个url 了。

好的,明天我看一下以前的逻辑

baseModuleName 的获取我在 ModuleLoader 加上了,转换的逻辑你可以把之前的 convertModuleName 方法拿过来。

    /**
     * 该方法返回结果会作为 moduleName 参数给到 {@link #getModuleBytecode(String)}
     * 或者 {@link #getModuleStringCode(String)} 中使用,默认返回 moduleName。
     * 一般可以在这里对模块名称进行转换处理。
     * @param baseModuleName 使用 Import 的所在模块名称
     * @param moduleName 需要加载的模块名称
     * @return 模块名称
     */
    public String moduleNormalizeName(String baseModuleName, String moduleName) {
        return moduleName;
    }

版本我也发布了,可以用这个 0.22.2-beta,不过因为 maven 仓库更新有延迟,你可以晚点试下

commented

ok 收到

commented

👍 测试ok了