flecks/website/docs/creating-a-fleck.mdx

175 lines
5.0 KiB
Plaintext
Raw Normal View History

2023-12-31 16:23:28 -06:00
---
title: Creating a fleck
description: A fleck is a module but also so much more.
---
2024-01-03 16:14:01 -06:00
import Create from '@site/helpers/create';
2023-12-31 16:23:28 -06:00
If you are following along from the previous getting started
[configuration page](./configuration), you have an application with 3 flecks:
- `@flecks/core`
- `@flecks/server`
- `@flecks/web`
<details>
<summary>About that "3 flecks" thing...</summary>
2024-01-04 03:23:04 -06:00
Actually, your server application has 6 flecks at this point:
2023-12-31 16:23:28 -06:00
- `@flecks/core`
- `@flecks/core/server`
- `@flecks/server`
- `@flecks/server/server`
- `@flecks/web`
- `@flecks/web/server`
flecks will load the `[...]/server` fleck under any fleck that is loaded on the server. This is
also the case when using `@flecks/web` which will automatically load `[...]/client` flecks
which are only loaded in the browser. We'll be exploring this specifically in the next section.
If you're intersted in diving deeper, see [the platforms concept page](#todo).
Some frameworks make it a little cheesier to work with isomorphic code, but the flecks
philosophy is that visibility is believability: you'll have to be explicit about which code
runs where.
</details>
## Your first fleck
Let's make your website greet the user with a good ol' **hello world**.
2024-01-03 16:14:01 -06:00
To do this, you'll be creating your own little fleck. flecks also provides a built-in utility to
create a fleck.
2023-12-31 16:23:28 -06:00
2024-01-03 16:14:01 -06:00
:::note
2023-12-31 16:23:28 -06:00
2024-01-03 16:14:01 -06:00
You may have noticed that your little starter application has a `packages` directory. By default,
flecks structures your application as a monorepo.
This isn't any hard requirement, it's only a suggestion.
:::
2023-12-31 16:23:28 -06:00
2024-01-04 03:23:04 -06:00
### Create the fleck
2024-01-03 16:14:01 -06:00
Let's create our little fleck:
2023-12-31 16:23:28 -06:00
2024-01-03 16:14:01 -06:00
<Create type="fleck" pkg="say-hello" />
2024-01-04 03:23:04 -06:00
After some output, you'll find your new fleck at `packages/say-hello`. Let's inspect our
`build/flecks.yml`:
2023-12-31 16:23:28 -06:00
2024-01-04 03:23:04 -06:00
```yml title="build/flecks.yml"
2023-12-31 16:23:28 -06:00
'@flecks/core':
id: 'hello_world'
'@flecks/server': {}
'@flecks/web': {}
// highlight-next-line
2024-01-03 16:14:01 -06:00
'@hello-world/say-hello:./packages/say-hello/src': {}
2023-12-31 16:23:28 -06:00
```
### Aliasing for the win
Notice there's a colon separating the path for this one. This is because this is an
[aliased fleck](#todo). The part before the colon is the alias and the part after is the
path to the package.
2024-01-03 16:14:01 -06:00
By the way, your other application code can import using the alias (e.g.
`require('@hello-world/say-hello');`)
2023-12-31 16:23:28 -06:00
[as if it were a package](https://webpack.js.org/configuration/resolve/#resolvealias).
<details>
2024-01-04 03:23:04 -06:00
<summary>Wait, my modules don't have to be in <code>node_modules</code>?</summary>
2023-12-31 16:23:28 -06:00
2024-01-03 16:14:01 -06:00
Nope! When you're developing applications, it can be real nice to
2023-12-31 16:23:28 -06:00
just pull in local source "packages". If you're wondering how this works, see
[the alias concept page](#todo).
2024-01-04 03:23:04 -06:00
That being said, sharing your packages on npm is a cool thing to do, so be rad and share your
awesome flecks with the rest of us!
:::warning
2023-12-31 16:23:28 -06:00
You probably shouldn't do things like name an alias the same thing as a package that actually
2024-01-03 16:14:01 -06:00
exists in your `node_modules` directory. This is mitigated if you use the default monorepo
structure (unless your application name is identical to a monorepo organization that already
exists on `npm`: don't do that).
If you'd like to help define what happens in these edge cases you could
always [submit a pull request](https://github.com/cha0s/flecks/compare). :smile:
2023-12-31 16:23:28 -06:00
2024-01-04 03:23:04 -06:00
:::
2023-12-31 16:23:28 -06:00
</details>
2024-01-04 03:23:04 -06:00
### Your first hook
There is a source file at `packages/say-hello/src/index.js` but for now it's empty. Let's fill it
out a bit:
```javascript title="packages/say-hello/src/index.js"
exports.hooks = {
'@flecks/web/client.up': async () => {
window.document.body.append('hello world');
},
};
```
Now, restart your application and visit your website. Glorious, isn't it?
2023-12-31 16:23:28 -06:00
## Everything so far... plus Electron!
Let's add another core fleck. flecks ships with a core fleck `@flecks/electron`. This runs your
application inside of an instance of [Electron](https://www.electronjs.org/). You'll add the fleck:
2024-01-04 03:23:04 -06:00
```bash
npx flecks add @flecks/electron
```
2023-12-31 16:23:28 -06:00
2024-01-03 16:14:01 -06:00
Then you'll update your `build/flecks.yml` like so:
2023-12-31 16:23:28 -06:00
```yml
'@flecks/core':
id: 'hello_world'
'@flecks/electron': {}
2024-01-04 03:23:04 -06:00
// highlight-start
2023-12-31 16:23:28 -06:00
'@flecks/server':
up:
- '...'
- '@flecks/web'
- '@flecks/electron'
// highlight-end
'@flecks/web': {}
2024-01-03 16:14:01 -06:00
'@hello-world/say-hello:./packages/say-hello/src': {}
2023-12-31 16:23:28 -06:00
```
### ~~flecking~~ pecking order
2024-01-04 03:23:04 -06:00
We added some configuration to `@flecks/server`. The `up` key configures the order in which flecks
are initialized when the server comes up. We make sure `@flecks/web` serves a webpage before
`@flecks/electron` tries to visit it.
2024-01-03 16:14:01 -06:00
2024-01-04 03:23:04 -06:00
:::tip
`'...'` just means "everything else": if any other flecks implement that hook then they will run
here. It is valid to provide entries both before and after `'...'`.
The default configuration of
`@flecks/server.up` is simply:
```yml
'@flecks/server':
up:
- '...'
```
2024-01-03 16:14:01 -06:00
2024-01-04 03:23:04 -06:00
However in this case the order of hook execution is undefined. That's why we configure it
explicitly.
2024-01-03 16:14:01 -06:00
:::
2023-12-31 16:23:28 -06:00
2024-01-04 03:23:04 -06:00
Finally `npm start` and you will see something like this:
2023-12-31 16:23:28 -06:00
![An image of our simple hello world application running inside an Electron window](./flecks-electron.png)
2024-01-03 16:14:01 -06:00
Isn't it beautiful? :relieved: