希望这比我做的要容易得多 - 我是一名 Java 程序员,一些内部 Javascript 方面对我来说有点陌生。
尝试将出色的 CodeJar 库嵌入到 GWT 面板中。 CodeJar 有一个非常漂亮/简单的示例:
<script type="module">
import {CodeJar} from './codejar.js'
import {withLineNumbers} from './linenumbers.js';
const editor = document.querySelector('.editor')
const highlight = editor => {
// highlight.js does not trim old tags,
// let's do it by this hack.
editor.textContent = editor.textContent
hljs.highlightBlock(editor)
}
const jar = CodeJar(editor, withLineNumbers(highlight), {
indentOn: /[(\[{]$/
})
jar.updateCode(localStorage.getItem('code'))
jar.onUpdate(code => {
localStorage.setItem('code', code)
})
</script>
模块函数本身如下所示:
export function CodeJar(editor, highlight, opt = {}) { ... }
'editor'是一个Div引用,'highlight'是一个回调库函数,用于处理代码高亮。
我正在处理的是 JsInterop 标记和代码,以使 Javascript 模块与 GWT 一起工作。以上有几个方面是我正在努力解决的
要加载脚本并使其可用于 GWT 使用,您(至少)有 3 种可能性:
import
中使用静态 <script type=module>
,然后将 CodeJar
函数分配给 window
属性以使其全局可用(实际上可能是另一个 window
对象)使用 GWT 中的动态 import()
window.CodeJar
HTMLElement
,但
com.google.gwt.dom.client.Element
也可以工作):
@JsType(isNative = true, namespace = JsPackage.GLOBAL, name = "?")
interface CodeJar {
@JsMethod(namespace = JsPackage.GLOBAL, name = "CodeJar")
static native CodeJar newInstance(HTMLElement element, HighlightFn highlight);
@JsMethod(namespace = JsPackage.GLOBAL, name = "CodeJar")
static native CodeJar newInstance(HTMLElement element, HighlightFn highlight, Options opts);
void updateOptions(Options options);
void updateCode(String code);
void onUpdate(UpdateFn cb);
void destroy();
}
@JsType(isNative = true, namespace = JsPackage.GLOBAL, name = "Object")
class Options {
public String tab;
public JsRegExp indentOn;
public boolean spellcheck;
public boolean addClosing;
}
@JsFunction
@FunctionalInterface
interface HighlightFn {
void highlight(HTMLElement e);
}
@JsFunction
@FunctionalInterface
interface UpdateFn {
void onUpdate(String code);
}
使用上面的代码,您应该能够使用以下内容创建编辑器:CodeJar jar = CodeJar.newInstance(editor, MyHighlighter::highlight);
如果您使用动态
import()
,请将静态方法替换为 @JsType
接口中代表从 Promise 接收的模块的实例方法。@Thomas 有机会扩展如何使用 JsInterop 实现动态 import() 吗?