Sapperアプリケーションにaceエディター( https://ace.c9.io/ )をロードしようとしています。 Sapperルートにロードしたときにスクリプトタグに正常にロードされましたが、ルートによって再度レンダリングされるSvelteコンポーネントで同じことを実行しようとすると、エラーが発生します。
エースは定義されていません
これは私が持っているコードであり、Sapperルートであれば問題なく機能します。
<div id="editor"> def main():
return sum(range(1,100))
</div>
<script src="https://pagecdn.io/lib/ace/1.4.6/ace.js" type="text/javascript" charset="utf-8"></script>
<script>
var editor = ace.edit("editor");
editor.setTheme("ace/theme/monokai");
editor.session.setMode("ace/mode/python");
editor.resize()
</script>
最初にSvelte2を使い始めたときに、コンポーネントをハッキングして外部のレガシーJSライブラリをロードし、それをSvelte 3にリファクタリングしました。
// LibLoader.svelte
<svelte:head>
<script bind:this={script} src={url} />
</svelte:head>
<script>
import { onMount, createEventDispatcher } from 'svelte';
const dispatch = createEventDispatcher();
export let url;
let script;
onMount(async () => {
script.addEventListener('load', () => {
dispatch('loaded');
})
script.addEventListener('error', (event) => {
console.error("something went wrong", event);
dispatch('error');
});
});
</script>
// MyComponent.svelte
<LibLoader url="myExternalLib.js"
on:loaded="{onLoaded}" />
<script>
import LibLoader from './LibLoader.svelte';
function onLoaded() {
myExternalLib.doStuff();
}
</script>
これは完全にはテストされていません。1回限りの場合は、おそらく別のコンポーネントを保証するものではありません。しかし基本的には、このアプローチはRich Harrisが言及するタイミングの問題を回避します。最近のimport
は、利用可能な場合は明らかに優れたオプションです。