You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

无法链接IntelliJ构建的Kotlin/JS项目生成的JS脚本求助

解决Kotlin JS编译后twf.stringToExpression is not a function错误

我明白你现在遇到的麻烦——明明Kotlin编译出来的JS文件里能找到目标函数,调用的时候却报“不是函数”的错,这种情况大多和Kotlin JS的导出机制、模块结构有关,我给你几个排查和解决的方向:

1. 确保Kotlin函数被正确导出到全局作用域

Kotlin JS默认不会把顶层函数直接暴露到模块的顶层对象,你需要用正确的注解确保它被导出:

  • 如果你用的是Kotlin 1.3及以上版本,推荐使用@JsExport注解,它能更可靠地将函数暴露到JS全局作用域。可以给整个文件添加注解,或者单独给函数加:
    // 给整个文件的顶层成员添加导出
    @file:JsExport
    package your.package.name
    
    // 或者单独给函数加@JsExport
    @JsExport
    @JsName("stringToExpression")
    fun stringToExpression(
        string: String,
        scope: Any? = null,
        isMathMl: Boolean? = null,
        functionConfiguration: Any? = null,
        compiledConfiguration: Any? = null
    ) {
        // 你的函数实现
    }
    
    注意:@JsName主要用来指定JS中的函数名,而@JsExport才是确保函数被暴露到模块顶层的关键,两者结合使用效果更稳定。

2. 检查Kotlin JS的编译配置

确保你的build配置生成的是适合浏览器环境的模块:

  • 如果是Gradle项目(build.gradle.kts),配置JS目标为浏览器,并指定生成可执行或库文件:
    kotlin {
        js {
            browser {
                commonWebpackConfig {
                    // 配置webpack,确保模块输出为全局变量
                    output.library = "twf"
                    output.libraryTarget = "umd"
                }
            }
            binaries.executable() // 如果是生成可执行脚本
            // 或者如果是作为库:binaries.library()
        }
    }
    
    这里的output.library = "twf"会确保编译后的JS模块以twf作为全局变量名暴露,libraryTarget = "umd"让它兼容多种模块系统(包括浏览器全局作用域)。

3. 排查twf对象的实际结构

有时候Kotlin JS编译后,顶层函数会被嵌套在twf.default或者其他属性下,你可以在Chrome控制台里手动检查:

  • 打开控制台,输入console.dir(twf),展开输出的对象,看看stringToExpression函数实际在哪个层级。
  • 如果函数在twf.default下,那么调用方式要改成:
    console.log(twf.default.stringToExpression(testTaskString));
    

4. 确保脚本执行时机正确

虽然你已经按顺序引入了kotlin.jstwf.js,但如果调用脚本在页面加载完成前执行,可能会出现函数未初始化的情况:

  • 把你的调用脚本放在</body>标签之前,或者用DOMContentLoaded事件包裹:
    document.addEventListener('DOMContentLoaded', function() {
        var testTaskString = "a-b/c";
        console.log(twf.stringToExpression(testTaskString));
    });
    
    这样能确保所有依赖脚本都加载解析完成后再调用函数。

内容的提问来源于stack exchange,提问作者kimi0601

火山引擎 最新活动