Click me!
```
Here’s the same thing with the concise syntax:
```marko
// Count our clicks!
div.count
p -- Count: ${state.count}
button.example-button on-click('increment') -- Click me!
```
Can’t make up your mind or just want to paste in that code snippet from
StackOverflow? HTML syntax can be used within in the concise syntax. You’ll come
back and make it consistent…_one day_.
#### 5. Import JavaScript modules
Do you have some helper JavaScript functions that you need to use in your views?
Marko lets you import any JavaScript module into your template using the same
syntax as the JavaScript `import` statement without using Babel or any other
build tool. No need for problematic globals (you could do that too, but please
don’t or your coworkers will hate you).
```marko
import sum from './utils/sum';
The sum of 2 + 3 is ${sum(2, 3)}
```
#### 6. No need to import custom tags (it’s a good thing, trust me)
Marko uses your directory structure as a method for automatically registering
custom tags. This means that Marko can implicitly import tags based on where the
template is located on disk. Marko will search up the directory looking for
custom tags in `components/`directories similar to how Node.js discovers modules
in `node_modules/` directories.
Given the following directory structure:
```
components/
fancy-button/
index.marko
fancy-container/
index.marko
```
If `fancy-button` is used inside of `fancy-container`, it will be implicitly
imported:
```marko
```
#### 7. Use JavaScript to set CSS classes and styles
Setting CSS classes and styles is made easy using JavaScript! Marko will happily
accept simple strings, JavaScript objects and arrays (_falsy values will be
ignored)._
```marko
$ const fontColor = input.color || 'blue';
$ const isActive = input.active === true;
```
#### 8. Inline JavaScript Statements
Marko takes HTML and makes it more like JavaScript. You can exit out of HTML
mode to embed a JavaScript statement by starting the line with a `$`. You can
use this feature to embed JavaScript variables, functions, etc. where they are
needed (take that, “separation of concerns”).
```marko
$ const randomNumber = Math.random();
$ const person = {
name: 'Frank',
age: 32
};
Random number: ${randomNumber}
${person.name} is ${person.age} years old
```
If you want to combine multiple JavaScript statements you can do that too:
```marko
$ {
const randomNumber = Math.random();
const person = {
name: 'Frank',
age: 32
};
}
Random number: ${randomNumber}
${person.name} is ${person.age} years old
```
#### 9. Async rendering with the `` tag
Node.js is asynchronous. Browsers are asynchronous. Why should rendering be
synchronous? Pass your promise along to your template and Marko will
asynchronously render parts of your view. Turns out, [this is good for
performance](https://tech.ebayinc.com/engineering/async-fragments-rediscovering-progressive-html-rendering-with-marko/).
```marko
$ const searchResultsPromise = searchService.performSearch(keywords);
<@then|person|>
Hello ${person.name}!
@then>
<@catch|err|>
The error was: ${err.message}.
@catch>
```
#### 10. Server side rendering is easy
Can’t decide if you want to do server-side rendering or client-side rendering?
Why are we even talking about this in 2017? It doesn’t matter. Seriously, just
do both. Marko makes this a no-brainer since you can render a Marko template
directly to a stream (oh, and Marko will automatically mount UI
components rendered on the server when the page loads in the browser):
```js
require("@marko/compiler/register"); // require .marko files!
const http = require("http");
const template = require("./template");
http
.createServer()
.on("request", (req, res) => {
template.render(
{
name: "Frank",
count: 30,
colors: ["red", "green", "blue"],
},
res,
);
})
.listen(8080);
```
#### Bonus: Friendly compile-time errors
We all make mistakes _every now and then_. Typo in your custom tag? Forgot an
ending tag? No worries! Marko will give you a friendly error message and point
you right to the problematic code.
```marko
```
You may have missed it, but it was obvious to Marko:
```
Unrecognized tag: fancy-buttn — More details: https://github.com/marko-js/marko/wiki/Error:-Unrecognized-Tag at line 2 col 1
```
Coming soon: auto correction and autonomous coding
---
[_Cover image from Wikipedia_](https://commons.wikimedia.org/wiki/File:Amanhecer_no_Hercules_--.jpg)