ReferenceError:文档未在 Svelte 3 中定义

Posted

技术标签:

【中文标题】ReferenceError:文档未在 Svelte 3 中定义【英文标题】:ReferenceError: document is not defined in Svelte 3 【发布时间】:2019-10-04 10:25:44 【问题描述】:

我正在尝试在 <script> 中手动 document.createElement 然后在 appendChildaudio 中每次调用 eventListener 来替换它。 在浏览器中一切正常,除了一个页面加载时非常快的错误,但持续时间少于 100 毫秒。终端也有错误

ReferenceError: document is not defined
    at Object (webpack:///./src/components/Record/Component.svelte?:26:17)

似乎在文档尚未准备好时调用了上述内容,但之后就可以了,如何解决?或者在 Svelte 世界 (Sapper) 中销毁和重新创建组件的首选方法是什么?

【问题讨论】:

【参考方案1】:

感谢Rutuja's answer here,我也能够让我的应用程序正常工作。添加到 Rutuja 的答案中,如果有人在使用 Sapper + Svelte + 另一个包(在我的情况下为 theme.js)时遇到此问题,您可能还需要导入多个组件。这在Mozilla's documentation here for import 中有描述。

当使用动态导入导入默认导出时,它会起作用 不同。您需要解构并重命名“默认”键 返回的对象。

(async () => 
  if (somethingIsTrue) 
    const  default: myDefault, foo, bar  = await import('/modules/my-module.js');
  
)();

对于我自己的项目(使用theme.js),我必须使用以下逻辑(基于位于here 的theme.js 的精简示例):

const themeState = 
    active: undefined,
    selected: undefined,
    themes: [],


onMount(async () => 
    const  default: Themer, auto, system  = await import('themer.js')

    themeState = 
        active: undefined,
        selected: light,
        themes: [light, dark, auto, system],
    

    const themer = new Themer(
        debug: true,
        onUpdate: (theme) => (themeState.active = theme),
        themes:  light, dark, auto, system ,
    )

    function noThemeSupport( theme ) 
        return theme === 'system' && !themer.themeSupportCheck()
    

    function setTheme(theme) 
        themeState.selected = theme
        themer.set(theme)
    

    themer.set(themeState.selected)
)

【讨论】:

【参考方案2】:

Sapper 可以很好地与您可能遇到的大多数第三方库配合使用。但是,有时,第三方库的捆绑方式允许它与多个不同的模块加载器一起工作。有时,这段代码会创建对 window 的依赖,例如检查 window.global 是否存在。

由于像 Sapper 的服务器端环境中没有窗口,简单地导入这样一个模块的动作可能会导致导入失败,并终止 Sapper 的服务器并出现如下错误:

ReferenceError: 未定义窗口

解决此问题的方法是从 onMount 函数(仅在客户端调用)中为您的组件使用动态导入,这样您的导入代码就不会在服务器上调用。

<script>
    import  onMount  from 'svelte';

    let MyComponent;

    onMount(async () => 
        const module = await import('my-non-s-s-r-component');
        MyComponent = module.default;
    );
</script>

<svelte:component this=MyComponent foo="bar"/>

【讨论】:

【参考方案3】:

document 未在服务器上定义,因此您需要在组件中防范它,以便特定代码仅在浏览器中运行。

您可以使用onMount 函数,该函数仅在组件渲染后在浏览器中运行。

<script>
  import  onMount  from 'svelte';

  onMount(() => 
    document.createElement(...);

    // ...
  );
</script>

【讨论】:

需要转换心态以记住最初这只是服务器的全部内容。

以上是关于ReferenceError:文档未在 Svelte 3 中定义的主要内容,如果未能解决你的问题,请参考以下文章

ReferenceError 'model' 未在 mongoose 中定义

ReferenceError: primordials 未在 node.js 中定义

ReferenceError:数据未在exports.action中定义

ReferenceError:FlatListItemSeparator 未在 React Native 中定义

UnhandledPromiseRejectionWarning:ReferenceError:TextEncoder 未在 NextJS 12 中定义

UnhandledPromiseRejectionWarning:ReferenceError:TextEncoder 未在 NextJS 12 中定义