Hello everyone, in this article, I would like to outline some knowledge about Svelte as well as how to build a web app using Svelte.
TL; DR
For those who are lazy to read with good English and like “learn by doing”:
- All information and documents of Svelte, from basic to advanced are detailed instructions on the homepage: https://svelte.dev
- Study and practice: https://svelte.dev/tutorial
- Github repo: https://github.com/sveltejs/svelte
- Synthesis of relevant documents: https://svelte-community.netlify.app/resources
- Summary of good plugins included: https://github.com/rollup/plugins
1. General
Svelte , also known as SvelteJS, is a front-end JavaScript framework developed by Rich Harris aimed at building user interfaces quickly and easily. In essence, Svelte is a compiler , helping to compile specific syntax you write from Svelte to HTML, JS, and pure CSS at build time, helping to increase performance by reducing client-side processing steps.
1.1. Advantages
Less code
Doing software in general, and writing code in particular has some risks of bugs and bugs. Having to write a lot of code, you have to take a long time> your codebase gets big, maintain, handle errors takes a lot of time> you want to develop more cool features, optimize performance, learn more ants other awake or you want to spend time with friends, family, entertainments … you don’t have time. Therefore, the less code you have, the less bugs you have, or at least you find it easy to fix, you will have more time for activities other than just “fix bugs”. You are happy with the life of dev.
Don’t use the Virtual DOM
If you have been using popular libraries / frameworks such as React or Vue, you will probably be familiar with the concept of “Virtual DOM” as well as the word “Virtual DOM is incredibly fast”. . From the point of view of Rich Harris, the creator of Svelte, that using the Virtual DOM for user interface processing is not quite as fast as what we are mistaken. Therefore, Svelte does not use Virtual DOM but is purely a compiler that compiles your code into pure, zero dependency JS language. Your App will just be fast and fast.
Real Reactive
Tired of understanding the complex state management mechanisms in JavaScript frameworks / libraries? Svelte is your choice, Svelte takes JavaScript’s “reactivity” mechanism to a new level, extremely simple and easy to apply. You will be more and more passionate about code.
1.2. Familiar
Svelte’s syntax is recognized in components, with the extension .svelte
. Each component will consist of 3 clear parts:
1 2 3 4 5 6 7 8 9 10 | <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> script</span> <span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"> <span class="token comment">// JS code</span> </span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span> script</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> style</span> <span class="token punctuation">></span></span><span class="token style"><span class="token language-css"> <span class="token comment">/* CSS code */</span> </span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span> style</span> <span class="token punctuation">></span></span> <span class="token comment"><!-- HTML code --></span> |
<script>
contains the JS code you want to process in the component.<style>
contains CSS code for the makeup of the component (this CSS code will be within the scope of this component only).- The last part will be automatically recognized by the Svelte compiler as HTML tags.
Looks too familiar like when you first started web development, right? The interesting part is in the back.
1.3. The basic syntax
I go through some basic syntax of Svelte. In general, Svelte’s syntax is not too complex, if not simple. If you are familiar with HTML, CSS, JavaScript, and some of ES6’s syntax, you will quickly adapt.
Retrieve variables
1 2 3 4 5 6 | <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> script</span> <span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"> <span class="token keyword">let</span> name <span class="token operator">=</span> <span class="token string">"world"</span> <span class="token punctuation">;</span> </span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span> script</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> h1</span> <span class="token punctuation">></span></span> Hello {name}! <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> h1</span> <span class="token punctuation">></span></span> |
Declare the variable in the <script>
tag, in the HTML template, if you want to access it, you just need to enter the variable name in curly braces.
Retrieve the variable in the tag attribute
1 2 3 4 5 6 | <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> script</span> <span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"> <span class="token keyword">let</span> src <span class="token operator">=</span> <span class="token string">"image.gif"</span> <span class="token punctuation">;</span> </span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span> script</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> img</span> <span class="token attr-name">src</span> <span class="token attr-value"><span class="token punctuation">=</span> {src}</span> <span class="token attr-name">alt</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> Tên ảnh <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> |
Similarly, the syntax for accessing variables in tag attributes is used as above. If your variable has the same name as the property, you can write it down as follows:
1 2 | <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> img</span> <span class="token attr-name">{src}</span> <span class="token attr-name">alt</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> Tên ảnh <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> |
Import another component
1 2 3 4 5 6 7 | <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> script</span> <span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"> <span class="token keyword">import</span> Button <span class="token keyword">from</span> <span class="token string">"./Button.svelte"</span> <span class="token punctuation">;</span> </span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span> script</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> h1</span> <span class="token punctuation">></span></span> Ví dụ import <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> h1</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> Button</span> <span class="token punctuation">/></span></span> |
Reactivity – mechanism to respond to change
1 2 3 4 5 6 7 8 9 10 | <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> script</span> <span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"> <span class="token keyword">let</span> count <span class="token operator">=</span> <span class="token number">0</span> <span class="token punctuation">;</span> <span class="token keyword">function</span> <span class="token function">increase</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> count <span class="token operator">+=</span> <span class="token number">1</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">setInterval</span> <span class="token punctuation">(</span> increase <span class="token punctuation">,</span> <span class="token number">1000</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> </span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span> script</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> p</span> <span class="token punctuation">></span></span> Giá trị của count là: {count} <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> p</span> <span class="token punctuation">></span></span> |
With the above example, every 1 second, the variable count
will increase to 1. As you can see, with just the syntax of declaring and assigning the normal variable value, Svelte makes the “reactivity” mechanism extremely simple.
Creates props for the component
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | // Button.svelte <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> script</span> <span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"> <span class="token keyword">export</span> <span class="token keyword">let</span> text <span class="token operator">=</span> <span class="token string">"Gửi"</span> <span class="token punctuation">;</span> </span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span> script</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> button</span> <span class="token punctuation">></span></span> {text} <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> button</span> <span class="token punctuation">></span></span> // App.svelte <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> script</span> <span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"> <span class="token keyword">import</span> Button <span class="token keyword">from</span> <span class="token string">"./Button.svelte"</span> <span class="token punctuation">;</span> </span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span> script</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> Button</span> <span class="token attr-name">text</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> Hủy <span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span> |
With the export
keyword, other components can change the text
properties of the Button component.
DOM Events
1 2 3 4 5 6 7 8 9 10 | <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> script</span> <span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"> <span class="token keyword">let</span> count <span class="token operator">=</span> <span class="token number">0</span> <span class="token punctuation">;</span> <span class="token keyword">function</span> <span class="token function">handleClick</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> count <span class="token operator">+=</span> <span class="token number">1</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> </span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span> script</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> button</span> <span class="token attr-name"><span class="token namespace">on:</span> click</span> <span class="token attr-value"><span class="token punctuation">=</span> {handleClick}</span> <span class="token punctuation">></span></span> Đã nhấn {count} lần <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> button</span> <span class="token punctuation">></span></span> |
If pure JS you use onclick
to attach events, then Svelte just a little different is on:click
.
Conditional rendering
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> script</span> <span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"> <span class="token keyword">let</span> user <span class="token operator">=</span> <span class="token punctuation">{</span> loggedIn <span class="token operator">:</span> <span class="token boolean">false</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token keyword">function</span> <span class="token function">toggle</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> user <span class="token punctuation">.</span> loggedIn <span class="token operator">=</span> <span class="token operator">!</span> user <span class="token punctuation">.</span> loggedIn <span class="token punctuation">;</span> <span class="token punctuation">}</span> </span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span> script</span> <span class="token punctuation">></span></span> {#if user.loggedIn} <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> button</span> <span class="token attr-name"><span class="token namespace">on:</span> click</span> <span class="token attr-value"><span class="token punctuation">=</span> {toggle}</span> <span class="token punctuation">></span></span> Log out <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> button</span> <span class="token punctuation">></span></span> {:else} <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> button</span> <span class="token attr-name"><span class="token namespace">on:</span> click</span> <span class="token attr-value"><span class="token punctuation">=</span> {toggle}</span> <span class="token punctuation">></span></span> Log in <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> button</span> <span class="token punctuation">></span></span> {/if} |
With plain HTML, you cannot conditional rendering, but with Svelte you do. The syntax seems a bit weird, but it needs to be remembered.
Render data from array / list
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> script</span> <span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"> <span class="token keyword">let</span> tasks <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token string">"Dọn dẹp nhà cửa"</span> <span class="token punctuation">,</span> <span class="token string">"Cho gà ăn"</span> <span class="token punctuation">,</span> <span class="token string">"Tắm cho heo"</span> <span class="token punctuation">,</span> <span class="token string">"Code"</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> </span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span> script</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> h1</span> <span class="token punctuation">></span></span> Nhiệm vụ <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> h1</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> ul</span> <span class="token punctuation">></span></span> {#each tasks as task, index} <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> li</span> <span class="token punctuation">></span></span> Nhiệm vụ số {index + 1}: {task} <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> li</span> <span class="token punctuation">></span></span> {/each} <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> ul</span> <span class="token punctuation">></span></span> |
Svelte also supports rendering each element in an array / list.
Two-way binding
1 2 3 4 5 6 7 8 | <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> script</span> <span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"> <span class="token keyword">let</span> name <span class="token operator">=</span> <span class="token string">"world"</span> <span class="token punctuation">;</span> </span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span> script</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> input</span> <span class="token attr-name"><span class="token namespace">bind:</span> value</span> <span class="token attr-value"><span class="token punctuation">=</span> {name}</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> h1</span> <span class="token punctuation">></span></span> Hello {name}! <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> h1</span> <span class="token punctuation">></span></span> |
Two-way binding is also incredibly simple to Svelte.
Lifecycle (cycle of operation)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> script</span> <span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"> <span class="token keyword">import</span> <span class="token punctuation">{</span> onMount <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'svelte'</span> <span class="token punctuation">;</span> <span class="token keyword">let</span> data <span class="token punctuation">;</span> <span class="token function">onMount</span> <span class="token punctuation">(</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token function">fetch</span> <span class="token punctuation">(</span> <span class="token string">"https://someapi.com"</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">then</span> <span class="token punctuation">(</span> <span class="token parameter">res</span> <span class="token operator">=></span> res <span class="token punctuation">.</span> <span class="token function">json</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">then</span> <span class="token punctuation">(</span> <span class="token parameter">res</span> <span class="token operator">=></span> <span class="token punctuation">{</span> data <span class="token operator">=</span> res <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> </span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span> script</span> <span class="token punctuation">></span></span> {#if data} <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> p</span> <span class="token punctuation">></span></span> Dữ liệu đã fetch được: {data} <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> p</span> <span class="token punctuation">></span></span> {:else} <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> p</span> <span class="token punctuation">></span></span> Đang tải... <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> p</span> <span class="token punctuation">></span></span> {/if} |
The lifecycle of a component similar to React or Vue is also supported by Svelte. In addition to onMount
, there are onDestroy
, beforeUpdate
or afterUpdate
… Depending on the case, you can learn more to use.
2. Steps for building a web app
2.1. Prepare
- Computer, mouse, keyboard …
- Your favorite Code Editor (like Atom, VS Code, Sublime, Vim, …)
- CLI (like CMD or a built-in terminal if your code editor supports it)
- NodeJS (required to use npm)
2.2. Setup environment
Once fully prepared, enter CLI with the following commands:
1 2 3 4 5 6 | npx degit sveltejs/template MY-SVELTE-PROJECT cd MY-SVELTE-PROJECT npm install npm run dev |
Open a browser, go to http://localhost:5000
, you see the following screen:
So you have finished the setup and can start building web apps using Svelte
Let’s explain the above commands a bit
degit
is another tool developed by Rich Harris that allows you to copy all source code from a repository on Github to your directory. Specifically, here we are copying the source code of an available Svelte template down to our directory with the name MY-SVELTE-PROJECT
.
After copying is complete we move the path to the directory we just created, install the dependencies with npm install
and finally run the development environment with npm run dev
.
Directory structure
A Svelte template will have the following basic directory organization, depending on each project, you can organize the directory your way to the best fit.
Bottom up:
rollup.config.js
: Svelte uses a bundle tool called Rollup, and this is a file you can customize settings to bundle your source code.README.md
: Your project information file (for users to read) if you publish it to GitHubpackage.json
: Your project information file (for developers to read), also contains dependencies for developing and deploying your project..gitignore
: As the name suggests, this file to ignore files / folders that you do not want to commit to git.src
: Directory containing source codemain.js
:main.js
file of the whole web app. Note that if you change the filename, you need to reinstall accordingly inrollup.config.js
.App.svelte
: Component written in the syntax of Svelte.
scripts/setupTypeScript.js
: File to install TypeScript instead of JavaScript, run the commandnode scripts/setupTypeScript.js
to install.public
: Directory for deploy.
2.3. Build a simple desktop web app
After completing the preparation and installation of the dev environment, we proceed to build a web app, the simple topic we choose is a computer web app to apply some basic syntax of Svelte. Ok, let’s get started!
Layout, functionality
The structure is the same as above, I will only add 2 new components: Button.svelte
and Screen.svelte
.
Button.svelte
is each key pressed to handle computational operations.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> script</span> <span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"> <span class="token keyword">export</span> <span class="token keyword">let</span> key <span class="token punctuation">;</span> <span class="token keyword">export</span> <span class="token keyword">let</span> result <span class="token punctuation">;</span> <span class="token keyword">const</span> error <span class="token operator">=</span> <span class="token string">"Invalid input!"</span> <span class="token punctuation">;</span> <span class="token keyword">function</span> <span class="token function">replace</span> <span class="token punctuation">(</span> <span class="token parameter">value</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> value <span class="token punctuation">.</span> <span class="token function">replace</span> <span class="token punctuation">(</span> <span class="token string">"x"</span> <span class="token punctuation">,</span> <span class="token string">"*"</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">replace</span> <span class="token punctuation">(</span> <span class="token string">"÷"</span> <span class="token punctuation">,</span> <span class="token string">"/"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">function</span> <span class="token function">handleClick</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">switch</span> <span class="token punctuation">(</span> key <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">case</span> <span class="token string">"="</span> <span class="token operator">:</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> result <span class="token operator">=</span> <span class="token function">eval</span> <span class="token punctuation">(</span> <span class="token function">replace</span> <span class="token punctuation">(</span> result <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span> e <span class="token punctuation">)</span> <span class="token punctuation">{</span> result <span class="token operator">=</span> error <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">break</span> <span class="token punctuation">;</span> <span class="token keyword">case</span> <span class="token string">"C"</span> <span class="token operator">:</span> result <span class="token operator">=</span> <span class="token string">"0"</span> <span class="token punctuation">;</span> <span class="token keyword">break</span> <span class="token punctuation">;</span> <span class="token keyword">default</span> <span class="token operator">:</span> result <span class="token operator">=</span> result <span class="token operator">===</span> error <span class="token operator">||</span> result <span class="token operator">===</span> <span class="token string">"0"</span> <span class="token operator">?</span> key <span class="token operator">:</span> result <span class="token operator">+</span> key <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span> script</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> button</span> <span class="token attr-name"><span class="token namespace">on:</span> click</span> <span class="token attr-value"><span class="token punctuation">=</span> {handleClick}</span> <span class="token punctuation">></span></span> {key} <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> button</span> <span class="token punctuation">></span></span> |
Screen.svelte
is the screen that displays the calculation results.
1 2 3 4 5 6 | <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> script</span> <span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"> <span class="token keyword">export</span> <span class="token keyword">let</span> result <span class="token punctuation">;</span> </span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span> script</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> div</span> <span class="token attr-name">class</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> screen <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> {result} <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> div</span> <span class="token punctuation">></span></span> |
Finally, in App.svelte
, I imported the above 2 components and displayed them as a complete computer
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> script</span> <span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"> <span class="token keyword">import</span> Screen <span class="token keyword">from</span> <span class="token string">"./Screen.svelte"</span> <span class="token punctuation">;</span> <span class="token keyword">import</span> Button <span class="token keyword">from</span> <span class="token string">"./Button.svelte"</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> rows <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token punctuation">[</span> <span class="token string">"7"</span> <span class="token punctuation">,</span> <span class="token string">"8"</span> <span class="token punctuation">,</span> <span class="token string">"9"</span> <span class="token punctuation">,</span> <span class="token string">"÷"</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> <span class="token punctuation">[</span> <span class="token string">"4"</span> <span class="token punctuation">,</span> <span class="token string">"5"</span> <span class="token punctuation">,</span> <span class="token string">"6"</span> <span class="token punctuation">,</span> <span class="token string">"x"</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> <span class="token punctuation">[</span> <span class="token string">"1"</span> <span class="token punctuation">,</span> <span class="token string">"2"</span> <span class="token punctuation">,</span> <span class="token string">"3"</span> <span class="token punctuation">,</span> <span class="token string">"-"</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> <span class="token punctuation">[</span> <span class="token string">"0"</span> <span class="token punctuation">,</span> <span class="token string">"C"</span> <span class="token punctuation">,</span> <span class="token string">"="</span> <span class="token punctuation">,</span> <span class="token string">"+"</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> <span class="token keyword">let</span> result <span class="token operator">=</span> <span class="token string">""</span> <span class="token punctuation">;</span> </span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span> script</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> main</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> Screen</span> <span class="token attr-name">{result}</span> <span class="token punctuation">/></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> div</span> <span class="token attr-name">class</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> keys <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> {#each rows as row} <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> div</span> <span class="token attr-name">class</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> row <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> {#each row as key} <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> Button</span> <span class="token attr-name">{key}</span> <span class="token attr-name"><span class="token namespace">bind:</span> result</span> <span class="token punctuation">/></span></span> {/each} <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> div</span> <span class="token punctuation">></span></span> {/each} <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> div</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> main</span> <span class="token punctuation">></span></span> |
As a result, you will have a computer with a primitive shape as shown:
Make up
The next step is to make up and beautify the computer styles. Here I choose neumorphism and style according to each component. In the end, the computer will have a nose as shown:
2.4. Build and deploy
After you are satisfied with the computer, you build the source code with the command npm run build
. The entire source code will then be minified again, helping to reduce the size, while the livereload mechanism will also be turned off. To deploy, just throw the entire public
directory on the host is complete.
Note : when deploying to the host, you need to check the relative paths in
index.html
. For example, when I deploy to Github Pages, I have to put the<base href>
tag on top, and remove all the/
at the top of the paths to JS, CSS files.
- Full repository for your reference: https://github.com/khang-nd/calculator-svelte .
- Result Page: https://khang-nd.github.io/calculator-svelte
3. Conclusion
Svelte is still a new framework, job offers are not many and the community of users is not large, but Svelte is a potential rookie, able to thrive and be widely used in the future. Currently, I should just dabble and do a few pet projects or personal projects to learn and enjoy the passion of code. If you intend to use it for a large project, you should consider it.
So I have generalized some basic knowledge about Svelte that I know, hope the article helps everyone.