【问题标题】:Svelte not including computed properties in bundle. No errors are producedSvelte 不包括 bundle 中的计算属性。不产生错误
【发布时间】:2018-12-26 09:32:35
【问题描述】:

我正在使用Svelte computed properties example。具体来说,我正在复制示例:

在 Works.html 中

<h1>{hours}</h1>

在我的 JS 中

const workViewer = new WorkViewer({
    target: document.querySelector('.works-wrapper'),
    data: function(){
        return {
            time: new Date()
        }
    },
    computed: {
        hours: ({ time }) => time.getHours()
    }
});

Rollup 编译我的 Svelte 包没有错误:

rollup v0.58.2
bundles public/js/index.js → public\js\bundle.js...
created public\js\bundle.js in 668ms

[2018-07-18 13:39:37] waiting for changes...

但是,在浏览器中,生成的模块缺少所有计算机属性。例如,hours

中提到的完全一样
<Works> was created without expected data property 'hours' bundle.js:12488:34

为什么计算属性没有包含在包中?

我怎样才能使它包含在捆绑包中?

【问题讨论】:

  • 那是完整的组件源代码吗? data 应该是一个返回对象的函数,而不是对象本身——上面的代码应该是cause a compile error
  • @RichHarris 将数据设为对象不会返回编译错误。我已经将data 调整为一个函数,并编辑了上面的代码(仍然导致同样的错误)

标签: javascript computed-properties svelte


【解决方案1】:

计算属性必须是组件定义的一部分,而不是实例化选项——即像这样:

{hours}

<script>
  export default {
    data() {
      return { time: new Date() }
    },
    computed: {
      hours: ({ time }) => time.getHours()
    }
  };
</script>

Svelte 确定哪些计算属性依赖于哪些其他属性,并生成代码(在对它们进行拓扑排序之后,在一个计算属性依赖于另一个计算属性的情况下),该代码可以尽可能少地重新计算值。这只有在编译时才有可能,这就是为什么它必须是编译器输入的一部分,而不是运行时选项。

我之前没有意识到这些是初始化选项——在这种情况下,数据一个对象,而不是一个用于生成默认数据的函数。在这方面它就像 Ractive。

【讨论】:

  • 我可以在 JS 中定义我的组件(即,在 HTML 所在的位置之外),就像我在使用 Ractive 时在 new Ractive() 中所做的那样?还是模板和 JS 都必须存在于 .html 文件中?我 /swear/ 我看到了导入 HTML 并使用它创建组件的示例。
  • 等等,我非常困惑:svelte.technology/guide#understanding-svelte-components 的示例显示 data 作为实例化选项的一部分 - 为什么 computed 不行?
  • 不,组件必须始终在 .html 文件中定义,SFC 样式。 Svelte 的全部意义在于它在编译时做了大量工作,因此它不必在运行时做这些工作——为此,它需要以可预测的形式编写组件。它不会编译任意 JavaScript
猜你喜欢
  • 2019-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多