我在昨天阅读文档时对Svelte非常感兴趣,但我很难设立一个非常基本的项目而且我似乎无法想象我做错了什么。
我开始使用以下HTML:
<!doctype html>
<html>
<head>
<title>My first Svelte app</title>
</head>
<body>
<main></main>
<script src='App.js'></script>
<script>
const application = new App({
target: document.querySelector( 'main' ),
data: {
name: 'world'
}
});
</script>
</body>
</html>
然后,我创建了以下App.html
组件:
<div class="app">Hello {{name}}</div>
<div class="lines"></div>
<script>
export default {}
</script>
我运行svelte compile --format iife App.html > App.js
,一切正常。
到目前为止,非常好!
现在,我创建了一个Line.html
组件,其中包含以下内容:
<div class="line">{{value}}</div>
<script>
export default {}
</script>
我修改了我的App.html
组件:
<div class="app">Hello {{name}}</div>
<div class="lines"></div>
<script>
import Line from './Line.html';
export default {
oncreate() {
const line = new Line({
target: document.querySelector( 'lines' ),
data: {
value: 'test'
}
});
}
}
</script>
我希望这段代码能够像<div class="line">test</div>
的孩子一样向DOM添加类似<div class="lines"></div>
的内容。
但是,编译此代码时会收到以下警告:
No name was supplied for imported module './Line.html'.
Guessing 'Line', but you should use options.globals
当我尝试运行已编译的代码时,我只是在我的控制台中获得以下输出:
App.js:250 Uncaught ReferenceError: Line is not defined at App.js:250
index.html:10 Uncaught TypeError: App is not a constructor at index.html:10
我在这里做错了什么?
我也提出了这个问题on Github。
答案 0 :(得分:2)
从GitHub复制答案:
svelte-cli
适用于单个文件 - 您需要单独编译Line.html
,并将其包含在页面中,如下所示:
<!doctype html>
<html>
<head>
<title>My first Svelte app</title>
</head>
<body>
<main></main>
<script src='Line.js'></script> <!-- one for each component! -->
<script src='App.js'></script>
<script>
const application = new App({
target: document.querySelector( 'main' ),
data: {
name: 'world'
}
});
</script>
</body>
</html>
它会猜测Line.js
正在定义一个名为Line
的全局变量,这是App.js
能够引用它的方式 - 但它更喜欢你明确的,通过使用--globals
选项。
毋庸置疑,这是一个巨大的痛苦 - 它在任何时候都不会扩展。因此,我们建议您使用集成了Svelte的构建工具。这样,您不必担心处理所有不同的导入文件,并且作为奖励,Svelte能够生成更紧凑的代码(因为它可以在组件之间重复删除一些辅助函数)。
最简单的入门方式 - 我一直想写一篇关于此事的非常简短的博文 - 就是点击REPL中的“下载”按钮。这将为您提供一个基本的项目设置,您可以使用npm run dev
和npm start
运行该设置。在引擎盖下,它使用Rollup创建一个可以在浏览器中运行的包。
Here's your test app running in the REPL。请注意,我们使用<Line>
组件的方式是使用components
声明它,并将其写入模板,而不是使用oncreate
手动实例化。